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; //降序排列
}
});