最近的一次面试被提问到了关于Java常用的工具类的问题,首当其冲的就是Arrays类,当时的问题让我尴尬不已,写了那么多的代码,对于这个工具类的方法知之甚少。利用休息的时间把这个Arrays类里的方法研究一下。
sort()和parallelSort()
用的最多的应该就是sort方法了,对于各类型的数组排序都会使用到。如果是对象(Object)的话一定要实现Comparable接口的compareTo()方法,否则就会出现转换异常并提示,cannot be cast to java.lang.Comparable。
public int compareTo(Students o) {
// 逆序,如果要顺序的话,讲大于和小于的返回值更改一下就好了
if(o.id>this.id)//大于
return 1;
else if( o.id<this.id){//小于
return -1;
}else //等于
<span style="white-space:pre"> </span>return 0;
}
讲到了sort方法就不得不得提parallelSort()方法(并行排序)可能是因为的机器和环境的原因吧,反正在20W条数据的排序中,并行依旧比串行慢。再多的数据,就没测试了,等待时间太长了。
Students[] arrs=new Students[2000000];
for (int i = 0; i <arrs.length; i++) {
arrs[i]=new Students(i, "新生"+i, "男", new Date(), "搞笑");
}
long startTime=System.currentTimeMillis();
Arrays.parallelSort(arrs);
//Arrays.sort(arrs);
long endTime =System.currentTimeMillis();
System.out.println("sort 用时:"+(endTime-startTime));
copyOf()和copyOfRange()
接着又提到了怎么延长数组的长度。哎,当时也是太紧张了,脑袋里都是懵的。现在想起来,如果是二维数组的话,不需要什么方法,默认就是动态长度的。如果是一维数组的话,通过新建一个数组,然后用Arrays类中的copyOf()方法或者System类中的arraycopy()方法拷贝一下就好了。
copyOfRange()可以拷贝指定范围内的数组元素。
Students[] arrs=new Students[4];
for (int i = 0; i <arrs.length; i++) {
arrs[i]=new Students(i, "新生"+i, "男", new Date(), "搞笑");
}
Students[] arrs2=new Students[5];
arrs2=Arrays.copyOf(arrs, arrs.length);
for (int i = 0; i < arrs2.length; i++) {
System.out.println(arrs[i].toString());
}
asList()
对于数组转List,Arrays也提供了方法。
Students[] arrs=new Students[5];
for (int i = 0; i <3; i++) {
arrs[i]=new Students(i, "新生"+i, "男", new Date(), "搞笑");
}
arrs[4]=new Students(4, "新生"+4, "男", new Date(), "搞笑");
List<Students> list=Arrays.asList(arrs);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i)==null?"空的":list.get(i));
}
equals()
对比两个数组是否一样,对比长度和其内部的每一个元素。
Students[] arrs=new Students[5];
for (int i = 0; i <5; i++) {
arrs[i]=new Students(i, "新生"+i, "男", new Date(), "搞笑");
}
Students[] arrs2=Arrays.copyOf(arrs, arrs.length);
System.out.println(Arrays.equals(arrs, arrs2));
fill()
新元素填充满整个数组。
Students[] arrs=new Students[5];
for (int i = 0; i <5; i++) {
arrs[i]=new Students(i, "新生"+i, "男", new Date(), "搞笑");
}
Arrays.fill(arrs, new Students(99, "新生"+99, "男", new Date(), "搞笑") );
for (int i = 0; i < arrs.length; i++) {
System.out.println(arrs[i]==null?"空的":arrs[i]);
}
binarySearch()
二分查找法,用于查询类是否在数组中。注意:如果是查询对象数组,一定要实现Comparable接口,同时数组不能有NULL对象,否则会出现空指针异常。
Students[] arrs=new Students[5];
for (int i = 0; i <5; i++) {
arrs[i]=new Students(i, "新生"+i, "男", new Date(), "搞笑");
}
System.out.println(Arrays.binarySearch(arrs, arrs[3]));
stream()
转换成Stream,暂时还没搞懂用法和用途。
Students[] arrs=new Students[5];
for (int i = 0; i <5; i++) {
arrs[i]=new Students(i, "新生"+i, "男", new Date(), "搞笑");
}
Stream<students> strm=Arrays.stream(arrs);
System.out.println(strm.findFirst().toString());
parallelPrefix()
使用指定的函数并行累积数组中的每个数据,暂时还没搞用途。
BinaryOperator<students> bio=new BinaryOperator<students>() {
public Students apply(Students t, Students u) {
t.setId(t.getId()+u.getId());
return t;
}
};
Arrays.parallelPrefix(arrs, bio);
for (Students students : arrs) {
System.out.println(students.toString());
}
spliterator()
返回数组的分片迭代器,暂时还没搞用途。
Students[] arrs=new Students[5];
for (int i = 0; i <5; i++) {
arrs[i]=new Students(i, "新生"+i, "男", new Date(), "搞笑");
}
Spliterator<students> spliterator=Arrays.spliterator(arrs);
spliterator.forEachRemaining(new Consumer<students>() {
public void accept(Students t) {
System.out.println(t.toString());
}
});