简介
Arrays主要是对数组类型操作。包括排序、查找元素、比较、复制、转化为List、获取hashCode、toString方法。
排序
-sort
1.排序后为升序
2.数组元素类型为基本类型,可以调用对应的重载方法排序
3.若数组元素类型为对象,在如下情况可以调用sort方法排序
(1) 该类实现了排序接口Comparable
(2) 实现比较器接口Comparator
—>Java 中 Comparable 和 Comparator 比较
查找元素
-binarySearch
使用了二分查找对数组中的元素进行查找。
注意:
1.调用该方法前确保数组已经排好序。
2.若要查找的元素在数组中有多个,则只返回其中一个的索引。
—>Java实现二分查找
比较
-equals
结果为true的条件
1.参数都为null
2.数组长度相等且对应位置的元素相等
-deepEquals
用于比较嵌套数组
复制
-copyOf(T[] original, int newLength)
copyOf 从原数组索引为0处开始复制, 若newLength的值大于原数组长度,则以默认值填充。
int[] a = {3, 1, 2};
int[] b = Arrays.copyOf(a , 4);
System.out.println(Arrays.toString(b));// [3, 1, 2, 0]
-copyOfRange(T[] original, int from, int to)
copyOfRange 可以决定复制的区间,区间为[from, to)
int[] a = {3, 1, 2};
int[] b2 = Arrays.copyOfRange(a, 0, 2);
System.out.println(Arrays.toString(b2));// [3, 1]
将数组转化为List
-asList(T… a)
//源码
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
注意: 这个List是Arrays自己的一个静态内部类,并不是uitl包下的ArrayList哦。(PS:读源码真能发现自己的姿势盲区啊~)
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
同时,我们注意到它继承了AbstractList但是没有重写add方法。
List<String> list1 = Arrays.asList("data", "bb");
list1.add("aa"); // Exception in thread "main" java.lang.UnsupportedOperationException
So,该方法适用于初始化一个不可变长度的列表。
获取hashCode
hashCode
计算数组的哈希值
deepHashCode(Object a[])
计算数组元素为数组的哈希值。从源码可看到,该方法进行了递归调用,核心方法还是hashCode。
// 源码
public static int deepHashCode(Object a[]) {
if (a == null)
return 0;
int result = 1;
for (Object element : a) {
int elementHash = 0;
if (element instanceof Object[])
elementHash = deepHashCode((Object[]) element); //递归调用
else if (element instanceof byte[])
elementHash = hashCode((byte[]) element);
else if (element instanceof short[])
elementHash = hashCode((short[]) element);
else if (element instanceof int[])
elementHash = hashCode((int[]) element);
else if (element instanceof long[])
elementHash = hashCode((long[]) element);
else if (element instanceof char[])
elementHash = hashCode((char[]) element);
else if (element instanceof float[])
elementHash = hashCode((float[]) element);
else if (element instanceof double[])
elementHash = hashCode((double[]) element);
else if (element instanceof boolean[])
elementHash = hashCode((boolean[]) element);
else if (element != null)
elementHash = element.hashCode();
result = 31 * result + elementHash;
}
return result;
}
toString方法
-toString
-deepToString
打印嵌套数组的String形式
int[] a = {3, 1, 2};
int[] a1 = {3, 1, 2};
int[][] b1 = {a, a1};
System.out.println(Arrays.toString(a1)); // [3, 1, 2]
System.out.println(Arrays.deepToString(b1)); // [[3, 1, 2], [3, 1, 2]]