0%

Arrays类

java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的

1. 常用方法表

方法和说明
static List asList(T… a)
返回由指定数组支持的固定大小的列表
static int binarySearch(Object[] a, Object key)
用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。
static int[] copyOf(int[] original, int newLength)
复制original并指定长度newLength的新数组,如果newLength小于原本数组的长度,则进行截断。相反则用0去补充。
static int[] copyOfRange(int[] original, int from, int to)
将指定数组的指定范围复制到新数组中,超出数组长度时会用0进行填充
static boolean equals(long[] a, long[] a2)
如果两个指定的 long 型数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
static void fill(int[] a, int val)
将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
static void sort(Object[] a)
对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
static void deepToString(Object[] a)
将多维数组以字符串的形式返回。形如:[[…],[…],[…]]。

2. 数组转集合

1
2
3
4
5
6
7
8
9
10
11
12
String[] strArray = {"abc", "def", "ghi"};
//转为List集合
List<String> strList = Arrays.asList(strArray);
System.out.println(strList); //[abc, def, ghi]

strList.add("王尼玛"); //UnsupportedOperationException异常
System.out.println(strList);

int[] numArray = {123, 456, 789};
//转为List集合
List<int[]> numList = Arrays.asList(numArray);
System.out.println(Arrays.toString(numList.get(0))); //[123, 456, 789]

由以上代码示例可以说明:

  • 当将数组转换为List集合时,可以使用集合的方法来操作数组中的元素
  • 因为数组的长度是固定的,所以对于有数组转换过来的List集合是不可以使用增删方法的,否则会发生UnsupportedOperationException异常
  • 如果数组中的元素是对象,那么转成集合时,直接将数组中的元素作为集合中的元素进行集合存储,如上面的strArray转strList的例子。
  • 如果数组中的元素是基本数据类型数值,那么会将该数组作为集合中的元素进行存储,如上面的numArray转numList的例子。

3. 集合转数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void listToArray() {
List<String> strList = new ArrayList<>();
strList.add("J");
strList.add("a");
strList.add("v");
strList.add("a");

//toArry没有参数的情形
String[] array = (String[]) strList.toArray();
System.out.println("数组大小:" + array.length); //数组大小:4
System.out.println(Arrays.toString(array)); //[J, a, v, a]

//toArray带数组类型参数,指定的数组长度小于List的长度
String[] strArray = strList.toArray(new String[2]);
System.out.println("\n数组大小:" + strArray.length); //数组大小:4
System.out.println(Arrays.toString(strArray)); //[J, a, v, a]

//指定的数组长度小于List的长度
String[] strArray2 = strList.toArray(new String[6]);
System.out.println("\n数组大小:" + strArray2.length); //数组大小:6
System.out.println(Arrays.toString(strArray2)); //[J, a, v, a, null, null]

}

toArray方法传入一个指定类型的数组参数的情况:

  • 如果数组长度小于集合的长度,那么该方法会创建一个同类型并和集合长度相同数组
  • 如果数组长度小于集合的长度,那么该方法就会使用指定的数组长度以存储集合中的元素,其他位置默认为null

4. 拷贝元素

1
2
3
4
5
6
7
8
9
10
11
int[] arr = {9, 8, 3, 5, 2};     //初始化一个数组

int[] newArr = Arrays.copyOfRange(arr, 0, 7);
System.out.println(Arrays.toString(newArr)); //[9, 8, 3, 5, 2, 0, 0]

int[] newArr2 = Arrays.copyOf(arr, 2);
System.out.println(Arrays.toString(newArr2));//[9, 8]

int[] outOfRangeArr = Arrays.copyOfRange(arr, 8, 10); //java.lang.ArrayIndexOutOfBoundsException

int[] reverseRangeArr = Arrays.copyOfRange(arr, 4, 2); //java.lang.ArrayIndexOutOfBoundsException

由以上代码示例可以说明:

  • copyOfRange方法的最后一个参数是不包含的
  • 如果后一个参数超出了原本数组大小-1的范围,那么以0补充多出的空位。
------ 本文结束------