区别
- 都是实现集合框架中的list,即所谓有序集合,具体功能近似,都按照位置进行定位、添加、删除元素,都提供迭代器以遍历其内容等。
- Vector是Java早期提供线程安全的动态数组,如不需线程安全,不建议选择,毕竟不同有额外开销。Vector内部使用对象数组来保存数据,可以根据需要自动增加容量
当数量已满,会创建新的数组,并拷贝原有数组数据 - ArrayList是应用更广泛的动态数组,非线程安全,性能要好一点。与Vector近似,ArrayList也可根据需要调整容量,不过两者逻辑不同,Vector扩容会提供1倍,而ArrayList则是50%
- Linked顾名思义是Java提供的双向链表,不需要扩容,非线程安全
应用
若是对集合的插入、修改、删除比较多,则选择双向链表LinkedList;
若是随机访问比较多,则是动态数组ArrayList
熟悉基础算法
归并排序,交换排序(冒泡,快排),选择,插入排序 不稳定的是(快排,堆排)
掌握利用内存和外部存储处理超大数据集,至少理解过程和思路
集合框架
- Collection接口是所有集合的根
- List有序可重复集合,方便访问、插入、删除等操作,继承其的抽象子类为abstractLIst,编程使用的子类为ArrayList,Vector(子类Stack),AbstractSequentialList(实际是子类LinkedList)
- Set
无不可重复集合是与List最明显的区别,即不存在两个对象equals返回true。抽象子类AbstractSet,SortedSet,实现子类HastSet(及其子类LinkedHashSet),TreeSet
java提供的标准队列结构实现.有抽象子类AbstractQueue,实现子类(priorityQueue,ArrayQueue)
TreeSet支持自然顺序访问,但是添加、更新、删除、包含操作相对低效(log(n)).
HashSet利用hash算法,理想情况,如果hash正常,提供o(n)时间复杂度级别的添加、删除、包含操作,不保证有序
LinkedHashSet 内部构建一个记录插入顺序的双向链表,因此提供安装插入顺序遍历的能力,与此同时,也保证o(n)的添加、删除、包含等操作,效率低于hashset,因为维护链表的开销
遍历元素时,hashset性能受自身容量影响,初始化时,除非有必要,不易将hashmap容量设置过大,LinkedHashSet,其内部链表提供的副本,遍历性能与元素有关系。
集合线程安全处理
- 当前集合都是线程非安全,需要一些机制去保证并发编程的线程安全问题,如使用synchronized,或锁机制
- Collections工具类中的synchronize修饰的方法
其get,set,add等方法,都通过添加synchronized关键字来修饰方法,实现线程安全访问,添加基本同步支持,简单粗暴但也非常实用。
但是这些方法创建的线程安全集合都符合fail-firt,当发生意外并发修改,尽早抛出ConcurrentModificationException异常,以避免不可预计行为。
例子:
static <T> List<T> synchronizeList(List<T> list);
例子:List list = Collections.synchronizeList(new ArrayList());
原始数据类型,目前使用的是双轴快速排序(Dual-pivot quickSort),改进型的快速排序算法
对象数据类型:TimSort,将归并和二分插入排序结合的优化排序算法(查找数据集中已经排好序的分区(此处叫run),然后合并这些分区来达到排序目的.
java8 引入并行排序算法(parallelSort),充分利用多核CPU算力,底层实现基于fork-join框架,对于超大数据量,性能提供较大,具体取决于CPU和OS
- java8 支持lambda,Stream,使用类spark pipeline的方式进行处理集合,将上一个处理的输出作为下一个处理的输入,实现函数式编程
- java9 java标准类库提供一系列静态工厂方法,如List.of()[对象不可修改,内部也不可修改],Set.Of(),大大简化构建小容器代码量
ArrayList<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");
静态工厂方法(变量不可变),线程安全,不可变的故不需要考虑扩容,空间更紧凑:
List<String> simpleList = List.of("Hello","world");