码迷,mamicode.com
首页 > 编程语言 > 详细

Java 基础 - 集合

时间:2019-03-14 00:17:05      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:exception   允许   indexof   col   linked   索引   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 基础 - 集合

标签:exception   允许   indexof   col   linked   索引   java 基础   否则   线程   

原文地址:https://www.cnblogs.com/michael-xiang/p/10527428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!