Map接口以及实现类HashMap

简介: Map接口以及实现类HashMap的使用介绍

Map接口

特点

  1. Map与Collection并列存在,用于保存具有映射关系的数据
  2. Map中可以和value可以是任何引用类型的数据,会封装到HashMap$Node对象中
  3. Map中的key不允许重复,value可以重复
  4. Map中的key可以为null,value也可以为空。key只能有一个为null,value可以多个为null
  5. 常用的String类作为Map的key
  6. key和value之间存在单向一对一关系,即可通过指定的key总能找到对应的value。

常用方法

  1. put 添加
  2. remove 根据键删除映射关系
  3. get 根据键获取值
  4. size 获取元素个数
  5. isEmpty 判断个数是否为零
  6. clear 清除
  7. containsKey 查找键是否存在

遍历方法

第一组:先取出所有的key,通过可以取出对应的vaule

1 增强for循环

Set keyset = map.keySet();
for(Object key : keyset){
    sout(map.get(key));
}

2 迭代器

Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
    Object key = iterator.next();
    sout(map.get(key));
}

第二组先把所有的vaules取出

Collection vaules = map.values();

1 增强for循环

//使用所有的Collections使用的遍历方法
for(Object value : values){
    sout(value);
}

2 迭代器

Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
    Object value = iterator.next();
    sout(value);
}

通过EntrySet获取

Set entrySet = map.entrySet();
//EntrySet<Map.Entry<K,V>>

1 增强for循环

for(Object entry : entrySet){
    Map.Entry m = (Map.Entry) entry;
    sout(m.getkey() + m.getValue());
}

2 迭代器

Iterator iterator = entrySet.iterator();
while (iterator.hasNext()){
    Object entry = iterator.next();
    Map.Entry m = (Map.Entry) entry;
    sout(m.getkey() + m.getValue());
}

HashMap小结

  1. Map接口常用实现类:HashMap、HashTable和Properties
  2. HashMap是Map接口使用频率最高的实现类
  3. HashMap是key-value对的方式来存储数据(HashMap$Node类型)
  4. key可以为null,value也可以为空。key只能有一个为null,value可以多个为null
  5. 如果添加key,则会覆盖原有的对
  6. 与HashSet一样,不保证映射的顺序,因为底层是以hash表的方式来存储的
  7. HashMap没有实现同步,因此线程是不安全的

HashMap扩容机制

  1. HashMap底层维护了Node类型的数组table,默认null
  2. 当创建对象时,将加载因子(loadfactor)初始化为0.75
  3. 当添加key-value时,通过key的哈希值得到table的索引,然后判断该索引处是否有元素,没有则直接添加。如果该索引处有元素,继续判断该元素的key和准备加入的key是否相等,如果相等,则替换value;如果不相等需要判断树结构还是链表结构,做出相应处理。如果添加时发现容量不够,则需要扩容
  4. 第一次添加,则需要扩容table容量为16,临界值(threshold)为12
  5. 以后再扩容,则需要table容量为原来的2倍(32),临界值为原来的2倍(24)。
  6. 在java8中,如果一条链表的元素个数超过TREEIFY_THRESHOLD(默认8),并且table的大小>=MIN_TREEIFY_CAPACITY(默认64),就会进行红黑树化
相关文章
|
1月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
57 2
|
1月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
61 2
|
1月前
|
存储 缓存 安全
HashMap VS TreeMap:谁才是Java Map界的王者?
HashMap VS TreeMap:谁才是Java Map界的王者?
70 2
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0
|
29天前
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
48 3
|
29天前
|
存储 缓存 安全
在Java的Map家族中,HashMap和TreeMap各具特色
【10月更文挑战第19天】在Java的Map家族中,HashMap和TreeMap各具特色。HashMap基于哈希表实现,提供O(1)时间复杂度的高效操作,适合性能要求高的场景;TreeMap基于红黑树,提供O(log n)时间复杂度的有序操作,适合需要排序和范围查询的场景。两者在不同需求下各有优势,选择时需根据具体应用场景权衡。
30 2
|
29天前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
24 2
|
29天前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
27 1
|
1月前
|
存储 Java
Map大揭秘:HashMap与TreeMap背后的故事,你听过吗?
Map大揭秘:HashMap与TreeMap背后的故事,你听过吗?
24 1
|
1月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
38 1