Java Arrays

112 阅读2分钟

Arrays

操作数组的工具类,定义在java.util包中

并没有提供构造方法,但是里面的成员方法都是静态的

方法名说明
public static String toString(数组)把数组拼接成一个字符串
public static int binarySearch(数组, 查找的元素)二分法查找数组
public static int[] copyOf(原数组, 新数组长度)拷贝数组
public static int[] copyOfRange(原数组, 起始索引, 结束索引)拷贝数组(指定范围)
public static void fill(数组, 元素)填充数组
public static void sort(数组)按照默认方式进行数组排序
public static void sort(数组, 排序规则)按照指定的规则排序
  • Arrays.toString()方法底层原理
    • 在底层创建StringBuilder对象进行字符串的拼接
public static String toString(int[] a) {
    if (a == null) {
        return "null";
    }
    int iMax = a.lenght - 1;
    if (iMax = -1) {
        return "[]";
    }
    
    StringBuilder b = new StringBuilder();
    b.append('[');
    if (i == iMax) {
        return b.append(']').toString();
    } else {
        b.append(", ");
    }
}
  • Arrays.binarySearch()方法细节

    • 返回的是数据在数组中的索引
    • 二分查找的前提:数组中的元素必须是有序的,数组中的元素必须是升序的
    • 如果要查找的元素是存在的,那么返回的是真实的索引
      • 但是如果要查找的数据是无序的,返回的是 -插入点 - 1
      • 插入点:数据应该插入的索引
      • 为什么要减1?
        • 如果此时我们要查找数字0,那么如果返回的是 -插入点,就会出现问题了
        • 如果要查找数字0,此时若0是不存在的,但是按照上面的规则 -插入点,那么返回的是-0,出现歧义
        • 为了避免这种情况,Java在这个基础上再减1
  • Arrays.copyOf()方法底层原理和细节

    • 底层调用System.arraycopy()方法
    • 参数一:老数组
    • 参数二:新数组的长度
    • 如果新数组的长度小于老数组的长度,会部分拷贝
    • 如果新数组的长度等于老数组的长度,会完全拷贝
    • 如果新数组的长度大于老数组的长度,会加上默认初始值
  • Arrays.copyOfRange()方法细节

    • 包头不包尾,包左不包右
  • Arrays.fill()方法底层原理

    • 将数组中的所有元素全部替换
public static void fill(int[] a, int val) {
    for (int i = 0, len = a.length; i < len; i++) {
        a[i] = val;
    }
}
  • Array.sort(数组)方法底层原理
    • 底层使用的是快速排序
  • Array.sort(数组, 排序规则)方法细节和底层原理
    • 参数一:要排序的数组
    • 参数二:排序的规则
      • 只能给引用数据类型的数组进行排序
        • 如果数组是基本数据类型的,需要变成其对应的包装类
      • 第二个参数是一个接口,所以我们再调用方法的时候,需要传递这个接口的实现类对象,作为排序的规则
        • 但是这个实现类只需要使用一次,所以就没有必要单独的去写一个类,直接采取匿名内部类的方式就可以了
    • 底层原理
      • 利用插入排序 + 二分查找的方式进行排序
        • 默认把0索引的数据当作有序的序列,1索引到最后认为是无序的序列
        • 遍历无序的序列得到里面的每一个元素,假设当前遍历得到的元素是A元素
        • 把A元素往有序序列中进行插入,再插入的时候,是利用二分查找的方式确定A元素的插入点
        • 拿着A元素,跟插入点的元素进行比较,比较的规则就是compare方法的方法体
          • 如果方法的返回值是负数,拿着A继续跟前面的数据进行比较
          • 如果方法的返回值是正数,拿着A继续跟后面的数据进行比较
          • 如果方法的返回值是0,也拿着A继续跟后面的数据进行比较
          • 直到A能确定A的最终位置为止
      • compare(Object o1,Object o2)方法的细节
        • 参数一 o1:表示在无序序列中,遍历得到的每一个元素
        • 参数二 o2:有序序列中的元素
        • 返回值
          • 负数:表示当前要插入的元素是小的,放在前面
          • 正数:表示当前要插入的元素是大的,放在后面
          • 0:表示当前要插入的元素跟现在的元素跟现在的元素比是一样的,也会放在后面
Integer[] arr = {2, 3, 1, 5, 6, 7, 8, 4, 9,};

Arrays.sort(arr, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 - o2;  //升序排列
        //return o2 - o1;  //降序排列
    }
});