我是靠谱客的博主 着急老虎,最近开发中收集的这篇文章主要介绍HashMap详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、继承关系:

  • java.lang.Object
    • java.util.AbstractMap<K,V>
      • java.util.HashMap<K,V>
2、HashTable基于Map接口的实现,这一实现提供了所有的Map接口的实现,并且允许null值和null键。(HashMap类和HashTable大致上是一样的,除了有2点不同之处,即为HashMap是非同步的[线程不安全的]和允许null值存在)。该类对Map中元素的顺序并未做出任何保证,尤其是,它不能保证随着时间的改变其顺序不发生变化。

3、该类中,put和get方法的执行时间为常数级的,因为我们假定了Map中的元素已经按照哈希功能分开存储。HashMap在扩展自身容量时,基于集合视图的迭代是要发费一定比例时间的。因此如果迭代功能很重要的话,不要把初始容量大小设置太高的做法是很重要的。

4、HashMap中有两个参数会影响其实例化:初始容量和载入属性。容量是哈希表中哈希元的数量,初始容量就是哈希表创建时的容量,载入属性是一种决定方式,该方式确定了在HashTable自动增长容量之前是如何判定HashTable中元素是否已满。当哈希表的入口数多于载入属性的实例和其当前容量时,HashTable会重新执行其哈希功能(也就是说,内部数据结构会被重新创建)以便哈希表的哈希元能够变为大约原来的两倍。

5、通常来讲,默认载入属性都会在时间和空间上有一个很好的权衡。较高的值会降低使用空间但也会增加查表成本(会影响HashMap大部分的操作,包括get和put方法)。在开始设置容量时,应充分考虑到Map的进入元素数和载入属性,以便将哈希功能重构次数最小化,如果初始化容量大于根据载入属性而进入Map中的元素数,那么重构哈希功能将不会出现。

6、HashMap中如果有很多映射,那么创建一个更加有效的大容量将使得映射存储更加有效,而不是让其根据需要自动增长大小。

注意,这一实现是不同步的,如果多个线程同时使用了HashMap,而且至少一个线程修改了HashMap的结构,它在外面看起来一定是要同步的(结构改变包括,添加或删除一个或者多个映射,仅仅改变某个键对应的值不算是结构改变),这通常由同步一些包含Map的对象来完成。如果这样的对象不存在,那么我们需要通过Collections.synchronizedMap 方法来将其包裹在内。这最好在创建时就执行,以阻止发生一些不必要的事情:

 Map m = Collections.synchronizedMap(new HashMap(...));
7、由类的迭代器返回的迭代次数是实效很迅速的:在迭代创建后的如果集合set发生修改,除了通过迭代器自身的remove方法外的其它任何方法,迭代会抛出异常ConcurrentModificationException。 因此,就同时修改元素而言,迭代会迅速且全部失效,而不是冒险去出现一些在未来某时不确定的行为。

注意迭代器的fail-fast特性不能保证,正如在非同步化修改中做保证也是不可能的。fail-fast迭代次数会在被动的尽力的基础上抛出 ConcurrentModificationException异常。因此,写一个依赖此异常来判定其正确性的程序的想法是错误的:迭代器里的fail-fast

行为仅应该被用作查找bug。

8、常用方法:

Modifier and Type Method and Description
void clear()
Removes all of the mappings from this map.
Object clone()
Returns a shallow copy of this  HashMap instance: the keys and values themselves are not cloned.
boolean containsKey(Object key)
Returns  true if this map contains a mapping for the specified key.
boolean containsValue(Object value)
Returns  true if this map maps one or more keys to the specified value.
Set<Map.Entry<K,V>> entrySet()
Returns a  Set view of the mappings contained in this map.
V get(Object key)
Returns the value to which the specified key is mapped, or  null if this map contains no mapping for the key.
boolean isEmpty()
Returns  true if this map contains no key-value mappings.
Set<K> keySet()
Returns a  Set view of the keys contained in this map.
V put(K key, V value)
Associates the specified value with the specified key in this map.
void putAll(Map<? extends K,? extends V> m)
Copies all of the mappings from the specified map to this map.
V remove(Object key)
Removes the mapping for the specified key from this map if present.
int size()
Returns the number of key-value mappings in this map.
Collection<V> values()
Returns a  Collection view of the values contained in this map.

  • Methods inherited from class java.util.AbstractMap

    equals, hashCode, toString
  • Methods inherited from class java.lang.Object

    finalize, getClass, notify, notifyAll, wait, wait, wait
  • Methods inherited from interface java.util.Map

    equals, hashCode


最后

以上就是着急老虎为你收集整理的HashMap详解的全部内容,希望文章能够帮你解决HashMap详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部