本篇讲述Java在集合类中新特性,以及方法使用。
Java8在Collection中增加了一些接口和默认方法,如下:
/**
* 1,如果向集合里添加null,使用contains(null),也可以返回true
* boolean contains(Object o);
*/
Collection<Object> collection=new ArrayList<>();
collection.add(null);
System.out.println(collection.contains(null));//true
/**
* 2,深层拷贝,修改数组的数据不会对集合里的元素产生影响。
* 注意:只能返回Object[],不能强制转换其他类型,如需要转型,使用下面带泛型的方法。
*
* Object[] toArray();
*/
List<String> toarray=new ArrayList<>();
toarray.add("1");
toarray.add("2");
Object[] objects=toarray.toArray();//如果将Object换成String将编译不通过
/**
*3, <T> T[] toArray(T[] a);
* 带泛型的深层拷贝
*/
List<String> tArr=new ArrayList<>();
tArr.add("hello");
tArr.add("world");
String[] strings=new String[tArr.size()];
strings=tArr.toArray(strings);
/**
*4, 保留a集合里的元素
* boolean retainAll(Collection<?> a);
*/
List<String> bigArr=new ArrayList<>();
bigArr.add("hello");
bigArr.add("world");
bigArr.add("!!!");
bigArr.retainAll(tArr);
System.out.println("bigArr:"+bigArr.toString());//bigArr:[hello, world]
/**
*5,如过a.equals(b),则hashCode()肯定相同,反之不一定,非java8
* int hashCode();
*/
/**
6,针对parallelStream()添加的方法,用于分割集合,进行并行处理,
针对Spliterator我们要着重讲一下。
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
*/
//Spliterator例子:
<-------------------------------------------------------------------------------------->
public static void main(String[] args){
SpIt spIt=new SpIt();
spIt.test();
}
static class SpIt{
AtomicInteger count = new AtomicInteger(0);
List<String> strList = createList();//创建list
Spliterator spliterator = strList.spliterator();//分割list
public void test(){
for(int i=0;i<4;i++){
new MyThread().start();
}
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("结果为:" + count);
}
//自己写一个MyThread类
class MyThread extends Thread{
@Override
public void run() {
String threadName = Thread.currentThread().getName();
System.out.println("线程"+threadName+"开始运行-----");
//trySplit() 分割list,返回一个新分割出的spliterator实例给新的线程
//forEachRemaining:将剩下的元素遍历
spliterator.trySplit().forEachRemaining(new Consumer() {
@Override
public void accept(Object o) {
if(isInteger((String)o)){
int num = Integer.parseInt(o +"");
count.addAndGet(num);
System.out.println("数值:"+num+"------"+threadName);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
System.out.println("线程"+threadName+"运行结束-----");
}
}
private List<String> createList(){
List<String> result = new ArrayList<>();
for(int i=0; i<100; i++){
if(i % 10 == 0){
result.add(i+"");
}else{
result.add("hello");
}
}
return result;
}
public boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}
//运行结果:
/**
* 线程Thread-0开始运行-----
* 线程Thread-1开始运行-----
* 线程Thread-2开始运行-----
* 数值:0------Thread-0
* 数值:50------Thread-1
* 数值:80------Thread-2
* 线程Thread-3开始运行-----
* 数值:90------Thread-3
* 线程Thread-2运行结束-----
* 数值:60------Thread-1
* 数值:10------Thread-0
* 线程Thread-3运行结束-----
* 数值:20------Thread-0
* 数值:70------Thread-1
* 线程Thread-1运行结束-----
* 数值:30------Thread-0
* 数值:40------Thread-0
* 线程Thread-0运行结束-----
* Disconnected from the target VM, address: '127.0.0.1:50010', transport: 'socket'
* 结果为:450
*/
/*
* 7,将集合转换成Steam对象,
* stream();
*/
Stream stream=bigArr.stream();//对流后续的操作后续再看
long count=stream.count();
System.out.println(count);//2
/**
* 8,parallelStream其实就是一个并行执行的流.它通过默认的ForkJoinPool,
* 可能提高你的多 线程任务的速度.
* parallelStream();
*/
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
numbers.parallelStream()
.forEach(System.out::println);//683524917
numbers.parallelStream()
.forEachOrdered(System.out::println);//123456789//按numbers顺序输出