操作数组的工具类——Arrays(java)的常用方法

操作数组的工具类——Arrays(java)的常用方法

目录

常用方法:

toString: 将数组转化成字符串

binarySearch: 二分查找法查找元素

copyOf: 拷贝数组

copyOfRange: 拷贝数组(指定范围)

sort: 排序

注意:sort函数的重载

常用方法:

(省流废话)前面的方法其实都很简单,看一下语法就会用,小伙伴们象征看看当复习也可以,重点在于最后sort的方法。

toString: 将数组转化成字符串

语法:Arrays.toString(数组)

int[] arr = {1, 2, 3, 4, 5};

System.out.println(Arrays.toString(arr));

binarySearch: 二分查找法查找元素

注意:Arrays里的binarySearch只能对升序数组进行查找。

若元素不存在数组中,方法会假设这个元素存在这个数组中(按升序排序),返回一个整数(这个整数是元素如果存在于该数组中的位置索引的负数减一的值)。

语法:Arrays.binarySearch(数组,元素)

System.out.println(Arrays.binarySearch(arr, 3));//2

System.out.println(Arrays.binarySearch(arr, 6));//-6

copyOf: 拷贝数组

要求指定新数组长度,指定长度大于原数组长度,在多出来的位置补充默认值;

小于原数组长度,则只拷贝部分原数组元素。

语法:Arrays.copyOf(数组,新数组长度)

int new_arr1[] = Arrays.copyOf(arr, 10);

int new_arr2[] = Arrays.copyOf(arr, 3);

System.out.println(Arrays.toString(new_arr1));//[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]

System.out.println(Arrays.toString(new_arr2));//[1, 2, 3]

copyOfRange: 拷贝数组(指定范围)

指定拷贝的起始索引和结束索引(结束索引的元素不被拷贝)(包头不包尾)

语法:Arrays.copyOfRange(数组,起始索引,结束索引)

int new_arr3[] = Arrays.copyOfRange(arr, 1, 3);

System.out.println(Arrays.toString(new_arr3));//[2, 3]

sort: 排序

默认情况指为基本数据类型进行升序排序,底层使用逻辑的是快速排序(关于一些常见的排序方法在常见算法:排序(java)有介绍)

语法:Arrays.sort(数组)

int arr2[] = {6, 1, 2, 3, 4, 5};

Arrays.sort(arr2);

System.out.println(Arrays.toString(arr2));//[1, 2, 3, 4, 5, 6]

注意:sort函数的重载

(这个大概是本篇里比较有难度的点)

语法:Arrays.sort(数组,排序规则)

细节:这个方法只能给引用数据类型的数组进行排序,当然,java现在是很智能的,有自动装箱拆箱的机制(即自动将基础类型与对应的包装类进行相互转化),因此我们传入基础数据类型的数组也是完全没问题哒。(好吧,打脸了,实测直接传入基础数据类型idea会报错QAQ,还是老老实实手动将数组打包成包装类吧)

打包语法:包装类[] 新数组名 = Arrays.stream(要打包的数组).boxed().toArray(包装类[]::new)

值得一提的是,Arrays.stream()似乎是不支持float类型的数组的,建议使用double数组保存浮点数数据。

int arr3[] = {1, 2, 3, 4, 5, 6};

//这里演示的是将int数组转为Integer数组

Integer[] arr4 = Arrays.stream(arr3).boxed().toArray(Integer[]::new);

在底层代码里,参数里的排序规则是一个接口,所以我们在调用方法时,需要传入这个接口的实现类对象。 但是这个实现类我们通常只需要使用一次,再去为它定义一个类是不是太麻烦啦?

因此,我们可以采取匿名内部类的方式来完成这个规则即可,省时省力。(博主是新人菜鸡,之前没有写博客的习惯,所以这里没有匿名内部类的介绍链接,诶嘿。之后有写的话就回来更新(大概))。下面我们简单写一个降序作为排序规则的sort,比较的规则自然就是内部类里的compare()方法啦。

Arrays.sort(arr4, new Comparator() {

@Override

public int compare(Integer o1, Integer o2) {

return o2 - o1;

}

});

System.out.println(Arrays.toString(arr4));//[6,5,4,3,2,1]

compare方法里的两个参数,o1表示在无序序列中遍历得到的每一个元素,o2表示有序序列中的元素。

简单介绍一下底层原理(这一段是黑马java视频里的总结):

利用插入排序 + 二分查找的方式进行默认把0索引的数据当作有序数组,后面的部分认为是无序数组遍历无序的序列得到里面的每一个元素,假设当前遍历得到的元素是A元素把A元素往有序序列中进行插入,用二分查找确定A元素的插入点将A元素与插入点的元素进行比较,比较的规则就是compare方法的方法体如果方法的返回值是负数,拿着A继续跟前面的数据进行比较如果方法的返回值是整数,拿着A继续跟后面的数据进行比较如果方法的返回值是0,也拿着A继续跟后面的数据进行比较直到确定A的最终位置为止

当然,也可以偷懒,只记住o1-o2是升序排序,o2-o1是降序排序即可。

相关推荐

王者荣耀最新赛季多久结算
bt365体育在线备用

王者荣耀最新赛季多久结算

06-28 👁️ 8228
隄防的解释
bt365体育在线备用

隄防的解释

06-27 👁️ 1525
三星s10发布会 三星s10十是哪年出的?
365bet官方投注网站

三星s10发布会 三星s10十是哪年出的?

06-28 👁️ 4030
如何安装打印机驱动程序到电脑 手把手教你
bet·365官方网站

如何安装打印机驱动程序到电脑 手把手教你

06-29 👁️ 6308