
list、set、map的区别:
list和set都实现了collection接口
-
List:允许重复、可以有多个null元素、有序(输出的顺序就是插入的顺序):ArrayList、LinkedList、Vector
-
set:不允许重复对象、无序排序、只允许有一个空元素:HashSet、LinkedHashSet、treeSet
-
Map:Map是一个接口,Map可以有多个null值但最多只能有一个null键:HashMap、Hashtable 、TreeMap
ArrayList、LinkedList和Vector的区别:
ArrayList:通过索引,访问速度快
LinkedList: LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据 时只需要记录本项前后项即可,插入数据较快
Vector:线程安全, Vector由于使用了synchronized方法-线程安全,所以性能上比ArrayList要差
HashMap、 Hashtable和TreeMap的区别:
这三个都对Map接口进行了实现:
-
HashMap是不安全的线程,他允许Key值出现一次null,Value值出现无数次的Null
-
Hashtable是安全的线程,他不仅实现了Map接口也实现了Dictionary接口,他的key值与Value值都不允许出现Null
-
treeMap是可以进行排序的,默认按照键的自然顺序进行升序排序,若要进行降序排序则需要在构造集合时候传递一个比较器
Hashtable和HashMap 的区别:
-
HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
-
HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许key值只能由一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。
-
HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。
-
HashTable使用Enumeration,HashMap使用Iterator。
-
HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
-
哈希值的使用不同,HashTable直接使用对象的hashCode。
什么场景下使用list,set,map?
- 如果经常会使用索引来对容器中的元素进行访问,那么 List 是正确的选择。如果已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList。
- 如果想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。
- 如果你保证插入元素的唯一性,也就是不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性比如 TreeSet 还是一个 SortedSet,所有存储于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 进行排序。LinkedHashSet 也按照元素的插入顺序对它们进行存储。
- 如果以键和值的形式进行数据存储那么 Map 是正确的选择。可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择。
HashMap 和 Hashtable 的区别?
- 线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过synchronized 修饰。(如果要保证线程安全的话就使用 ConcurrentHashMap );
- 效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;
- 对Null key 和Null value的支持: HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛出 NullPointerException。
- 初始容量大小和每次扩充容量大小的不同 :
- ①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
- ②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小(HashMap 中的tableSizeFor()方法保证,下面给出了源代码)。也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。
- 底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
HashMap 和 HashSet区别?

HashMap的底层实现?
- HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体。 只是在JDK1.8中,链表长度大于8的时候,链表会转成红黑树。
- 在调用 HashMap 的 put 方法添加元素时,会对key的hashCode()做hash运算,计算index; 如果没碰撞直接放到bucket里; 如果碰撞了,以链表的形式存在buckets后; 如果碰撞导致链表过长(大于等于TREEIFY_THRESHOLD),就把链表转换成红黑树(JDK1.8中的改动); 如果节点已经存在就替换old value(保证key的唯一性) 如果bucket满了(超过load factor*current capacity),就要resize。
- 在调用 HashMap 的 get 方法获取元素时,会对key的hashCode()做hash运算,计算index; 如果在bucket里的第一个节点里直接命中,则直接返回; 如果有冲突,则通过key.equals(k)去查找对应的Entry。
ArrayList和LinkedList的区别是什么 ?
- ArrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 0(1),而 LinkedList 是 0(n)
ArrayList 和 Vector 的区别是什么?
- Vector 使用了 synchronized 来实现线程同步,是线程安全的,而ArrayList 是非线程安全的。
- Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 0.5 倍。
HashMap 和 HashTable 的区别?
- HashMap 允许空值键,HashTable 不允许。
- HashMap 线程不安全(效率高),HashTable 线程安全。