常用工具类- Arrays


最近的一次面试被提问到了关于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());
	}
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值