Java集合
List,Set,Map三者的区别
- List :存储的元素是有序的、可重复的
- Set : 存储的元素是⽆序的、不可重复的
- Map : Key 是⽆序的、不可重复的,value 是⽆序的、可重复
List
- Arraylist : Object[] 数组
- Vector : Object[] 数组
- LinkedList : 双向链表
Set
- HashSet (⽆序,唯⼀): 基于 HashMap 实现的,底层采⽤ HashMap 来保存元素
- LinkedHashSet : LinkedHashSet 是 HashSet 的⼦类,并且其内部是通过 LinkedHashMap 来实现的
- TreeSet (有序,唯⼀): 红⿊树(⾃平衡的排序⼆叉树)
Map
- HashMap : JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突⽽存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突 时有了较⼤的变化,当链表⻓度⼤于阈值(默认为 8)(将链表转换成红⿊树前会判断,如 果当前数组的⻓度⼩于 64,那么会选择先进⾏数组扩容,⽽不是转换为红⿊树)时,将链表转化为红⿊树,以减少搜索时间
- LinkedHashMap : LinkedHashMap 继承⾃ HashMap ,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红⿊树组成。另外, LinkedHashMap 在上⾯结构的基础上,增加了⼀条双向链表,使得上⾯的结构可以保持键值对的插⼊顺序。同时通过对链表进⾏相应的操作,实现了访问顺序相关逻辑。
- Hashtable : 数组+链表组成的
- TreeMap : 红⿊树(⾃平衡的排序⼆叉树)
Arraylist 与 LinkedList 区别
- 底层数据结构: Arraylist 底层使⽤的是 Object 数组; LinkedList 底层使⽤的是双向链表
- 是否⽀持快速随机访问: LinkedList 不⽀持,ArrayList ⽀持。(对应于 get(int index)⽅法)
- 内存空间占⽤: ArrayList 在 list 列表的结尾会预留⼀定的容量空间,⽽ LinkedList 的每⼀个元素都需要消耗⽐ ArrayList 更多的空间
ArrayList 与 Vector 区别
- ArrayList 是 List 的主要实现类,底层使⽤ Object[ ] 存储,适⽤于频繁的查找⼯作,线程不安全
- Vector 是 List 的古⽼实现类,底层使⽤ Object[ ] 存储,线程安全
HashMap 和 Hashtable 的区别
- 线程是否安全: HashMap 是⾮线程安全的, HashTable 是线程安全的,因为 HashTable 内部的⽅法基本都经过 synchronized 修饰。(如果要保证线程安全就使⽤ConcurrentHashMap)
- 效率: 因为线程安全的问题, HashMap 要⽐ HashTable 效率⾼⼀点
- 对 Null key 和 Null value 的⽀持: HashMap 可以存储 null 的 key 和 value;HashTable 不允许有 null 键和 null 值
- 底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较⼤的变化,当链表⻓度⼤于阈值(默认为 8)(将链表转换成红⿊树前会判断,如果当前数组的⻓度⼩于 64,那么 会选择先进⾏数组扩容,⽽不是转换为红⿊树)时,将链表转化为红⿊树,以减少搜索时间。Hashtable 没有这样的机制。
HashMap 和 HashSet区别
- HashSet 底层就是基于 HashMap 实现的
HashSet、LinkedHashSet 和 TreeSet 三者的异同
- HashSet 是 Set 接⼝的主要实现类 , HashSet 的底层是 HashMap ,线程不安全的,可以存储 null 值
- LinkedHashSet 是 HashSet 的⼦类,能够按照添加的顺序遍历
- TreeSet 底层使⽤红⿊树,能够按照添加顺序进⾏遍历