1、HashMap 和 HashTable 区别
(1) 线程安全性不同
HashMap 是线程不安全的,HashTable 是线程安全的,其中的方法是 Synchronize 的,在多线程并发的情况下,可以直接使用 HashTable,但是使用 HashMap 时必须自己增加同步处理。
(2) 是否提供 contains 方法
HashMap 只有 containsValue 和 containsKey 方法。HashTable 有 contains、containsKey 和 containsValue 三个方法,其中 contains 和 containsValue方法功能相同。
(3) key 和 value 是否允许 null 值
Hashtable 中,key 和 value 都不允许出现 null 值。HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。
(4) 数组初始化和扩容机制
HashTable 在不指定容量的情况下的默认容量为 11,而 HashMap 为 16,Hashtable 不要求底层数组的容量一定要为 2 的整数次幂,而 HashMap 则要求一定为 2 的整数次幂。Hashtable 扩容时,将容量变为原来的 2 倍加 1,而 HashMap 扩容时,将容量变为原来的 2 倍。
2、TreeSet 和 HashSet 区别
HashSet 是采用 hash 表来实现的。其中的元素没有按顺序排列,add()、remove() 以及 contains() 等方法都是复杂度为 O(1) 的方法。
TreeSet 是采用树结构实现(红黑树)。元素是按顺序进行排列,add()、remove()以及 contains()等方法都是复杂度为 O(log(n)) 的方法。它还提供了一些方法来处理排序的 set,first(),last() 等。
3、List 的题
4、ArrayList 大小
5、ArrayList 扩容过程
6、HashMap 和 TreeMap 区别
相同点:
HashMap 非线程安全,TreeMap 非线程安全,都继承了 AbstractMap。
不同点:
1、HashMap:基于哈希表实现。使用 HashMap 要求添加的键类明确定义了 hashCode() 和 equals()(可以重写 hashCode() 和 equals()),为了优化 HashMap 空间的使用,您可以调优初始容量和负载因子。
TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
2、HashMap:适用于在 Map 中插入、删除和定位元素。
TreeMap:适用于按自然顺序或自定义顺序遍历键(key)。
HashMap 通常比 TreeMap 快一点(树和哈希表的数据结构使然),建议多使用 HashMap,在需要排序的 Map 时候才用 TreeMap。
HashMap 的结果是没有排序的。TreeMap 实现 SortMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。HashMap 里面存入的键值对在取出的时候是随机的,它根据键的 HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在 Map 中插入、删除和定位元素,HashMap 是最好的选择。TreeMap 取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
总结:
1、实现
TreeMap:SortedMap 接口,基于红黑树
HashMap:基于哈希散列表实现
2、存储
TreeMap:默认按键的升序排序
HashMap:随机存储
3、遍历
TreeMap:Iterator 遍历是排序的
HashMap:Iterator 遍历是随机的
4、性能损耗
TreeMap:插入、删除
HashMap:基本无
5、键值对
TreeMap:键、值都不能为 null
HashMap:只允许键、值均为 null
6、安全
TreeMap:非并发安全 Map
HashMap:非并发安全 Map
7、效率
TreeMap:低
HashMap:高
一般情况下我们选用 HashMap,因为 HashMap 的键值对在取出时是随机的,其依据键的 hashCode 和键的 equals 方法存取数据,具有很快的访问速度,所以在 Map 中插入、删除及索引元素时其是效率最高的实现。而 TreeMap 的键值对在取出时是排过序的,所以效率会低点。