Array
属于object类,用来存放一组数据的数据结构,数组是最基本的一种数据结构但不是基本数据类型,数组是相同数据类型组成的集合,数组中的元素按线性顺序排序
1 2 3 4 5 6 7 8 9 10 11 12 13
| int[] a = {6,2,6,8};
int[] a = new int[]{1,2,3,4,5};
int[] a; a = new int[]{1,2,3,4,5};
int[] arr = new int[3]; System.out.println(arr);
|
数组作为方法参数
数组作为方法参数传递,传递的参数是数组内存的地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public static void main (String[]args){ int[] result = calculate(10, 20, 30); System.out.println("main方法接收到的返回值数组是:"); System.out.println(result); System.out.println("总和:" + result[0]); System.out.println("平均数:" + result[1]); }
public static int[] calculate ( int a, int b, int c){ int sum = a + b + c; int avg = sum / 3;
int[] array = {sum, avg}; System.out.println("calculate方法内部数组是:"); System.out.println(array); return array; }
|
数组作为方法的参数,传递进去的其实是数组的地址值。
数组作为方法的返回值,返回的其实也是数组的地址值。
二维数组
存放数组的数组
外围数组长度为3,内部3个数组长度为2,一共有4个数组,内部数组默认值0,外围数组保存的是内部数组的地址。
只建一个外围数组长度3,3个位置都是null,之后可以建新数组放入内部。
**Arrays **
转换为String
Arrays.toString(数组)把数组数据连接成字符串。
Arrays.deepToString(数组) 把多维数组转成字符串
1 2 3 4 5 6 7 8
| int[] intArray = {10, 20, 30};
String intStr = Arrays.toString(intArray); System.out.println(intStr);
int[][][] dp = {{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}}; System.out.println(Arrays.deepToString(dp));
|
排序
Arrays.sort() 数组排序基本类型:优化的快速排序;引用类型:优化的合并排序。
Arrays.sort(T[] a, Comparator<? super T> c)
1 2 3 4 5 6 7 8 9 10 11 12 13
| int[] nums = new int[]{1,-2,-3,4,-7,6,-5}; Arrays.sort(nums); System.out.println(Arrays.toString(nums));
int[] arr1 = Arrays.stream(nums).boxed().sorted((o1, o2) -> o2 - o1).mapToInt(Integer::intValue).toArray(); System.out.println(Arrays.toString(arr1));
Integer[] arr2 = new Integer[]{1,-2,-3,4,-7,6,-5}; Arrays.sort(arr2, Collections.reverseOrder()); System.out.println(Arrays.toString(arr2));
|
备注:
- 如果是数值,sort默认按照升序从小到大
- 如果是字符串,sort默认按照字母升序
- 如果是自定义的类型,那么这个自定义的类需要有Comparable或者Comparator接口的支持。
二维数组的排序
二维数组的元素是引用类型,故可以直接重写compare方法
按照内部数组第一个元素排序
1 2 3 4 5 6 7 8
| int[][] a1 = new int[][]{{1, 3}, {1, 2}, {4, 5}, {3, 7}}; Arrays.sort(a1, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o1[0] - o2[0]; } }); System.out.println(Arrays.deepToString(a1));
|
Arrays.binarySearch(数组,目标值) :二分法查找,在有序数组中查找目标值下标,找不到返回 -1
1 2
| int[] nums = new int[]{1,-2,-3,4,-7,6,-5}; System.out.println(Arrays.binarySearch(nums,-2));
|
复制
public static int[] copyOf(int[] original, int newLength):复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。对于在原数组和副本中都有效的所有索引,这两个数组将包含相同的值。对于在副本中有效而在原数组无效的所有索引,副本将包含 0。当且仅当指定长度大于原数组的长度时,这些索引存在。
1 2 3 4
| int[] originalArray = {1, 2, 3, 4, 5}; int[] copiedArray = Arrays.copyOf(originalArray, originalArray.length);
|
通过 Arrays.copyOf()
方法复制的数组是一个全新的数组,与原始数组完全独立,修改原始数组的值并不会影响到复制后的数组。
arraycopy方法
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):
将数组中指定的数据拷贝到另一个数组中。
数组的拷贝动作是系统级的,性能很高。System.arraycopy方法具有5个参数,含义分别为:
- src - 源数组。
- srcPos - 源数组中的起始位置(起始索引)。
- dest - 目标数组。
- destPos - 目标数据中的起始位置。
- length - 要复制的数组元素的数量。
1 2 3 4 5 6 7
| int[] sourceArray = {1, 2, 3, 4, 5};
int[] destinationArray = new int[sourceArray.length];
System.arraycopy(sourceArray, 0, destinationArray, 0, sourceArray.length); System.out.println(Arrays.toString(destinationArray));
|
注意:
System.arraycopy()
并不返回新的数组,而是在已存在的目标数组上进行原地复制。
Arrays.copyOf()
返回一个新的数组,原数组不受影响。
如果在方法内运行需要注意Arrays.copyOf()并不会改变原来的数组
转换为List
Arrays.asList( ):注意该方法的返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList,它并非java.util.ArrayList类。
java.util.Arrays.ArrayList类具有set(),get(),contains()等方法,但是不支持添加add()或删除remove()方法,调用这些方法会报错。
1 2 3 4 5 6 7 8
| Integer[] num = new Integer[]{1,2,3,4,5,6,7,8,9}; List<Integer> ans1 = Arrays.asList(num);
List<Integer> list = new ArrayList<>(ans1); list.add(1);
|