Java集合框架
Java集合框架概述
- Java集合体系
- 集合可以看作一种容器,用来存储对象信息,所有集合类都位于 java.util 包中。支持多线程的集合类位于 java.util.concurrent 包中
- 集合和数组的区别
- 数组用于保存长度不可变化而且不具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据
- 数组元素既可以是基本类型的值,也可以保存对象,而集合类只能保存对象
- Java 集合大致分成 List、Set、Queue、Map 四种接口体系
- List:有序可重复集合
- Set:无序不重复集合
- Queue:队列集合
- Map:映射集合,key-value形式,根据 key 查找 value
集合常见接口及实现类
Set 集合
- Set 接口是继承了 Collection 接口的子接口,Set 集合和 Collection 集合的方法相同,不允许存储相同的元素
- 常用的实现类
- HashSet(最常用)
- LinkedHashSet:HashSet 的子类,但是使用链表维护元素次序,元素顺序与添加顺序一致,因此性能略低于 HashSet(插入、删除),但是迭代遍历所有元素时性能较高
- TreeSet:SortedSet 接口的实现类,可以保证元素处于排序状态,使用红黑树进行存储,支持自然排序和定制排序,因为使用红黑树算法维持元素次序,因此性能低于 HashSet(特别是插入、查询时)
- EnumSet:专为枚举类设计的集合类,不允许添加 null 值,集合元素有序,以枚举值在枚举类中定义的顺序来决定集合元素顺序。Set 实现类中性能最好,但是只能保存同一个枚举类的枚举值作为集合元素
List 集合
- 代表一个有序、可重复集合,每个元素都有对应的顺序索引,默认按照添加元素的顺序设置索引
- 常用实现类
- ArrayList(最常用):动态数组,允许任何符合规则的元素插入(包括 null),有初始容量,每次添加元素都会进行容量检查,快溢出时就会进行扩容操作
- LinkedList:除了可以根据索引访问元素,还实现了 Deque 接口,可以作为双端队列使用(既可以当栈,又可以当队列)。内部以链表保存元素,因此随机访问性能较差,但是插入、删除性能较高
- Vector:操作跟 ArrayList 基本一样,但是是线程安全的动态数组
- Stack:继承自 Vector,实现一个后进先出的堆栈
- Iterator:集合的迭代器,集合可以 Iterator 去遍历集合中的元素
- ListIterator:提供了专门操作集合的方法,增加了向前迭代的功能(Iterator 只能向后迭代),还可以通过 add() 向List 集合中添加元素(Iterator 只能删除)
Map 集合
- 常见方法
- 常用实现类
- HashMap:基于 hashing 原理,通过 put() 和 get() 存储、获取对象,存储对象时,使用 put(),调用键对象的的 hashCode() 方法计算 hashCode 值,然后找到 bucket 中的位置进行值对象存储,获取对象时,通过键对象的 equals() 方法找到正确的键值对,然后返回对象
HashMap 原理相关 - HashTable:跟 HashMap 的关系类似于 ArrayList 和 Vector 的关系,HashTable 是线程安全的,但是不允许使用 null 作为 key/value 值(会发生空指针异常) HashTable 原理相关
- LinkedHashMap:使用双向链表维护 key-value 次序,顺序与插入顺序一致,性能比 HashMap 低,但迭代访问时性能更好
- Properties:HashTable 的子类,相当于一个 key/value 都是 string 类型的 Map,主要用于读取配置文件
- TreeMap:SortedMap 的实现类,是一个红黑树的数据结构,可以根据 key 对节点进行自然排序或者定制排序
- HashMap:基于 hashing 原理,通过 put() 和 get() 存储、获取对象,存储对象时,使用 put(),调用键对象的的 hashCode() 方法计算 hashCode 值,然后找到 bucket 中的位置进行值对象存储,获取对象时,通过键对象的 equals() 方法找到正确的键值对,然后返回对象