一、HashMap,HashTable,TreeMap,WeakHashMap有那些区别?
java为数据结构中的映射定义了一个接口 java.util.Map。它包括三个实现类:HashMap,HashTable,TreeMap。Map是用来存储键值对的数据结构,在数组中通过数组下标来对其内容引索,而在Map中是通过对象进行引索,用来引索的对象叫做key,其对应的对象叫做value。
(1)HashMap
- HashMap允许空(null)键值(key),并且最多只允许一条记录的键为空。
- 把HashTable的contains方法去掉了。、
- 是线程不安全的。
- 迭代器使用的Iterator。
- hash数组默认大小为16,并且一定是2的指数。
- 其key采用的是"强引用"的方式,当HashMap中的key没有被外部引用时,只有在这个key从HashMap中删除后,才能被垃圾回收器回收。
- HashMap里面存入的键值对在取出时间上没有固定顺序,是随机得。
(2)HashTable
- 不允许出现空键值。、
- 线程安全的。
- 迭代器使用的是 Enumeration。
- hash数组默认大小是11,增加方式是old*2+1。
(3)TreeMap
实现了SortMap接口,能够把它保存的记录根据键排序,因此取出的是排序后的家键值对,如果需要按照自然顺序和自定义顺序遍历键,TreeMap更好。
(4)WeakHashMap
其key采用的是“弱引用”的方式,只要WeakHashMap中的key不再被外部引用,他就可以被垃圾回收期回收。
常见的笔试题:
- 在HashTable中的上下文中,同步指的是什么?
答案:同步意味着在一个时间点只能有一个线程修改hash表,任何线程在执行HashTable的更新操作前都要获得对象锁,其他线程则等待锁的释放。 - 如何实HashMao同步?
答案:HashMap可以通过Map m = Collections.synchronizedMap(new HashMao())来到达到同步的现过,具体而言,该方法返回一个同步的Map,该Map封装了底层HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。