【Java学习笔记】Arrays类
Arrays 类
1. 导入包:import java.util.Arrays
2. 常用方法一览表
方法 | 描述 |
---|---|
Arrays.toString() | 返回数组的字符串形式 |
Arrays.sort() | 排序(自然排序和定制排序) |
Arrays.binarySearch() | 通过二分搜索法进行查找(前提:数组是有序的) |
Arrays.copyOf() | 数组元素的复制 |
Arrays.fill() | 数组元素的填充 |
Arrays.equals() | 比较两个数组内容是否完全一致 |
Arrays.asList() | 将一维数组,转换成 List 集合 |
一、Arrays.toString()
优点:方便查看数组内容,避免了通过遍历来输出内容的繁琐
代码示例
import java.util.Arrays;
public class main {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6};System.out.println(Arrays.toString(arr));}
}// 输出结果
[1, 2, 3, 4, 5, 6]
二、Arrays.sort()
(重点!)
1. 自然排序(底层:快速排序)
import java.util.Arrays;
public class main {public static void main(String[] args) {int[] arr = {6,5,9,8,32,1,4};Arrays.sort(arr);System.out.println(Arrays.toString(arr));}
}// 输出结果
[1, 4, 5, 6, 8, 9, 32]
2. 定制排序
(1)引入接口:Comprator
(2)实现接口方法compare
-
注意:返回值是
int
类型 -
延申:如何处理小数?
-
(1)影响排序结果的本质:判断和 0 的大小关系
-
(2)创建一个临时变量保存差值结果,判断和 0 的大小关系来返回对应的值
-
大于 0:返回 1
-
小于 0:返回-1
-
等于 0:返回 0
-
-
(3)代码示例
1. 原先代码
Arrays.sort(integer_arr, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return 0;}
});
说明:当前还没有学习泛型,代码修改为如下形式
2. 修改后的代码
import java.util.Arrays;
import java.util.Comparator;public class main {public static void main(String[] args) {Integer[] integer_arr = {6,5,9,8,32,1,4};Arrays.sort(integer_arr, new Comparator() {@Overridepublic int compare(Object o1, Object o2) {Integer n1 = (Integer) o1;Integer n2 = (Integer) o2;return n1 - n2;}});System.out.println(Arrays.toString(integer_arr));}
}// 输出结果
[1, 4, 5, 6, 8, 9, 32]
代码说明
-
(1)使用自定义排序
-
1. 传入的参数为实现了
Comparator
接口的匿名内部类 -
2. 要求实现
compare()
方法-
注意:返回值是
int
类型
-
-
-
(2)去掉泛型部分:
<Integer>
,把compare
方法中的参数改为Object
,然后再方法中使用向下转型
三、实现定制排序的底层探究
1. 进入 sort 方法的底层源码
public static <T> void sort(T[] a, Comparator<? super T> c) {if (c == null) {sort(a);} else {if (LegacyMergeSort.userRequested)legacyMergeSort(a, c);elseTimSort.sort(a, 0, a.length, c, null, 0, 0);}
}
2. 进入 TimeSort 类的 sort 方法
static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c,T[] work, int workBase, int workLen) {assert c != null && a != null && lo >= 0 && lo <= hi && hi <= a.length;int nRemaining = hi - lo;if (nRemaining < 2)return; // Arrays of size 0 and 1 are always sorted// If array is small, do a "mini-TimSort" with no mergesif (nRemaining < MIN_MERGE) {int initRunLen = countRunAndMakeAscending(a, lo, hi, c);binarySort(a, lo, hi, lo + initRunLen, c);return;}
3. 进入binarrySort
方法
private static <T> void binarySort(T[] a, int lo, int hi, int start,Comparator<? super T> c) {assert lo <= start && start <= hi;if (start == lo)start++;for ( ; start < hi; start++) {T pivot = a[start];// Set left (and right) to the index where a[start] (pivot) belongsint left = lo;int right = start;assert left <= right;/** Invariants:* pivot >= all in [lo, left).* pivot < all in [right, start).*/while (left < right) {int mid = (left + right) >>> 1;if (c.compare(pivot, a[mid]) < 0)right = mid;elseleft = mid + 1;}assert left == right;
4. 本质:通过c.compare(pivot, a[mid])
的结果来影响排序结果
核心部分代码
while (left < right) {int mid = (left + right) >>> 1;if (c.compare(pivot, a[mid]) < 0)right = mid;elseleft = mid + 1;
}
总结
-
(1)
public int compare(Object o1, Object o2)
返回的值> 0
还是< 0
会影响整个排序的结果 -
(2)小于 0:从小到大排序
-
(3)大于 0:从大到小排序
四、Arrays.binarySearch()
二分查找方法(返回查找元素下标索引)
-
使用前提:数组是有序的
-
使用方法:Arrays.binarySearch(数组,查找元素)
注意点
-
若查找元素存在:返回下标索引
-
若查找元素不存在:返回
-(low + 1)
,low是应该插入的位置
底层源码
private static int binarySearch0(int[] a, int fromIndex, int toIndex,int key) {int low = fromIndex;int high = toIndex - 1;while (low <= high) {int mid = (low + high) >>> 1;int midVal = a[mid];if (midVal < key)low = mid + 1;else if (midVal > key)high = mid - 1;elsereturn mid; // key found}return -(low + 1); // key not found.
}
代码示例
import java.util.Arrays;public class main {public static void main(String[] args) {int[] arr = {1, 2, 3};System.out.println(Arrays.binarySearch(arr, 2));System.out.println(Arrays.binarySearch(arr, 10));}
}// 输出结果
1
-4
代码说明
查找的元素10
不存在,应该插入的位置为3
(下标索引),返回- (low + 1)
,即- (3 + 1)
,所以返回-4
五、Arrays.copyOf()
数组的拷贝
-
1. 使用方法:Arrays.copyOf(原数组,拷贝长度)
-
2. 注意点
-
(1)如果拷贝的长度大于原数组,会在新数组的后面增加
null
-
(2)如果拷贝长度小于 0,,会抛出异常
NegativeArraySizeException
-
代码示例
import java.util.Arrays;public class main {public static void main(String[] args) {int[] arr = {1, 2, 3};int[] new_arr = Arrays.copyOf(arr,arr.length);System.out.println("arr: " + Arrays.toString(arr));System.out.println("new_arr:" + Arrays.toString(new_arr));}
}// 输出结果
arr: [1, 2, 3]
new_arr:[1, 2, 3]
六、Arrays.fill()
使用方法:Arrays.fill(目标数组,填充值)
理解:把原数组中的所有数替换成填充数
代码示例
import java.util.Arrays;public class main {public static void main(String[] args) {int[] arr = {1, 2, 3};Arrays.fill(arr,1);System.out.println("after_fill:" + Arrays.toString(arr));}
}// 输出结果
after_fill:[1, 1, 1]
七、Arrays.equals()
比较两个数组的内容是否一致
使用方法:Arrays.equals(数组一,数组二)
代码示例
import java.util.Arrays;public class main {public static void main(String[] args) {int[] arr = {1, 2, 3};int[] arr1 = {4,5,6};System.out.println("arr.equals(arr1)? " + Arrays.equals(arr,arr1));}
}// 输出结果
arr.equals(arr1)? false
八、Arrays.asList()
1. 将一维数组转成 List 集合
2. 编译类型:List(接口)
3. 运行类型:java.util.Arrays#ArrayList
,是 Arrays 类的静态内部类
private static class ArrayList<E> extends AbstractList<E>implements RandomAccess, java.io.Serializable
代码示例
import java.util.Arrays;
import java.util.List;public class main {public static void main(String[] args) {List aslist = Arrays.asList(1,2,3);System.out.println("aslist:" + aslist);System.out.println("getclass():" + aslist.getClass());}
}// 运行结果
aslist:[1, 2, 3]
getclass():class java.util.Arrays$ArrayList
相关文章:
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...