话不多说,直接上图:
Java 集合,也称作容器,主要是由两大接口 (Interface) 派生出来的:
Collection 和 Map
顾名思义,容器就是用来存放数据的。
那么这两大接口的不同之处在于:
- Collection 存放单一元素;
- Map 存放 key-value 键值对。
学习这些集合框架,我认为有 4 个目标:
- 明确每个接口和类的对应关系;
- 对每个接口和类,熟悉常用的 API;
- 对不同的场景,能够选择合适的数据结构并分析优缺点;
- 学习源码的设计,面试要会答啊。
ArrayList于LinkedList区别级别
数组和链表的最大区别就是数组是可以随机访问的
- 改查选择 ArrayList; 增删在尾部的选择 ArrayList;
- 增删选择 LinkedList;
Vector
Vector有一些年代感了,底层也是用数组来实现,它加了太多的 synchronized, 线程安全的成本就是效率低,在某些系统里很容易成为瓶颈,所以现在大家不再在数据结构的层面加 synchronized,而是把这个任务转移给我们程序员== ArrayList右移补位,扩充1.5倍 Vector右移补位,扩充2倍
List和Set比较
List 的特定是有序,可重复的
Set 的特定是无序,不重复
Set实现类
HashSet: 采用 Hashmap 的 key 来储存元素,主要特点是无序的,基本操作都是 O(1) 的时间复杂度,很快。
LinkedHashSet: 这个是一个 HashSet + LinkedList 的结构,特点就是既拥有了 O(1) 的时间复杂度,又能够保留插入的顺序。
TreeSet: 采用红黑树结构,特点是可以有序,可以用自然排序或者自定义比较器来排序;缺点就是查询速度没有 HashSet 快。