• hashmap和hashtable


    面试常见题目,问了我们,我们菜鸟能说些啥,看源码我表示看不懂。
    我们回答一些别人总结出来的吧,表示自己大概知道这些东西。
    1、线程安全
    hashtable是线程安全的,hashmap不是线程安全的
    hashtable为啥线程安全?它的源码里面所有的元素操作都是synchronized修饰的,
    像public synchronized v put(k key, v value);和 public synchronized v get (object key);

    2、性能优劣
    hashtable是线程安全,是因为它在操作的时候,只能运行它一个线程,其他方法都要被他阻塞,
    所以hashtable性能差,hashmap性能好。面试官问有没有其他可以代替hashtable的,我们要回答
    ConcurrentHashMap。我们初级会经常使用多线程吗?多线程高并发我表示用不到,但是这又是很重要的。
    你去百度一下,ConcurrentHashMap,你就会看到“ConcurrentHashMap是Java中的一个线程安全且高效的HashMap实现
    平时涉及高并发如果要用map结构,那第一时间想到的就是它。”

    3、关于null空值问题
    hashtable的键和值都不允许为空。
    hashmap的键只能有一个为空,值可以很多个为空。

    4、容量扩容
    hashmap初始容量:16    负载因子0.75   扩容规则:当前容量翻倍
    hashtable初始容量:11     负载因子0.75   扩容规则:当前容量翻倍加一


    因为hashtable有更好的替代者,已经被弃用了,HashTable的类注释

    If a thread-safe implementation is not needed, it is recommended to use HashMap in place of Hashtable.
    If a thread-safe highly-concurrent implementation is desired, then it is recommended to
    use java.util.concurrent.ConcurrentHashMap in place of Hashtable.

    如果你不需要线程安全,那么使用HashMap,如果需要线程安全,那么使用ConcurrentHashMap。HashTable已经被淘汰了,不要在新的代码中再使用它。

    问题:
    ConcurrentHashMap为什么比hashtable好?

    回答:

    ConcurrentHashMap底层采用分段的数组(HashEntry)+链表实现,Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分段技术

    锁分段技术首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

    ConcurrentHashMap提供了与Hashtable不同的锁机制。Hashtable中采用的锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是一次锁住一个桶。

    ConcurrentHashMap默认将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。

    下面主要讲讲hashmap

    1、hashmap底层数据结构
    jdk1.7的存储结构是数组+链表,到了jdk1.8变成了数组+链表+红黑树

    上图是jdk1.7,下图是jdk1.8
    注意:只有在链表的长度不小于8,而且数组的长度不小于64的时候才会将链表转化为红黑树

    链表增删效率高,红黑树查找效率高,所以jdk1.8以后hashmap增删效率高,查找效率也提升了。

    问题之为什么不直接用红黑树而还要保存链表呢

    (1)构造红黑树比构造链表复杂,在链表的节点不多的时候,从整体的性能看来, 数组+链表+红黑树的结构可能不一定比数组+链表的结构性能高。就好比杀鸡焉用牛刀的意思。
    (2)hashmap是固定容量的,如果hashmap频繁的扩容,会造成底部红黑树不断的进行拆分和重组,这是非常耗时的。因此,也就是链表长度比较长的时候转变成红黑树才会显著提高效率。

    关于详细的可以去下面文章里面去看

    转载:https://zhuanlan.zhihu.com/p/51593918?utm_source=wechat_session&utm_medium=social&utm_oi=909339736806662144

    https://zhuanlan.zhihu.com/p/79219960?utm_source=wechat_session&utm_medium=social&utm_oi=909339736806662144

    https://www.cnblogs.com/heyonggang/p/9112731.html

  • 相关阅读:
    tar.xz文件格式的压缩与解压
    touch命令创建文件
    ls命令
    redis中键空间通知
    socket.io笔记三之子命名空间的socket连接
    Java内部类的使用小结
    如何禁用Chrome浏览器的Flash
    Hibernate Tools插件的安装和使用
    JDBC DataSource
    Tomcat中用JNDI方式加载JDBC DataSource以连接数据库
  • 原文地址:https://www.cnblogs.com/lhh666/p/12044103.html
Copyright © 2020-2023  润新知