Java 基础 - 集合
Set 集合
Set 集合通常不能记住元素的添加顺序。Set 集合不允许包含相同的元素。
- HashSet 是 Set 接口的实现类,按照 Hash 算法存储集合中的元素。HashSet 不是同步的,如果多个线程同时访问一个 HashSet,则必须通过代码来保证其同步。集合元素值可以是 null。
- LinkedHashSet 是一个 HashSet 的子类,也是根据元素的 hashcode 值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得看起来是以插入顺序保存的。因为需要维护元素的插入顺序,因此性能略低于 HashSet 的性能。
- TreeSet 是 SortedSet 接口的实现类,正如 SortedSet 名字所暗示的,TreeSet 可以确保集合元素处于排序状态。TreeSet 采用「红黑树」的数据结构来存储集合元素。TreeSet 支持两种排序方法:自然排序和定制排序。如果试图将一个对象添加到 TreeSet 时,该对象的类必须实现 Comparable 接口,否则,程序将会抛出
ClassCastException
异常。TreeSet 只能添加同一种类型的对象。 - EnumSet 是专门为枚举类设计的集合类,EnumSet 的集合元素也是有序的,以枚举值在 Enum 类内的定义顺序决定集合元素的顺序。EnumSet 集合不允许加入 null 元素。
Set 实现类的性能分析
HashSet 和 TreeSet 是 Set 中两个典型的实现,HashSet 性能总是比 TreeSet 好,因为 TreeSet 需要额外的红黑树算法维护集合元素的次序。但需要保持排序的 Set 时,才应该使用 TreeSet,否则都应该使用 HashSet。
HashSet 还有一个子类:LinkedHashSet。对于普通的插入、删除操作,LinkedHashSet 比 HashSet 要略微慢一点,这是由于维护链表所带来的开销造成的。但是由于有了链表,遍历 LinkedHashSet 会更快。
EnumSet 是所有 Set 实现类中性能最好的。
需要注意的是: Set 的三个实现类 HashSet TreeSet EnumSet 都是线程不安全的。通常可以通过 Collections 工具类的 synchronizedSortedSet 方法来包装 Set 集合。此操作最好在创建时进行,防止对 Set 集合意外的非同步访问。
List 集合
List 集合代表一个元素有序、可重复的集合。索引从0开始。
- void add(int index, Object element) 将元素插入到 List 集合的 index 处
- boolean addAll(int index, Collection c) 将集合 c 所包含的元素插入到 List 集合的 index 处
- Object get(int index) 返回集合 index 索引处的元素
- int indexOf(Object o) 返回对象 o 在 List 集合中第一次出现的位置索引
- int lastIndexOf(Object o) 返回对象 o 在 List 集合最后一次出现的位置索引
- Object remove(int index) 删除并返回 index 索引处的元素
- Object set(int index, Object element) 将 index 索引处的元素替换为 element 对象,返回被替换的旧元素。这里的 index 不能超出已有的索引长度
- LIst subList(int fromIndex, int toIndex) 返回从索引 fromIndex (包含) 到索引 toIndex (不包含)处所有的集合元素组成的子集合。果然,超出了索引,就会报错
java.lang.IndexOutOfBoundsException
- void replaceAll(UnaryOperator operator) 根据 operator 指定的计算规则重新设置 List 集合的所有元素
- void sort(Comparaotr c) 根据 Comparator 参数对 List 集合的元素排序
各种线性表的性能分析
List 就是一个线性表的接口,而 ArrayList、LinkedList 又是线性表的两种典型:基于数组的线性表和基于链的线性表。Queue 代表了队列,Deque 代表了双端队列(既可以作为队列使用,也可以作为栈使用)。
LinkedList 集合不仅提供了 List 的功能,还提供了双端队列、栈的功能。
数组以一块连续内存保存所有的数组元素,所以数组在随机访问时性能最好;内部以链表作为底层实现的集合在执行插入、删除操作时有较好的性能。总体来讲,ArrayList 性能要比 LinkedList 的性能要好,因此,大部分时候使用都应该考虑使用 ArrayList。
Map 集合
以上是 Java 基础 - 集合 的全部内容, 来源链接: utcz.com/z/394515.html