Arrays是Java.util.Arrays类能方便地操作数组,它提供的方法时静态的,归纳一下它的功能:
1、asList
定义:
@SafeVarargs
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
功能:将数组(变长参数实际就是数组)转变成ArrayList,但是ArrayList长度不可变化,企图向ArrayList中添加或者删除数据都会报错:java.lang.UnsupportedOperationException
==注意:==
(1)对于基本类型的数组处理方法应该如下:
List list=Arrays.asList(1,8,7,4,9);
System.out.println(list);
输出:[1, 8, 7, 4, 9]
但是如果这样处理:
int[] arr={1,8,7,4,0};
List list=Arrays.asList(arr);
System.out.println(list);
就会输出:[[I@659e0bfd]
实际上这个就是arr数组,也就是通过asList处理基本类型的数组时,list的元素只有一个,这个元素就是这个数组
(2)对于引用数据类型的数组,可以这样处理:
Integer[] arr2=new Integer[]{3,2,1,9,17};
List list2=Arrays.asList(arr2);
System.out.println(list2);
输出:[3, 2, 1, 9, 17]
2、sort
对数组进行排序。适合byte,char,double,float,int,long,short等基本类型,还有Object类型(实现了Comparable接口),如果提供了比较器Comparator(comparator比较器参见:http://blog.youkuaiyun.com/u014473112/article/details/53339383)
也可以适用于泛型。
3、binarySearch
用于对已排序(譬如经过Arrays.sort排序,且按照升序进行排序。如果数组没有经过排序,那么检索结果未知)的数组进行二分查找。适合byte,char,double,float,int,long,short等基本类型,还有Object类型和泛型(参考sort那段)
例子:
String str[] = {"s2","s4","s1","s3"};
Arrays.sort(str);
System.out.println(Arrays.toString(str));
int ans = Arrays.binarySearch(str, "s2");
System.out.println(ans);
输出:
[s1, s2, s3, s4]
1
4、copyOf
数组拷贝,底层采用System.arrayCopy(native方法)实现。
例子:
String str[] = {"s2","s4","s1","s3"};
String[] str2=Arrays.copyOf(str, str.length);
System.out.println(Arrays.toString(str2));
输出:
[s2, s4, s1, s3]
5、copyOfRange
指定范围的复制
String str[] = {"s2","s4","s1","s3"};
String[] str2=Arrays.copyOfRange(str, 1,3);
System.out.println(Arrays.toString(str2));
输出:[s4, s1]
6、equals和deepEquals
顾名思义,就是比较两个数组是否相等,但是这两个有区别:
equals针对的是一维数组中的元素是否相等,如果一维数组元素是基本数据类型并且值一样,那么equals结果就是true,但是如果是引用类型(比如二维数组,那个数组的元素是数组)就要比较数组的引用数据类型元素是否相等。 而deepEquals则是深层的比较多维数组的最里面的元素,也就是说如果是二维数组,而二维数组对应的元素都相等,那么用deepEquals返回true.一般equals返回true那么deepEquals也返回true,所以如果是多维数组比较最好用deeEquals
例子:
int[] a={1,2,3,5,7};
int[] a2={1,2,3,5,7};
System.out.println(Arrays.equals(a, a2)); //输出true
String str1[] = {"s2","s4","s1","s3",null};
String str2[] = Arrays.copyOf(str1, str1.length);
System.out.println(Arrays.equals(str1, str2));//输出true
Employee[] em={new Employee("Cato",400),new Employee("Plato",100),
new Employee("Zeno",200),new Employee("Archimedes",500)};
Employee[] em2={new Employee("Cato",400),new Employee("Plato",100),
new Employee("Zeno",200),new Employee("Archimedes",500)};
boolean t=Arrays.equals(em, em2);
System.out.println(t);//输出false
int a1[] = new int[]{1,2,3};
int a2[] = new int[]{1,3,3};
int a3[] = new int[]{4,3,2,1};
int a4[] = new int[]{1,2,3};
int a5[] = new int[]{1,3,3};
int a6[] = new int[]{4,3,2,1};
int[] a [] = new int[][]{a1,a2,a3};
int[] b [] = new int[][]{a4,a5,a6};
System.out.println(Arrays.equals(a, b));//输出false
System.out.println(Arrays.deepEquals(a, b));//输出true
7、toString和deepToString
toString:对于一个数组int a[] = new int[]{1,9,5,4,6,4,7,1};如果按照System.out.println(a);打印企图可以打印出[1,9,5,4,6,4,7,1],实际上只会打印出[I@3e2de41d这种。在打印数组的时候需要写成Arrays.toString(a)的形式。可参考sort的详解。
deepToString:当数组中又包含数组,那么就不能单存的利用Arrays.toString()了,请看例子。
int a1[] = new int[]{1,2,3};
int a2[] = new int[]{1,3,3};
int a3[] = new int[]{4,3,2,1};
int[] a [] = new int[][]{a1,a2,a3};
System.out.println(Arrays.toString(a));
System.out.println(Arrays.deepToString(a));
输出:
[[I@659e0bfd, [I@2a139a55, [I@15db9742]
[[1, 2, 3], [1, 3, 3], [4, 3, 2, 1]]
实际上这个和equals与deepEquals类似