zoukankan      html  css  js  c++  java
  • 【面试题】由HashMap引发的一系列追问

     HashMap和HashTable的区别

    同:HashMap和Hashtable都实现了Map接口。

    异:HashMap允许null的键值对,非同步的,非线程安全的,效率高;

    HashTable不允许null的键值对,同步的,线程安全的,效率低。

    PS:HashMap非线程安全,使用put()操作容易导致死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。

    什么叫线程安全?

    线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 

    线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

     HashMap原理

      HashMap基于Hashing原理,是数组和链表的结合体,我们通常使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象。

    HashMap中遇到碰撞怎么解决?

    因为HashMap使用链表存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在链表中,形成一个Entry链。

    HashMap扩容机制

      当创建 HashMap 时,有一个默认的负载因子(load factor),其默认值为 0.75。当HashMap的容量超过“初始容量X负载因子”时,就会调用rehash()方法进行扩容。扩容是新创建一个HashMap,然后把所有的键值对都移植过来,最后删除旧的HashMap的过程。

    HashTable和ConcurrentHashMap

      HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2不但不能使用put方法添加元素,并且也不能使用get方法来获取元素,所以竞争越激烈效率越低。

      ConcurrentHashMap采用的锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。效率明显高于HashTable。

      ConcurrentHashMap中每一个segment段的数据结构和Hashmap的数据结构一样。

           PS:HashTable是全局加锁,ConcurrentHashMap是分段加锁,一个segment一个锁,整个ConcurrentHashMap会有多个锁,所以效率远远高于HashTable。

  • 相关阅读:
    大数据问题集锦
    分析JMeter聚合报告中的各项指标
    Jmeter之正则表达式提取器应用
    mysql忘记密码怎么办?
    ARIMA模型
    ADF检验
    第13章 时间序列分析和预测
    pandas的基本功能
    pandas库
    PS常用快捷键
  • 原文地址:https://www.cnblogs.com/lucky-girl/p/8818647.html
Copyright © 2011-2022 走看看