美文网首页
Java集合——HashMap

Java集合——HashMap

作者: 涉川gw | 来源:发表于2018-05-12 10:15 被阅读0次

一、概述
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的性能。

相关文章

  • Java集合系列-HashMap 1.8(一)

    原创文章,转载请标注出处:《Java集合系列-HashMap 1.8(一)》、《Java集合系列-HashMap ...

  • 收藏夹

    博文 Java 集合:Java 集合学习指南 Java 集合:Java 集合源码剖析 HashMap:HashMa...

  • java基础之集合略解

    Java集合:整体结构 HashMap剖析 Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例...

  • 计划

    1、java集合类:HashMap ConcurrentHashMap; HashMap:https://ww...

  • HashMap剖析

    Java集合:HashMap源码剖析 一、HashMap概述 二、HashMap的数据结构 三、HashMap源码...

  • 面试的问题

    java集合框架: 1:介绍一下java的集合框架 2:HashMap遇见哈希冲突会如何怎么办?HashMap是线...

  • Java集合:HashMap源码剖析

    非常推荐Java集合:HashMap源码剖析 1.HashMap概述     HashMap基于哈希表的 Map ...

  • Java并发包之ConcurrentHashMap

    之前整理了一份Java中常用的集合类的基本特性:Java常用集合类图解详细介绍了HashMap:HashMap之浅...

  • HashMap、HashTable和ConCurrentHash

    资料:HashMap和HashTable到底哪不同?Java集合——HashMap、HashTable以及ConC...

  • Java自学-集合框架 HashMap

    Java集合框架 HashMap 示例 1 : HashMap的键值对 HashMap储存数据的方式是—— 键值对...

网友评论

      本文标题:Java集合——HashMap

      本文链接:https://www.haomeiwen.com/subject/wikqdftx.html