Java刷题笔记—–>集合类

一般提到某某集合区别,感觉必有线程安全
Arrylist线程不安全,Vector反之

几个方面:线程是否安全,效率问题,对Null Key和Null value的支持,初始容量大小和每次扩容量大小的不同,底层数据结构的不同(这又涉及到链表和红黑树了,而面试很喜欢考红黑树。。。)

HashMapHashSet 实现了Map接口 实现Set接口

原因在于并发下的Rehash会造成元素之间形成一个循环列表。不过JDK1.8后解决了这个问题,但是不建议在多线程下使用HahsMap,因为多线程下HashMap还是会存在其他问题比如数据丢失。并发环境下推荐使用ConcurrentHashMap。

1. List

  • Arraylist : Object[] 数组
  • Vector : Object[] 数组
  • LinkedList : 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
    2. Set
  • HashSet (无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素
  • LinkedHashSet : LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现一样, 不过还是有一点点区别的
  • TreeSet (有序,唯一): 红黑树(自平衡的排序二叉树)
    3. Map
  • HashMap : JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链 表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突 时有了较大的变化,当链表⻓度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如 果当前数组的⻓度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链 表转化为红黑树,以减少搜索时间
  • LinkedHashMap : LinkedHashMap 继承自 HashMap ,所以它的底层仍然是基于拉链式散 列结构即由数组和链表或红黑树组成。另外, LinkedHashMap 在上面结构的基础上,增加 了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的 操作,实现了访问顺序相关逻辑。
  • Hashtable : 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的
  • TreeMap : 红黑树(自平衡的排序二叉树)

主要根据集合的特点来选用,比如我们需要根据键值获取到元素值时就选用 Map 接口下的集 合,需要排序时选择 TreeMap ,不需要排序时就选择 HashMap ,需要保证线程安全就选用
ConcurrentHashMap 。
当我们只需要存放元素值时,就选择实现 Collection 接口的集合,需要保证元素唯一时选择实现 Set 接口的集合比如 TreeSet 或 HashSet ,不需要就选择实现 List 接口的比如 ArrayList 或 LinkedList ,然后再根据实现这些接口的集合的特点来选用。

Original: https://www.cnblogs.com/GeniusWang/p/15644214.html
Author: Genius_Wang
Title: Java刷题笔记—–>集合类

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/583142/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球