Java Map接口详解

18、Java中Map接口及实现详解 本文详细解析了Java中Map接口及其常见实现类的功能、特点和使用场景。文章涵盖Map接口的基本方法和特性,重点介绍了HashMap、TreeMap、LinkedHashMap、WeakHashMap等实现类的核心机制和适用场景。同时,还探讨了Map接口的操作流程、性能考量、线程安全实现方式、高级特性(如流和Lambda表达式处理Map)、性能优化技巧以及在缓存、配置文件解析、数据统计等领域的综合应用。通过本文,读者可以全面掌握Map接口的使用并有效提升程序的性能和可靠性。 阅读详情

Map 概述

  1. Map与Collection并列存在。用于保存具有映射关系的数据:key-value
  2. Map 中的key 和value 都可以是任何引用类型的数据
  3. Map 中的key 用Set来存放,不允许重复,即同一个Map 对象所对应的类,须重写hashCode()和equals()方法
  4. 常用String类作为Map的“键”
  5. key 和value 之间存在单向一对一关系,即通过指定的key 总能找到唯一的、确定的value
  6. Map接口的常用实现类:HashMap、TreeMap、LinkedHashMap和Properties。
  7. HashMap 是Map 接口使用频率最高的实现类

2、Map 常用方法

  • 添加、删除、修改操作:
  • Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
  • void putAll(Map m):将m中的所有key-value对存放到当前map中
  • Object remove(Object key):移除指定key的key-value对,并返回value
  • void clear():清空当前map中的所有数据
  • 元素查询的操作:
  • Object get(Object key):获取指定key对应的value
  • boolean containsKey(Object key):是否包含指定的key
  • boolean containsValue(Object value):是否包含指定的value
  • int size():返回map中key-value对的个数
  • boolean isEmpty():判断当前map是否为空
  • boolean equals(Object obj):判断当前map和参数对象obj是否相等
  • 元视图操作的方法:
  • Set keySet():返回所有key构成的Set集合
  • Collection values():返回所有value构成的Collection集合
  • Set entrySet():返回所有key-value对构成的Set集合

3、Map的实现类之一:HashMap

3.1 HashMap的存储结构

JDK 7及以前版本:HashMap是 数组+链表 结构(即为链地址法)

JDK 8版本发布以后:HashMap是 数组+链表+红黑 树 实现。

JDK7:

JDK8:

3.2 HashMap概述

Map中的key: 无序的、不可重复的 ,使用Set存储所有的key。key所在的类要重写equals()和hashCode() (以HashMap为例)

Map中的value: 无序的、可重复的 ,使用Collection存储所有的value。value所在的类要重写equals()

一个键值对:key-value构成了一个Entry对象。

Map中的entry: 无序的、不可重复的 ,使用Set存储所有的entry

3.3 HashMap源码分析

JDK7

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

   /**
    * The default initial capacity - MUST be a power of two.
    */
   static final int DEFAULT_INITIAL_CAPACITY = 16;

   /**
    * The maximum capacity, used if a higher value is implicitly specified
    * by either of the constructors with arguments.
    * MUST be a power of two <= 1<<30.
    */
   static final int MAXIMUM_CAPACITY = 1 << 30;

   /**
    * The load factor used when none specified in constructor.
    */
   static final float DEFAULT_LOAD_FACTOR = 0.75f;

   /**
    * The table, resized as necessary. Length MUST Always be a power of two.
    */
   transient Entry<K,V>[] table;


   /**
   * The number of key-value mappings contained in this map.
   */
   transient int size;

   /**
   * The next size value at which to resize (capacity * load factor).
   * @serial
   */
   int threshold;

   /**
   * The load factor for the hash table.
   *
   * @serial
   */
   final float loadFactor;


   /**
    * Constructs an empty <tt>HashMap</tt> with the specified initial
    * capacity and the default load factor (0.75).
    *
    * @param initialCapacity the initial capacity.
    * @throws IllegalArgumentException if the initial capacity is negative.
    */
   public HashMap(int initialCapacity) {
       this(initialCapacity, DEFAULT_LOAD_FACTOR);
  }

   /**
    * Constructs an empty <tt>HashMap</tt> with the default initial capacity
    * (16) and the default load factor (0.75).
    */
   public HashMap() {
       this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);
  }

   /**
    * Constructs an empty <tt>HashMap</tt> with the specified initial
    * capacity and load factor.
    *
    * @param initialCapacity the initial capacity
    * @param loadFactor     the load factor
    * @throws IllegalArgumentException if the initial capacity is negative
    *         or the load factor is nonpositive
    */
   public HashMap(int initialCapacity, float loadFactor) {
       if (initialCapacity < 0)
           throw new IllegalArgumentException("Illegal initial capacity: " +
                                              initialCapacity);
       // initialCapacity:默认 16
       // MAXIMUM_CAPACITY: 1<<30
       // 一般此处都跳过                                      
       if (initialCapacity > MAXIMUM_CAPACITY)
           initialCapacity = MAXIMUM_CAPACITY;
       if (loadFactor <= 0 || Float.isNaN(loadFactor))
           throw new IllegalArgumentException("Illegal load factor: " +
                                              loadFactor);

       // Find a power of 2 >= initialCapacity
       int capacity = 1;
       // 找一个 2的平方 > 初始化容量,就跳出
       // capacity : 16
       while (capacity < initialCapacity)
           capacity <<= 1;

       this.loadFactor = loadFactor;
       // 临界值:16 * 0.75=12
       threshold = (int)Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
       // 创建数组
       table = new Entry[capacity];
       useAltHashing = sun.misc.VM.isBooted() &&
              (capacity >= Holder.ALTERNATIVE_HASHING_THRESHOLD);
       init();
  }
}

JDK8

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

   /**
    * The default initial capacity - MUST be a power of two.
    */
   static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

   /**
    * The maximum capacity, used if a higher value is implicitly specified
    * by either of the constructors with arguments.
    * MUST be a power of two <= 1<<30.
    */
   static final int MAXIMUM_CAPACITY = 1 << 30;

   /**
    * The load factor used when none specified in constructor.
    */
   static final float DEFAULT_LOAD_FACTOR = 0.75f;

   /**
    * The bin count threshold for using a tree rather than list for a
    * bin. Bins are converted to trees when adding an element to a
    * bin with at least this many nodes. The value must be greater
    * than 2 and should be at least 8 to mesh with assumptions in
    * tree removal about conversion back to plain bins upon
    * shrinkage.
    */
   static final int TREEIFY_THRESHOLD = 8;

   /**
    * The bin count threshold for untreeifying a (split) bin during a
    * resize operation. Should be less than TREEIFY_THRESHOLD, and at
    * most 6 to mesh with shrinkage detection under removal.
    */
   static final int UNTREEIFY_THRESHOLD = 6;

   /**
    * The smallest table capacity for which bins may be treeified.
    * (Otherwise the table is resized if too many nodes in a bin.)
    * Should be at least 4 * TREEIFY_THRESHOLD to avoid conflicts
    * between resizing and treeification thresholds.
    */
   static final int MIN_TREEIFY_CAPACITY = 64;  


   /**
    * Basic hash bin node, used for most entries. (See below for
    * TreeNode subclass, and in LinkedHashMap for its Entry subclass.)
    */
   static class Node<K,V> implements Map.Entry<K,V> {
       final int hash;
       final K key;
       V value;
       Node<K,V> next;

       Node(int hash, K key, V value, Node<K,V> next) {
           this.hash = hash;
           this.key = key;
           this.value = value;
           this.next = next;
      }

       public final K getKey()       { return key; }
       public final V getValue()     { return value; }
       public final String toString() { return key + "=" + value; }

       public final int hashCode() {
           return Objects.hashCode(key) ^ Objects.hashCode(value);
      }

       public final V setValue(V newValue) {
           V oldValue = value;
           value = newValue;
           return oldValue;
      }

       public final boolean equals(Object o) {
           if (o == this)
               return true;
           if (o instanceof Map.Entry) {
               Map.Entry<?,?> e = (Map.Entry<?,?>)o;
               if (Objects.equals(key, e.getKey()) &&
                   Objects.equals(value, e.getValue()))
                   return true;
          }
           return false;
      }
  }


   /**
    * Constructs an empty <tt>HashMap</tt> with the specified initial
    * capacity and load factor.
    *
    * @param initialCapacity the initial capacity
    * @param loadFactor     the load factor
    * @throws IllegalArgumentException if the initial capacity is negative
    *         or the load factor is nonpositive
    */
   public HashMap(int initialCapacity, float loadFactor) {
       if (initialCapacity < 0)
           throw new IllegalArgumentException("Illegal initial capacity: " +
                                              initialCapacity);
       if (initialCapacity > MAXIMUM_CAPACITY)
           initialCapacity = MAXIMUM_CAPACITY;
       if (loadFactor <= 0 || Float.isNaN(loadFactor))
           throw new IllegalArgumentException("Illegal load factor: " +
                                              loadFactor);
       this.loadFactor = loadFactor;
       this.threshold = tableSizeFor(initialCapacity);
  }

   /**
    * Constructs an empty <tt>HashMap</tt> with the specified initial
    * capacity and the default load factor (0.75).
    *
    * @param initialCapacity the initial capacity.
    * @throws IllegalArgumentException if the initial capacity is negative.
    */
   public HashMap(int initialCapacity) {
       this(initialCapacity, DEFAULT_LOAD_FACTOR);
  }

   /**
    * Constructs an empty <tt>HashMap</tt> with the default initial capacity
    * (16) and the default load factor (0.75).
    */
   public HashMap() {
       this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
  }  



}    
public V put(K key, V value) {
   return putVal(hash(key), key, value, false, true);
}

/**
* Implements Map.put and related methods
*
* @param hash hash for key
* @param key the key
* @param value the value to put
* @param onlyIfAbsent if true, don't change existing value
* @param evict if false, the table is in creation mode.
* @return previous value, or null if none
*/
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
              boolean evict) {
   Node<K,V>[] tab; Node<K,V> p; int n, i;
   if ((tab = table) == null || (n = tab.length) == 0)
       n = (tab = resize()).length;
   if ((p = tab[i = (n - 1) & hash]) == null)
       tab[i] = newNode(hash, key, value, null);
   else {
       Node<K,V> e; K k;
       // hashcode相等,key也相等,就覆盖原来数据
       if (p.hash == hash &&
          ((k = p.key) == key || (key != null && key.equals(k))))
           e = p;
       else if (p instanceof TreeNode)
           e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
       else {
           for (int binCount = 0; ; ++binCount) {
               if ((e = p.next) == null) {
                   p.next = newNode(hash, key, value, null);
                   if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                       // 红黑树
                       treeifyBin(tab, hash);
                   break;
              }
               if (e.hash == hash &&
                  ((k = e.key) == key || (key != null && key.equals(k))))
                   break;
               p = e;
          }
      }
       // 1. key是null
       // 2. hash值不等
       // 3. hash值相等,key不等
       if (e != null) { // existing mapping for key
           V oldValue = e.value;
           if (!onlyIfAbsent || oldValue == null)
               e.value = value;
           afterNodeAccess(e);
           return oldValue;
      }
  }
   ++modCount;
   if (++size > threshold)
       resize();
   afterNodeInsertion(evict);
   return null;
}

3.4 HashMap的底层实现原理

  • jdk7说明:
  1. HashMap map = new HashMap()
  2. 在实例化以后,底层创建了长度是16的一维数组Entry[] table。
  3. 首先,调用key1所在类的hashCode()计算key1哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置。
  1. 如果key1的哈希值与已经存在的数据的 哈希值都不相同 ,此时key1-value1添加成功。 情况2
  2. 如果key1的哈希值和已经存在的某一个数据(key2-value2)的哈希值相同,继续比较:调用key1所在类的equals(key2)方法,比较:
  3. 如果 equals()返回false: 此时key1-value1添加成功。 情况3
  4. 如果equals()返回true:使用value1替换value2。
  5. 如果 此位置上的数据为空 ,此时的key1-value1添加成功。 情况1
  6. 如果此位置上的数据不为空,(意味着此位置上存在一个或多个数据(以链表形式存在)),比较key1和已经存在的一个或多个数据的哈希值:
  7. 补充:关于情况2和情况3:此时key1-value1和原来的数据以链表的方式存储。
  1. 在不断的添加过程中,会涉及到扩容问题,当超出临界值(且要存放的位置非空)时,扩容。默认的扩容方式:扩容为原来容量的2倍,并将原有的数据复制过来。
  • jdk8 相较于jdk7在底层实现方面的不同:
  1. new HashMap():底层没有创建一个长度为16的数组
  2. jdk 8底层的数组是:Node[],而非Entry[]
  3. 首次调用put()方法时,底层创建长度为16的数组
  4. jdk7底层结构只有: 数组+链表 。jdk8中底层结构: 数组+链表+红黑树 。
  1. 形成链表时,七上八下(jdk7:新的元素指向旧的元素。jdk8:旧的元素指向新的元素)
  2. 当数组的某一个索引位置上的元素以链表形式存在的数据个数 > 8 且当前数组的长度 > 64时,此时此索引位置上的所数据改为使用红黑树存储。

3.5 HashMap常用常量

  1. DEFAULT_INITIAL_CAPACITY : HashMap的默认容量,默认值:16
  2. MAXIMUM_CAPACITY :HashMap的最大支持容量,默认值:2^30
  3. DEFAULT_LOAD_FACTOR :HashMap的默认加载因子,默认值:0.75
  4. TREEIFY_THRESHOLD :Bucket中链表长度大于该默认值,转化为红黑树,默认值:8
  5. UNTREEIFY_THRESHOLD :Bucket中红黑树存储的Node小于该默认值,转化为链表,默认值:6
  6. MIN_TREEIFY_CAPACITY :桶中的Node被树化时最小的hash表容量。(当桶中Node的数量大到需要变红黑树时,若hash表容量小于MIN_TREEIFY_CAPACITY时,此时应执行resize扩容操作这个MIN_TREEIFY_CAPACITY的值至少是TREEIFY_THRESHOLD的4倍。),默认值:64
  7. table :存储元素的数组,总是2的n次幂
  8. entrySet :存储具体元素的集
  9. size :HashMap中存储的键值对的数量
  10. modCount :HashMap扩容和结构改变的次数。
  11. threshold :扩容的临界值=容量*填充因子
  12. loadFactor :填充因子

3.6 HashMap什么时候进行扩容和树形化呢?

当HashMap中的元素个数超过数组大小(数组总大小length,不是数组中个数size)*loadFactor时,就 会 进 行 数 组 扩 容 ,loadFactor的 默 认 值(DEFAULT_LOAD_FACTOR)为0.75,这是一个折中的取值。

默认情况下,数组大小(DEFAULT_INITIAL_CAPACITY)为16,那么当HashMap中元素个数超过160.75=12(这个值就是代码中的threshold值,也叫做临界值)的时候,就把数组的大小扩展为216=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能。

当HashMap中的其中一个链的对象个数如果达到了8个,此时如果capacity没有达到64,那么HashMap会先扩容解决,如果已经达到了64,那么这个链会变成树,结点类型由Node变成TreeNode类型。 当然,如果当映射关系被移除后,下次resize方法时判断树的结点个数低于6个,也会把树再转为链表。

4、Map的实现类之二:HashMap的子类LinkedHashMap

  1. LinkedHashMap是HashMap的子类
  2. 在HashMap存储结构的基础上,使用了一对 双向链表 来记录 添加元素的顺序
  3. 与LinkedHashSet类似,LinkedHashMap可以维护Map 的迭代顺序:迭代顺序与Key-Value 对的插入顺序一致

5、Map的实现类之三:TreeMap

  1. TreeMap存储Key-Value 对时,需要根据key-value 对进行排序。
  2. TreeMap可以保证所有的Key-Value 对处于 有序状态 。
  3. TreeSet底层使用 红黑树结构 存储数据
  4. TreeMap的Key 的排序:
  1. 自然排序 :TreeMap的所有的Key 必须实现Comparable 接口,而且所有的Key 应该是同一个类的对象,否则将会抛出ClasssCastException
  2. 定制排序 :创建TreeMap时,传入一个Comparator 对象,该对象负责对TreeMap中的所有key 进行排序。此时不需要Map 的Key 实现Comparable 接口
  1. TreeMap判断两个key相等的标准: 两个key通过compareTo()方法或者compare()方法返回0 。

6、Map的实现类之四:Hashtable

  1. Hashtable是个古老的Map 实现类,JDK1.0就提供了。
  2. 不同于HashMap,Hashtable是 线程安全 的。
  3. Hashtable实现原理和HashMap相同,功能相同。底层都使用哈希表结构,查询速度快,很多情况下可以互用。
  4. 与HashMap不同,Hashtable 不允许 使用null 作为key 和value
  5. 与HashMap一样,Hashtable也不能保证其中Key-Value 对的顺序
  6. Hashtable判断两个key相等、两个value相等的标准,与HashMap一致

7、Map的实现类之五:Hashtable的子类Properties

  1. Properties 类是Hashtable的子类,该对象用于处理属性文件
  2. 由于属性文件里的key、value 都是字符串类型,所以Properties 里的key 和value 都是字符串类型
  3. 存取数据时,建议使用setProperty(String key,Stringvalue)方法和getProperty(String key)方法
【Java】集合框架之Map接口、实现类详解 文章目录1. Map接口和实现类① HashMap类(数组+链表+红黑树)② LinkHashMap类(记录插入顺序)③ Hashtable类(线程安全)④ Properties类(配置文件读取)⑤ TreeMap类(自动排序)2. 源码:HashMap使用示例 JDK1.8-API在线中文版 1. Map接口和实现类 特点: 用于存储任意键值对(Key-Value) 键:无序、无下标、不允许重... 阅读详情

相关推荐

16、Java Map接口及其实现详解

本文详细介绍了Java中Map接口及其常用实现类,包括HashMap、TreeMap、ConcurrentHashMap、LinkedHashMap、WeakHashMap、IdentityHashMap和EnumMap。文章涵盖了Map接口的基本操作、高级特性、实际应用场景以及优化技巧,并提供了丰富的代码示例帮助读者理解。此外,还探讨了Map在并发访问、缓存管理、配置管理等方面的应用,为开发者提供了选择合适Map实现类的实践建议。

prometheus5watch的博客 98

java中的map基本使用那几个方法(亲手试验过的)

java中的map基本使用那几个方法(亲手试验过的)

qq_44597856的博客 579

关于StartAI本地部署相关问题解答

很多小伙伴们都有接入自己本地SD的需求,对此小编整理了一些相关问题~

HDJ9387的博客 940

Map<String,Object> map=new HashMap<String,Object>详解

Map是一个接口,即Interface Map<K,V>,其中K-key类型和V-value的类型 它的每个元素包含一个key对象和一个value对象,且在这两个对象之间存在一种映射的对应关系,所有从Map集合中访问元素时,只有指定了key就可以找到对应的value,因此key必须是唯一的且不能重复,当key相同时,后面的value值会覆盖之前的value值。 Map定义的一些通用的方法 Map接口有很多实现类,如TreeMap,Hashtable,SortedMap,HashMa.

wenchang-的博客 5万+

银行数据仓库体系实践(3)--数据架构

狭义的数据仓库数据架构用来特指数据分布,广义的数据仓库数据架构还包括数据模型、数据标准和数据治理。即包含相对静态部分如元数据、业务对象数据模型、主数据、共享数据,也包含相对动态部分如数据流转、ETL、整合、访问应用和数据全生命周期管控治理。 数据架构层面通过数据分类、分层部署等手段,从非功能性视角将数据合理布局。通过整体架构管控和设计,支持业务操作类和管理分析类应用(系统),满足业...

acumen_leo的博客 7011

Arm Neoverse CMN-700 SLC内存系统与缓存分区技术解析

现代处理器架构中,缓存一致性协议与内存子系统设计直接影响系统性能。Arm Neoverse CMN-700采用的SLC(System Level Cache)通过16-way组相联设计实现高效数据缓存,其物理地址索引机制支持灵活的way分区配置。在软件可配置内存(OCM)模式下,SLC可作为独立内存空间使用,通过寄存器控制实现模式切换与区域锁定。缓存分区技术则通过请求源分类和way-based分配策略,满足实时性任务与吞吐量场景的不同需求。这些技术在5G基站、边缘计算等低延迟场景中具有重要应用价值,特别是C

weixin_30263073的博客 618

Java Map遍历的方式

Java Map遍历的方式-keySet()、entrySet()以及lambda 遍历map.forEach

睡竹的博客 2029

一篇文章将三极管讲透:三极管从原理到应用,从参数到特性,从入门到精通

晶体三极管(Transistor)是一种半导体电子器件,也是电子工程中最基本的元件之一。它有三个区域,分别是P型半导体,N型半导体和P型半导体,从而形成PNP型晶体三极管或者NPN型晶体三极管。

学习帮的博客 9万+

使用java8 新特性stream流对List<Map<String, Object>>集合进行遍历、过滤、查询、去重、排序、分组

对于一个List<Map<String, Object>>类型的数据,可以使用Java 8的新特性stream流来进行遍历、过滤、查询、去重、排序、分组等操作。

MidYear的博客 2万+

1.全基因组重测序数据分析介绍

二代测序原理及fastq数据解读、全基因组重测序数据分析内容

weixin_53682198的博客 1883

支付宝支付(三):周期扣款实现注意细节

一、周期扣款实现说明 1、官方文档入口:https://opendocs.alipay.com/open/20190319114403226822/intro 2、根据官方文档说明,周期扣款有两种方式:先签约后代扣场景和支付后签约场景 3、周期扣款接入问题文档: a>https://opendocs.alipay.com/support/01rg24 b>https://opensupport.alipay.com/support/knowledge/50249/20160248753

新鲜雾霾的博客 5702

Java面经3

java面试常见题

Oliver__Twist的博客 990

Flink 运维监控与指标采集实战(Prometheus + Grafana 全流程)

Flink运维监控在实时计算场景中至关重要,因为Flink作业需要7×24小时稳定运行,对性能、资源、故障感知和状态变化的实时监控是保障系统稳定的关键。Flink自带的Metrics系统提供了基本的监控能力,但为了更全面的监控,Prometheus+Grafana成为最主流的解决方案。通过配置PrometheusReporter和Grafana仪表盘,可以实现对Flink作业的全面监控,包括CPU、内存、吞吐量、Checkpoint状态、KafkaSink性能等关键指标。此外,自定义指标采集和报警机制的配置

晴天彩虹雨的博客 1368

【java】map接口详解

本文系统讲解了Java中的Map接口,作为不继承Collection的核心接口,Map专门维护键值映射关系。文章详细解析了Map的特性(键唯一、值可重复)、核心方法(增删查改、空值安全处理)、视图方法(keySet/values/entrySet)以及与Collection的关系。重点强调了entrySet遍历的高效性,推荐使用getOrDefault、merge等进阶方法,并指出开发中的常见注意事项。Map的本质是键唯一的键值结构,entrySet是其最高效的使用方式。

2301_81481532的博客 1031

Python - 多页pdf 合称为一页

尝试使用 ReportLab 来重画 pdf,但探索起来有点麻烦。重要的是解决手头这个问题,所以就算方法蠢,但简单完事。以下生成结果,最有一页 pdf 可能会显示在第一页,手动编辑下 pdf 即可;或者你也可以修改代码逻辑来完善。打印ppt,一页占用A4纸比较浪费,想多页合成一个 A4大小;安装 fitz,单独安装 fitz 使用可能会报错。将 PDF 拆分为 图片来保存。

AI工程化、开源分享、文档翻译、代码笔记 1425

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java 中Map接口的详解

1.Map接口:双列数据,存储key-value 键值对的数据。 Map接口的主要实现类: HashMap:作为Map接口的主要实现类,线程不安全,效率高,存储null的key和value LinkedHashMap作为HashMap的子类:保证在遍历Map元素时,可以按照添加的顺序实现遍历。 原因:在原有的hashMap底层原理上,添加了一对指针,指向前一个和后一个元素,对于频繁的遍历操作,此类的效率高于HashMap TreeMap:保证按照添加的key-value进行排序,实现排序遍历。此时考虑ke

路宇的博客 1460

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java Map 接口详解

Java Map 接口详解 软件包:java.util 接口:Map 描述:将键映射到值的对象 一,Map与Collection Collection接口:定义了单列集合规范,集合中的元素是独立存在的,每次存储一个(单个)元素 Map接口:定义了双列集合的规范,集合中的元素是成对出现的,每次存储一对元素,每个元素由键和值两部分组成,通过键可以找到对的值 二,Map<K,V>接口 映射:像IP地址与主机名这种一一对应的关系就叫做映射,Map接口提供了专门的集合类来存放这种映射关系的对

Azurecs的博客 436

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java集合框架之Map详解——Map接口

接口定义 public interface Map<K,V> JDK1.7及之前定义的接口数为14个,分别为 int size(); boolean isEmpty(); boolean containsKey(Object key); boolean containsValue(Object value); V g...

liwei19911215的博客 252

Java Map.Entry接口详解

在Java中,Map.Entry接口表示Map中的一个键值对(key-value pair)。它定义了一种在Map中遍历和操作键值对的标准方式。通常情况下,我们通过迭代器(Iterator)来访问Map中的Entry集合,并对每个Entry对象进行操作。

微赚淘客系统开发者博客 682

深入解析Java中的Map接口及其常用实现详解

Map接口位于java.util包中,专门用于表示一组键值对映射。Map中的每个键与值一一对应,且键是唯一的。Map本身并不继承自Collection接口,但它提供了一些类似于集合的操作方法。Map接口和其实现类提供了强大而灵活的键值对存储功能。每种实现有不同的特性和适用场景,选择合适的Map实现可以提升程序性能和可维护性。在使用Map时,应注意线程安全性和性能之间的平衡,根据需求选择如这样的并发实现,或在需要保持顺序的情况下选择等有序实现。在日常开发中,灵活运用Map能够帮助我们更高效地管理数据。

m0_64974617的博客 674

Java集合框架之Map接口详解

本文深入解析Java中Map接口的核心特性、常用方法及实现类,涵盖HashMap、TreeMap、LinkedHashMap的使用场景与性能对比,通过代码示例演示键值对操作、集合遍历及不可变Map的创建,助你掌握高效数据管理与操作技巧

m0_73941339的博客 989

Java集合详解——Map 接口

②k-v为了方便程序员的遍历,还会 创建entrySet集合,该集合存放的元素的类型是Map.Entry,而一个Map.Entry对象就有k和v,即:entrySet< Map.Entry>。(8)Map存放数据的key-value示意图,一对k-v是放在HashMap$Node的一个对象中的,又因为Node实现了Entry接口,也可以说一对k-v就是一个Entry。(5)Map的key和value都可以为null,但key为null只能有一个,value为null可以有多个。

m0_75013084的博客 562

JAVA容器-Map接口容器详解

JAVA容器-Map接口容器详解

m0_63164811的博客 341
上一篇: 一文分清Java开发中容易混淆的四大设计模式
下一篇: Clojure vs Java:少数据结构、多函数胜过多个单独类的优点
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值