1.说一下你理解的什么是HashMap?
特性:
储存的是键值对,线程不安全,非Synchronied,储存的比较快,能够接受null。
工作原理:
Map的put(key,value)来储存元素,通过get(key)来得到value值,通过hash算法来计算hascode值,用hashCode标识Entry在bucket中存储的位置,储存结构就算哈希表。
2.hashMap与Hashtable区别?
2.1、继承的父类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
2.2、线程安全性不同
Hashtable 线程安全:因为它每个方法中都加入了Synchronize,对整个table加锁
HashMap是线程不安全的:HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。
2.3、是否提供contains方法
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。
Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。
2.4、key和value是否允许null值
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
Hashtable中,key和value都不允许出现null值。
2.5、两个遍历方式的内部实现上不同
HashMap使用 Iterator。
Hashtable使用Iterator,还使用了Enumeration的方式 。
2.6、hash值不同
HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
2.7、内部实现使用的数组初始化和扩容方式不同
HashTable初始默认容量为11,Hashtable不要求 底层数组的容量一定要为2的整数次幂, Hashtable扩容时,将容量变为原来的2倍加1,
而HashMap初始默认容量为为16,而HashMap则要求一定为2的整数次幂,而HashMap扩容时,将容量变为原来的2倍。
3.HashMap的(底层数据结构)?
在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用[链表]处理冲突,同一hash值的键值对会被放在同一个位桶里,当桶中元素较多时,通过key值查找的效率较低。
而JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8),时,将链表转换为[红黑树],这样大大减少了查找时间。
Ps:今天的三道题已经结束了,欣赏一下吧。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/114987.html