Arrays APi
在日常使用Java数组的过程中,会经常使用到一些扩容、排序、搜索等操作。
准备
创建一个整数数组:int[] ints = new int[]{3,4,2,3,5,6,1,5};
排序
Arrays.sort(ints); // 内部排序
System.out.println(Arrays.toString(ints)); //[1, 2, 3, 3, 4, 5, 5, 6]
复制
ints = Arrays.copyOf(ints, ints.length + 1); // 扩容
ints[ints.length - 1] = 7;
System.out.println("Arrays.toString(ints) = " + Arrays.toString(ints)); // [1, 2, 3, 3, 4, 5, 5, 6, 7],增加了容量
二分搜索
存在则返回随机一个索引,不存在则返回搜索结果的low
指针对应的下标 + 1后的负值。源码如下:
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
int low = fromIndex;
int high = toIndex - 1; // toIndex不包含在搜索内容中
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
使用代码:
System.out.println("Arrays.binarySearch(ints, 2) = " + Arrays.binarySearch(ints, 2)); // Arrays.binarySearch(ints, 2) = 1
int i = Arrays.binarySearch(ints, 8); // 没找到 -(low + 1);
System.out.println(i); // 返回 -(9 + 1)= -10;
填充默认值
在某些场景下,我们希望数组的初始值可以自定义,所以可以使用 fill
函数去实现,注意,只能对一维数组进行操作,如果是二维数组,那么把它当作数组的元素是数组,使用一层循环,然后对每个数组进行填充自定义的值。
Arrays.fill(ints2, 2); // 填充默认值
System.out.println("Arrays.toString(ints2) = " + Arrays.toString(ints2));
比较两个数组是否相等
不能直接用等于,也可以使用数组自带的equals
方法,但推荐使用 Arrays.equals()
方法可以自行比较。
int[] ints2 = new int[]{1,2,3};
System.out.println("Arrays.equals(ints, ints2) = " + Arrays.equals(ints, ints2)); // false, 判断两个数组是否相等。
将数组转换为List
第一种方式: List<Integer> integers = Arrays.asList(1, 2, 3, 4);
这种方式虽然可以使用,但是生成的List
为内部类,而不是java.utils下的ArrayList
,不能对该list进行添加,删除等操作。
第二种方式List<Integer> collect = Arrays.stream(ints).boxed().collect(Collectors.toList());
这种方式生成的就是正常的List,还可以在生成流之后对该流进行一系列的操作,强烈推荐这种方式