Java源码之Arrays

简介

Arrays主要是对数组类型操作。包括排序查找元素比较复制转化为List获取hashCodetoString方法


排序

-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]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值