Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用。
1、Array类与Arrays类的区别?
Array类提供了提供静态方法,把数组作为Object来动态创建和访问 Java数组的方法。
Arrays类包含用于操作数组的各种方法(通过index索引),如排序、搜索等。 该类还包含一个静态工厂,可以将数组视为List。
2、Arrays类的常用方法
只整理了某一种重载的常用方法,具体查看API
1)将数组转换为集合
-
-
static List
asList(T... a)
返回由指定数组支持的固定大小的列表。
-
注意:
(1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean)
public static void main(String[] args) throws UnsupportedEncodingException {
int[] ints = { 1, 2, 3 };
List list = Arrays.asList(ints);
System.out.println("长度:" + list.size() + ";元素:" + list); //长度:1;元素:[[I@1c20c684]
Integer[] ints2 = { 1, 2, 3, 4, 5 };
List list2 = Arrays.asList(ints2);
System.out.println("长度:" + list2.size() + ";元素:" + list2); //长度:5;元素:[1, 2, 3, 4, 5]
}
asList 方法接受的参数是一个泛型的变长参数,我们知道基本数据类型是无法泛型化的,也就是说8个基本类型是无法作为asList方法的参数的, 要想作为泛型参数就必须使用其所对应的包装类型。但是这个实例中为什么没有出错呢?因为该实例是将int 类型的数组当做其参数,而在Java中数组是一个对象,它是可以泛型化的。所以该例子是不会产生错误的。既然例子是将整个int 类型的数组当做泛型参数,那么经过asList转换就只有一个int 的列表了。
结论:在使用asList()时尽量不要将基本数据类型数组转List。
(2)该方法将数组与列表链接起来,当更新其中之一时,另一个自动更新。
public static void main(String[] args) throws UnsupportedEncodingException {
String[] arr = {"a","java","array"};
List list = Arrays.asList(arr);
arr[0] = "edit-a";
list.set(2,"edit-java");
System.out.println(Arrays.toString(arr)); //[edit-a, java, edit-java]
System.out.println(list.toString()); //[edit-a, java, edit-java]
}
(3)不支持add和remove方法
public static void main(String[] args){
String[] arr = {"a","java","array"};
List list = Arrays.asList(arr);
list.add("add"); // 运行报错:java.lang.UnsupportedOperationException
list.remove(arr[0]);
}
通过asList()源码可发现:
Arrays.ArrayList 是工具类 Arrays 的一个内部静态类,它没有完全实现List的方法,而 ArrayList直接实现了List 接口,实现了List所有方法。
Arrays.ArrayList将外部数组的引用直接通过“=”赋予内部的泛型数组,所以本质指向同一个数组。
Arrays.asList() 方法使用场景:
Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List 。但是,生成的List的长度是固定的;能够进行修改操作(比如,修改某个位置的元素);不能执行影响长度的操作(如add、remove等操作),否则会抛出UnsupportedOperationException异常。
所以 Arrays.asList 比较适合那些已经有数组数据或者一些元素,而需要快速构建一个List,只用于读取操作,而不进行添加或删除操作的场景。
2)拷贝数组
其内部调用了 System.arraycopy() 方法,从下标 0 开始,如果超过原数组长度,则会用 null 进行填充。
-
-
static T[]
copyOf(T[] original, int newLength)
复制指定的数组,用空值截断或填充(如有必要),以便复制具有指定的长度。
static T[]
copyOfRange(T[] original, int from, int to)
将指定数组的指定范围复制到新数组中。
-
public static void main(String[] args){
String[] arr = {"a","java","array","b"};
String[] arr1 = Arrays.copyOf(arr, 2); //[a, java]
String[] arr2 = Arrays.copyOf(arr, 5); //[a, java, array, b, null]
String[] arr3 = Arrays.copyOfRange(arr,1,3); //[java, array]
String[] arr4 = Arrays.copyOfRange(arr,2,5); //[array, b, null]
}
3)判断两个数组是否相等
判断两个(多维)数组是否相等
数组元素为基本数据类型时,依次比较值
数组元素为引用数据类型时,依次调用元素的 equals() 方法进行比较
即如果两个(多维)数组被认为是相等的,则两个(多维)数组中应包含相同顺序的相同元素
public static void main(String[] args){
Integer[] data1 = {1, 2, 3};
Integer[] data2 = {1, 3, 2};
System.out.println(Arrays.equals(data1, data2)); // false
Integer[][] data3 = {{1,2,3}, {1,2,3}};
Integer[][] data4 = {{1,2,3}, {1,2,3}};
System.out.println(Arrays.deepEquals(data3, data4)); // true
}
4)获取数组的哈希值
-
-
static int
hashCode(Object[] a)
根据指定数组的内容返回哈希码。
static int
deepHashCode(Object[] a)
根据指定数组的“深度内容”返回哈希码。
-
5)获取数组元素的字符串形式
-
-
static String
toString(Object[] a)
返回指定数组的内容的字符串表示形式。
static String
deepToString(Object[] a)
返回指定数组的“深度内容”的字符串表示形式。
-
public static void main(String[] args){
Integer[] data1 = {1, 2, 3};
Integer[][] data2 = {{1,2,3}, {1,2,3}};
//哈希值
System.out.println(Arrays.hashCode(data1)); //30817
System.out.println(Arrays.deepHashCode(data2)); //987105
//字符串形式
System.out.println(Arrays.toString(data1)); //[1, 2, 3]
System.out.println(Arrays.deepToString(data2)); //[[1, 2, 3], [1, 2, 3]]
}
6)数组的排序
-
-
static void
sort(int[] a)
按照数字顺序排列指定的数组。
static void
sort(Object[] a)
对指定对象升序排列的阵列,根据natural ordering的元素。
static void
sort(T[] a, Comparator list, int i, int j)
交换指定列表中指定位置的元素。
static void
reverse(List list)
反转指定列表中元素的顺序。
static void
shuffle(List list)
使用默认的随机源随机排列指定的列表。
-
public static void main(String[] args){
List list = Arrays.asList("one two three four five six siven".split(" "));
Collections.sort(list);
System.out.println(list.toString()); //[five, four, one, siven, six, three, two]
Collections.reverse(list);
System.out.println(list.toString()); //[two, three, six, siven, one, four, five]
}
2)查找、替换操作
-
-
static int
binarySearch(List c, Object o)
返回指定集合中与指定对象相等的元素数。
static int
indexOfSubList(List source, List target)
返回指定源列表中指定目标列表的第一次出现的起始位置,如果没有此类事件,则返回-1。
static int
lastIndexOfSubList(List source, List target)
返回指定源列表中指定目标列表的最后一次出现的起始位置,如果没有此类事件则返回-1。
static
关注打赏
-
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?