Java集合——HashMap

2018-05-12  本文已影响0人  涉川gw

一、概述
HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,不保证该顺序恒久不变。HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。容量 是哈希表中桶的数量,初始容量 只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
通常,默认加载因子是 0.75, 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。
二、HashMap的常用api

//------构造函数------
// 默认构造函数。
HashMap()
// 指定“容量大小”的构造函数
HashMap(int capacity)
// 指定“容量大小”和“加载因子”的构造函数
HashMap(int capacity, float loadFactor)
// 包含“子Map”的构造函数
HashMap(Map<? extends K, ? extends V> map)
//------构造函数------

//-----常用方法------
void                 clear()
Object               clone()
boolean              containsKey(Object key)
boolean              containsValue(Object value)
Set<Entry<K, V>>     entrySet()
V                    get(Object key)
boolean              isEmpty()
Set<K>               keySet()
V                    put(K key, V value)
void                 putAll(Map<? extends K, ? extends V> map)
V                    remove(Object key)
int                  size()
Collection<V>        values()
//-----常用方法------

HashMap的继承关系

java.lang.Object
   ↳     java.util.AbstractMap<K, V>
         ↳     java.util.HashMap<K, V>

public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable { }

从继承结构图可以看出,HashMap继承了AbstractMap类,实现了Map接口。Map是"key-value键值对"接口,AbstractMap实现了"键值对"的通用函数接口。
三、HashMap遍历
1、遍历键值对

//  map是HashMap对象
// map中的key是String类型,value是Integer类型
Integer integ = null;
//首先根据entrySet获取HashMap的键值对set集合,再通过iterator进行迭代
Iterator iter = map.entrySet().iterator();
while(iter.hasNext()) {
    Map.Entry entry = (Map.Entry)iter.next();
    // 获取key
    key = (String)entry.getKey();
        // 获取value
    integ = (Integer)entry.getValue();
}

2、遍历键

String key = null;
Integer integ = null;
//根据keySet()获取HashMap的“键”的Set集合,再进行迭代
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
        // 获取key
    key = (String)iter.next();
        // 根据key,获取value
    integ = (Integer)map.get(key);
}

3、遍历值

Integer value = null;
//根据value()获取HashMap的“值”的集合,再进行迭代
Collection c = map.values();
Iterator iter= c.iterator();
while (iter.hasNext()) {
    value = (Integer)iter.next();
}

四、总结
(1) 扩容是一个特别耗性能的操作,所以在使用HashMap的时候,应该提前估算map的大小,初始化的时候给一个大致的数值,避免频繁的扩容。

(2) 负载因子是可以修改的,也可以大于1,但是不建议轻易修改。

(3) HashMap是线程不安全的,不要在并发的环境中同时操作HashMap。

(4) JDK1.8引入红黑树大程度优化了HashMap的性能。

上一篇 下一篇

猜你喜欢

热点阅读