Java集合2
1、ArrayList 与 Vector 区别呢?为什么要⽤Arraylist取代Vector呢?
ArrayList 是 List 的主要实现类,底层使⽤ Object[ ] 存储,适⽤于频繁的查找⼯作,线
程不安全 ;
Vector 是 List 的古⽼实现类,底层使⽤ Object[ ] 存储,线程安全的。
2、HashMap 和 Hashtable 的区别
- 线程是否安全: HashMap 是⾮线程安全的, HashTable 是线程安全的,因为 HashTable 内
部的⽅法基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使⽤
ConcurrentHashMap 吧!); - 效率: 因为线程安全的问题, HashMap 要⽐ HashTable 效率⾼⼀点。另外, HashTable
基本被淘汰,不要在代码中使⽤它; - 对 Null key 和 Null value 的⽀持: HashMap 可以存储 null 的 key 和 value,但 null 作为
键只能有⼀个,null 作为值可以有多个;HashTable 不允许有 null 键和 null 值,否则会抛出
NullPointerException 。 - 初始容量⼤⼩和每次扩充容量⼤⼩的不同 : ① 创建时如果不指定容量初始值, Hashtable
默认的初始⼤⼩为 11,之后每次扩充,容量变为原来的 2n+1。 HashMap 默认的初始化⼤
⼩为 16。之后每次扩充,容量变为原来的 2 倍。② 创建时如果给定了容量初始值,那么
Hashtable 会直接使⽤你给定的⼤⼩,⽽ HashMap 会将其扩充为 2 的幂次⽅⼤⼩
( HashMap 中的 tableSizeFor() ⽅法保证,下⾯给出了源代码)。也就是说 HashMap 总
是使⽤ 2 的幂作为哈希表的⼤⼩,后⾯会介绍到为什么是 2 的幂次⽅。 - 底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了⼤的变化,当链表⻓度
⼤于阈值(默认为 8)(将链表转换成红⿊树前会判断,如果当前数组的⻓度⼩于 64,那么
会选择先进⾏数组扩容,⽽不是转换为红⿊树)时,将链表转化为红⿊树,以减少搜索时
间。Hashtable 没有这样的机制。