简介明了啊…
jdk已经描述了,自己总结一下。可以从两个方面考虑:一是底层依赖的数据结构,二是自身实现机制。
ArrayList和Vector的大小基于可变数组的实现,所以对于数据的随机读取存在极大的优势,但是对于除了尾部数据插入和删除性能相对较差,对于随机的插入和删除可以选择 AbstractSequentialListArrayList是非线程安全的,如果有线程安全可以使用Vector,或者使用 Collections.synchronizedList 方法将该列表“包装”起来,或CopyOnWriteArrayList“随着向 ArrayList 中不断添加元素,其容量也自动增长”,也说明了ArrayList不要频繁和大量的插入数据,数组的扩容和数据的拷贝都比较消耗性能ArrayList是按照被插入的顺序保存元素,很多时候项目编码时,是个不错的选择ArrayList本身源码比较简单,在使用是最好可以提前预估数据的大小,在创建ArrayList的时候分配合适的初始化大小。 这里主要看一下ArrayList的扩容机制,其实也比较简单,在插入数据都会先检查一下此时的数据容量是否已经达到列表大小,如果达到则进行扩容和数据拷贝,如下面代码,其中oldCapacity >> 1代表着oldCapacity的二分之一大小。
/** * Increases the capacity to ensure that it can hold at least the * number of elements specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }Java8之后支持了Lambda和Stream,对应集合的操作也有了相应的扩展,比如集合可以创建相应的Steam和ParallelStream的方法实现。简单列子:
public static void main(String[] args) { List<String> list = Arrays.asList("王一一","","张三","李四","王五","赵六","刘七"); System.out.println("列表值:" + list); long count = list.stream().filter(data -> data.isEmpty()).count(); System.out.println("空字符串的数量:" + count); List<String> newList = list.stream().map(data -> data+"+1").collect(Collectors.toList());; System.out.println("每个元素都+1 :" + newList); String strs = list.stream().filter(data -> !data.isEmpty()).collect(Collectors.joining(", ")); System.out.println("合并集合中非空字符串:" + strs); //输出每个元素 list.stream().sorted().forEach(System.out :: println); }