Arrays常用方法(超详解)

2年前 (2022) 程序员胖胖胖虎阿
261 0 0

目录

导包

1.Arrays.toString()方法

2.Arrays.sort()方法

3.Arrays.equals()方法

4.Arrays.binarySearch()

5.Arrays.copyOf()

Arrays.sort()降序排列

Collections.reverseOrder()

实现Comparator接口

实现接口之 匿名内部类

实现接口之 lambda

Arrays.equals()的补充


导包

Arrays的常用方法那肯定是在Arrays类内了,所以导包:java.util.Arrays;

1.Arrays.toString()方法

方法作用:快速输出数组内容,可以偷偷懒🌚

int[] a = {1,2,3,4,5};
System.out.println(Arrays.toString(a));
// 输出格式:[1,2,3,4,5]

2.Arrays.sort()方法

方法运用:给数组排序,默认升序

int[] a = new int[5]{5,4,3,2,1};
Arrays.sort(a); // 1 2 3 4 5
System.out.println(Arrays.toString(a));
// [1,2,3,4,5]

两种重载方式:

①.Arrays.sort(数组名)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L2V4pSM,size_20,color_FFFFFF,t_70,g_se,x_16

 ②.Arrays.sort(数组名,起始下标,排序个数)

Scanner s = Scanner(System.in);
int n = s.nextInt();
int[] a = new int[n]
for(int i = 0; i < n; i++)
   a[i] = s.nextInt();
Arrays.sort(a,0,n - 1);
//输入n个数,按照升序排列

对字符串进行排序时,是对每一个字符比较,而不是简单的比较长度

// str1 = abd
// str2 = abcdef
// 因为d > c,所以 str1 > str2

它是一个很强大的方法,具体见博文:浅谈Arrays.sort()原理

3.Arrays.equals()方法

方法作用:比较两个数组内容是否相等

int[] a = {1,2,3};
int[] b = {1,2,3};
boolean isSame = Arrays.equals(a,b);
//true

注意:Arrays.equals()是比较数组内容,而a.equals(b) 这样的方法是比较地址值

注意!注意!

以后使用java提供的引用数据内容(数组、字符串、各种集合....)时,一定要用equals()方法比较内容是否相等,而不是傻傻的用 ==了!因为官方已经把equals()给重写了。如果你要比较你自己写的类,例如学生按成绩排序,就要自己重写equals()方法

4.Arrays.binarySearch()

方法作用:在数组中查找元素

int Arrays.binarySearch( Datatype[], Datatype key)

再数组中查找指定值,若找到,则返回此值的下标,

若没找到,返回 -插入点-1;

如:

int[] a = {1,5,6,7};
Arrays.binarySearch(a,2)  //没找到,插入点为1,则返回 -2
Arrays.binarySearch(a,4)  //没找到,插入点为1,则返回 -2
Arrays,binarySearch(a,8)  //没找到,插入点为4,则返回 -5
Arrays.binarySearch(a,5)  //找到了!返回下标 1
只要返回值 ≥ 0 ,就代表找到了。

5.Arrays.copyOf()

方法作用:拷贝数组

源码如下:第一个参数是原数组,第二个参数是拷贝长度,返回值是将原数组拷贝一份返回

(它的底层其实是调用了System.arrayCopy()方法)

public static <T> T[] copyOf(T[] original, int newLength) {
      return (T[]) copyOf(original, newLength, original.getClass());
}

需要注意的是返回值是一个新数组,会改变接收这个新数组的引用的一些属性 

public static void main(String[] args) {
        int[] arr1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int[] arr2 = new int[5];
        arr2 = Arrays.copyOf(arr1, 10);
}

Arrays常用方法(超详解)

 Arrays.copyOf()的拷贝是从下标0开始的,如果你想从其他下表开始,可以使用Arrays.copyOfRange()方法

// from 表示开始位置, to 表示结束位置  
// 复制下标为 :[from, to)
Arrays.copyOfRange(int[] original, int from, int to)

 Arrays常用方法(超详解)

Arrays.sort()降序排列

有两种方法可以实现Arrays.sort()的降序排列,一种是可以直接往作业上抄,简便的,一种是比较麻烦的。

但是他们都有一个共同特点:

不能作用于基本数据类型!

 那你说,我要是想对:{8,6,5,3,2} 排序,用什么类型呢?这些数据都是int啊,不能降序怎么办?那当然是使用我们的包装类了啊

Integer、Double、Float......

先介绍第一种。(没学的可以跳到equals()了,这里如果想用的话,直接ctrl +cv)

Collections.reverseOrder()

Integer[] a = {1,2,3,4,5}
Arrays.sort(a,Collections.reverseOrder())
// 输出数组的内容即为:5 4 3 2 1

来看看如果用int类型数组会发生什么:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L2V4pSM,size_20,color_FFFFFF,t_70,g_se,x_16

它会提示你:“需要的是一个泛型T[],而不是int[]” (这里不做讲解,你只要知道不能int就行了)

 实现Comparator接口

Comparator接口中有一个compare()方法,重写它就可以改变Arrays.sort()的排序规则

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L2V4pSM,size_20,color_FFFFFF,t_70,g_se,x_16

虽然Comparator这种方法复杂一点,但是可以实现的功能就多一点

例如你可以 自己写一个Student类,按照姓名排序、按照学号、成绩排序、还可以按照降序排列,找出倒数第一大怨种

a9929a1ffb8c49ec84e7553fcea46884.png

总结:

这两种方法共同点都是:

1.不能对基本数据类型(int、double...)进行逆序排序

2.都要在Arrays.sort()里面加点料

         Arrays.sort(a)      正常升序

         Arrays.sort(a,Collections.reverseOrder())    逆序①

         Arrays.sort(a,new Mycomparator())             逆序②

实现接口之 匿名内部类

这是补充,上面那个实现comparator接口的方法实在太繁琐,你还要为此创建一个类来重写conpare方法,于是,匿名内部类的优点就体现出来了

public class Test {
    public static void main(String[] args) {
        // a数组降序排列应为: 5 4 4 3 3 2 2 1 1
        Integer[] a = {1,2,3,4,5,4,3,2,1};

        Arrays.sort(a, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });

        System.out.println(Arrays.toString(a));
    }
}

是不是看不懂?没事,我把匿名内部类抠出来 

Arrays常用方法(超详解)

 你会说,接口不是不许new 对象吗?为什么直接new Comparator<Integer>()了呢?

 是因为匿名内部类的发明就是为了简化接口实现太复杂这个缺点,

new Comparator<Integer>()后面的大括号的内容相当于一个没有名字的类,它实现了不用起名字,也不用implements Comparator 了,放到接口后面就可以

 实现接口之 lambda

可是你说,匿名内部类还是好麻烦啊!还要new,还要重写,那个大括号实在是分不清谁是谁啊!

JAVA工程师自然想到了这一点,Lambda表达式应运而生

Arrays常用方法(超详解)

 仅需一行!仅需一行!是不是很简单?我来解释一下怎么用

Lambda表达式时这样的: ( 参数) -> { 代码 }

参数有几个,完全取决于你要实现的接口方法有几个参数

你看,我们重写的compara方法有两个参数,于是Lambda表达式的()里面就有两个数:e1、e2,而且不用声明他们的类型,我们只需要用,剩下的留给JVM推断去吧

当然,如果{代码}里面只有一行的话,我们不妨大胆一点:

Arrays常用方法(超详解)

我直接连return 都不要   "为什么" 就不在这里补充了

如果你想了解更多关于Lambda,可以去这位大佬的博客看看(这边建议学完javase再看)

http://t.csdn.cn/gIo1w

 Arrays常用方法(超详解)

Arrays.equals()的补充

为什么 Arrays.equals(a,b) 和 a.equals(b) 不同呢

因为:

数组是Object的子类,a.equals(b) 使用的是 Object 类的 equals 方法,是比较地址值的

而 Arrays 的equals()方法与Object的不同,它能够进行数组内容的比较

先来看看Object类的equals()方法:直接比较了 this 和 obj 的地址:

Arrays常用方法(超详解)

再看看Arrays重写的equals()方法:比上面的复杂,就不一一讲解了

Arrays常用方法(超详解)

然后用代码实验一下

Arrays常用方法(超详解)

 可以看到,a.equals(b)a == b     的结果是相同的 而Arrays.equals()才是比较数组内容是否相同的正确方法

再次强调:

以后使用java提供的引用数据内容(数组、字符串、各种集合....)时,一定要用equals()方法比较内容是否相等,而不是傻傻的用 ==了!因为官方已经把equals()给重写了。如果你要比较你自己写的类,例如学生按成绩排序,就要自己重写equals()方法

版权声明:程序员胖胖胖虎阿 发表于 2022年9月4日 上午3:56。
转载请注明:Arrays常用方法(超详解) | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...