@author ixenos

 摘要:HashMap内部结构分析

 

 

Java HashMap采用的是冲突链表方式

 Java 集合 HashMap & HashSet 拾遗

 

  • 从上图容易看出,如果选择合适的散列函数,put()get()方法可以在常数时间内完成,因为较好的散列减少了散列冲突,使时间主要花在对桶寻址上(数组),而较少去遍历桶中的链表。但在对HashMap进行迭代时,需要遍历整个table以及后面跟的冲突链表。因此对于迭代比较频繁的场景,不宜将HashMap的初始大小设的过大。
  • 有两个参数可以影响HashMap的性能:初始容量(inital capacity)和负载系数(load factor)。初始容量指定了初始table的大小,负载系数用来指定自动扩容的临界值。当entry的数量超过capacity*load_factor时,容器将自动扩容并重新哈希。对于插入元素较多的场景,将初始容量设大可以减少重新哈希的次数。
  • 将对向放入到HashMap或HashSet中时,有两个方法需要特别关心:hashCode()equals()hashCode()方法决定了对象会被放到哪个bucket里,当多个对象的哈希值冲突时,equals()方法决定了这些对象是否是“同一个对象”。所以,如果要将自定义的对象放入到HashMapHashSet中,需要@Override hashCode()equals()方法。

 

 

由Value得Key


  • many-to-one ( 多Key映射一Value ):遍历整个Map的entry然后得到所要求的key
  • public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
        Set<T> keys = new HashSet<T>();
        for (Entry<T, E> entry : map.entrySet()) {
        //判断当前entry是否含有value
            if (Objects.equals(value, entry.getValue())) {
        //通过含有value的entry得到对应的key
                keys.add(entry.getKey());
            }
        }
        return keys;
    }
    View Code

相关文章:

  • 2022-01-22
  • 2022-12-23
  • 2021-05-27
  • 2021-07-04
  • 2021-10-15
  • 2022-01-19
  • 2021-11-21
  • 2021-09-06
猜你喜欢
  • 2021-10-06
  • 2021-12-19
  • 2021-08-26
  • 2021-11-29
  • 2021-11-26
  • 2021-07-25
  • 2021-06-28
相关资源
相似解决方案