Arrays数组工具类

位于java.util包内的Arrays类是Java提供的一个 操作数组 的工具类,其内部定义了一些常见的用于操作数组的静态方法

1:数组转List;2:排序3:查找4:元素填充;5:数组复制;6:toString;7:相等性判断;8:数组交换

1: Arrays.asList([]) ;
  • asList 不接受基本数据类型的数组名,作为参数直接传递。
  • asList 通过backed(拷贝)的方式,返回的是一个固定长度的List;
  • 不能对这个返回的List执行add 方法,可以调用set方法。arrays中的ArrayList并不是平常使用的arraylist,它并没有实现list接口,而是直接继承的AbstractList;且没有复习add方法;
  • 同理不能调用remove方法,但可以调用get方法获取元素。
List转数组的实现,Collection接口定义了统一的方法toArray

2:sort(): 实现数组的排序,默认按升序进行排列 ;
一类是基本数据类型的排序,一类是Object类型的排序;
sort静态方法的实现,按参数主要有两种实现方法,一种是数组整体进行排序;一种是在数组内指定一段起始位置进行排序,之后的 对象数组 排序也只是按指定起始位置排序,不再重复描述。其内部具体实现是DualPivotQuicksort(双轴快速排序);

2.1 基本数据类型的排序
  • 可以接收的参数类型可以是int,long,short,char,byte,float,double类型数组。
2.2 Object 类型数组排序
public static <T> void sort(T[] a, Comparator<? super T> c) {
这个方法是泛型为T的数组,需要提供一个实现了Comparator接口的实例,同理也是必须明确告知排序规则,如果同时实现了Comparable接口和Comparator接口,Comparator接口的实现将覆盖Comparable接口的排序规则。
使用这个方法时,提供的“数组中的对象”必须是实现了Comparable接口的,也就是说必须告知明确告知,对数组中的对象是按什么规则排序。
[ 对象数组排序内部实现采用了LegacyMergeSort(归并排序)和TimSort排序。 ]
parallelSort
parallelSort 是Java8新增的排序方式,和sort方法不同的是,他采用多线程并行的方式进行排序,当数据规模较大时和sort相比有明显优势;具体可见 arrays-sort-versus-arrays-parallelsort .

3: 查找
Arrays内部的查找,主要是binarySearch(二分查找法)。可以说,关于查找到实现分类和排序完全一样。首先从数据类型上也是 分为基础数据类型构成的数组和对象数组。都支持 按特定范围进行排序;对于对象数组的排序,对象数组需要实现Comparable接口或者是提供Comparator接口的实例。


4: fill() :元素填充
结论:java.util.Arrays.fill() 方法只适合于把数组用同一个值初始化;

5:copyOf(); 实现两个将 原数组 按指定长度复制到 目标数组内 返回。
其内部使用System.arraycopy方法,这是一个Java提供的native方法,因此效率会高一些。Java 内部关于数组复制的实现,都用到了这个方法。
同样,也包括一个copyOfRange的方法,这个按名字就可以理解,就是按照范围进行复制。


6:toString()
这个toString的静态方法,其实也很实用;从下面的代码的实现,可以看出,他的作用就是将我们定义的数组,按照 "[a0,a1,....]"的格式转成字符串,方便我们直接打印整个数组,打印出来的日志也会看起来更直观,更方便;


7:equals相等性
Arrays内部关于两个数组相等的判断可以首先看下下面的代码:
基础数据类型数组,以long类型为例
public static boolean equals(float[] a, float[] a2) { if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i<length; i++) if (Float.floatToIntBits(a[i])!=Float.floatToIntBits(a2[i])) return false; return true; }
Object 类型数组
public static boolean equals(Object[] a, Object[] a2) { if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i<length; i++) { Object o1 = a[i]; Object o2 = a2[i]; if (!(o1==null ? o2==null : o1.equals(o2))) return false; } return true; }

deepEquals
关于deepEquals和equals的区别,可以看看这篇文章 Java中Arrays类的两个方法:deepEquals和equals

8:swap数组交换
/** * Swaps x[a] with x[b]. */ private static void swap(Object[] x, int a, int b) { Object t = x[a]; x[a] = x[b]; x[b] = t; }











猜你喜欢

转载自blog.csdn.net/qq_17338093/article/details/78827813