在日常使用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<Integer> integers = Arrays.asList(1, 2, 3, 4);
这种方式虽然可以使用,但是生成的List
为内部类,而不是java.utils下的ArrayList
,不能对该list进行添加,删除等操作。
第二种方式
List<Integer> collect = Arrays.stream(ints).boxed().collect(Collectors.toList());
这种方式生成的就是正常的List,还可以在生成流之后对该流进行一系列的操作,强烈推荐这种方式