考察目的
这个问题一般考察1~3年开发经验。
考察目的仍然是看求职者对Java基础的掌握程度。
集合是Java基础中非常重要的组件,除了根据不同数据结构选择合适的集合类。还需要从安全性、性能、功能特性角度去了解集合的差异性以及底层工作原理。如果达不到这个层次,在使用的时候遇到问题影响就比较大。
因此这也是人才筛选比较基础的一部分。
问题分析
Hashtable和HashMap都是一个基于hash表实现的K-V结构的集合。
Hashtable是JDK1.0引入的一个线程安全的集合类,因为所有数据访问的方法都加了一个Synchronized同步锁。
Hashtable内部采用数组加链表来实现,链表用来解决hash冲突的问题。
HashMap是JDK1.2引入的一个线程不安全的集合类,HashMap内部也是采用了数组加链表实现,在JDK1.8版本里面做了优化,引入了红黑树。
当链表长度大于等于8并且数组长度大于64的时候,就会把链表转化为红黑树,提升数据查找性能。
问题解答
从功能特性的角度来说
1、HashTable 是线程安全的,而HashMap不是。
2、HashMap的性能要比HashTable更好,因为,HashTable采用了全局同步锁来保证安全性,对性能影响较大
从内部实现的角度来说
1、HashTable使用数组加链表、HashMap采用了数组+链表+红黑树
2、HashMap初始容量是16、HashTable初始容量是11。
3、HashMap可以使用null作为key,HashMap会把null转化为0进行存储,而Hashtable不允许。
最后,他们两个的key的散列算法不同,HashTable直接是使用key的hashcode对数组长度做取模。
而HashMap对key的hashcode做了二次散列,从而避免key的分布不均匀问题影响到查询性能。
总结
对于这类问题,要能够获得面试官的认可,必须要做两个动作
-
平时要注意总结
-
回答的逻辑结构要清晰,临阵磨枪很难达到这种状态。