Java集合Map之HashMap常用操作

简介: 在我看来 , 链表是为了解决hash碰撞使用的一种方法 : 拉线法 , 而红黑树是为了解决"拉的这个线"(链表存储的元素太多)过长的话元素遍历慢的问题

Map

Map是一个将键(key)映射到值(value)的对象 , Map中每一个元素都有一个key对象和value对象 , 并且key是不能重复的 , Map中有两个重要的实现类 , 一个是HashMap , 这个集合是无序且不安全的集合 , 最多有一个元素为null , 还有一个就是TreeMap , 可以对key进行排序 , HashMap底层是通过哈希表来实现的 , 所以可以先看一下我之前的一篇文章(公众号) :


java集合框架Map之HashMap底层原理解析

这个是我的公众号 , 大家顺便可以关注一下 , 谢谢


版本


JDK1.7 : 数组 + 链表


JDK1.8 : 数组 + 链表/红黑树


在我看来 , 链表是为了解决hash碰撞使用的一种方法 : 拉线法 , 而红黑树是为了解决"拉的这个线"(链表存储的元素太多)过长的话元素遍历慢的问题


HashMap基本属性

// HashMap默认负载因子0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;
// HashMap容器默认初始化大小
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 
// HashMap最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;
// HashMap元素存储由链表转换为树的阈值  链表 -> 树 , 当HashMap在扩容(resize())时 , 此时存储在HashMap中元素的位置会重新计算 , 当链表的长度大于8时会转为树
static final int TREEIFY_THRESHOLD = 8;
// HashMap元素存储树转换为链表的阈值  树 -> 链表 , 当HashMap在扩容(resize())时 , 此时存储在HashMap中元素的位置会重新计算 , 当原有的红黑树的数量<6时 , 会转换为链表
static final int UNTREEIFY_THRESHOLD = 6;
// HashMap元素存储最小转为树的阈值 , 当HashMap的容量大于该值时才会将链表转换为树 , 否则的话会直接扩容 , 而不是转换为树 , 为了避免进行扩容、树转换的冲突,这个值不能小于 4 * TREEIFY_THRESHOLD
static final int MIN_TREEIFY_CAPACITY = 64;

HashMap常用操作

1.添加元素 : V put(K key, V value)

HashMap<String , String> hashMap = new HashMap<>();
System.out.println(hashMap);
// 添加元素
hashMap.put("1","name");
hashMap.put("2","age");
System.out.println("添加元素之后的hashMap为 :" + hashMap);

2.访问元素 : V get(Object key)

HashMap<String , String> hashMap = new HashMap<>();
// 添加元素
hashMap.put("1","name");
hashMap.put("2","age");
// 获取元素
String s = hashMap.get("1");
System.out.println("获取到 key 是 1 的元素为 : " + s);

3.计算 hashMap 中键/值对的数量 : int size()

HashMap<String , String> hashMap = new HashMap<>()
// 添加元素
hashMap.put("1","name");
hashMap.put("2","age");
// 获取元素
String s = hashMap.get("1");
System.out.println("获取到 key 是 1 的元素为 : " + s);
// 计算大小
int size = hashMap.size();
System.out.println("hashMap 集合的大小为 : " + size);

4.删除元素 : V remove(Object key)

HashMap<String , String> hashMap = new HashMap<>();
// 添加元素
hashMap.put("1","name");
hashMap.put("2","age");
// 删除元素
String remove = hashMap.remove("2");
System.out.println("删除 key 是2的元素 : " + remove);

5.判断HashMap是否为空: boolean isEmpty()

HashMap<String , String> hashMap = new HashMap<>();
// 添加元素
hashMap.put("1","name");
hashMap.put("2","age");
System.out.println("hashMap的元素是否为空 : " + hashMap.isEmpty());

6.将所有的键/值对添加到hashMap 中 : void putAll(Map m)

HashMap<String , String> hashMapAll = new HashMap<>();
hashMapAll.put("3","username");
hashMapAll.put("4","password");
HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
System.out.println("将所有键/值对添加到 hashMap 之前 : " + hashMap);
// 将所有键/值对添加到 hashMap 中
hashMap.putAll(hashMapAll);
System.out.println("添加元素之后的hashMap为 :" + hashMap);

7.返回 hashMap 中所有映射项的集合 : Set> entrySet()

HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
// 返回 hashMap 中所有映射项的集合
System.out.println("hashMap 中所有映射项的集合 : " + hashMap.entrySet());

8.返回hashMap中的所有值 : Collection values()

HashMap<String , String> hashMap = new HashMap<>();
// 添加元素
hashMap.put("1","name");
hashMap.put("2","age");
// 返回hashMap中的所有值
System.out.println("hashMap中的所有值 : " + hashMap.values());

9.返回hashMao中的所有key : Set keySet()

HashMap hashMap = new HashMap<>();
// 添加元素
hashMap.put("1","name");
hashMap.put("2","age");
// 返回hashMap中的所有key
System.out.println("hashMao中的所有key : " + hashMap.keySet());

10.检查 hashMap 中是否存在指定的 key 对应的映射关系 : boolean containsKey(Object key)

HashMap hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
System.out.println("hashMap中是否包含键为1的键值对 : " + hashMap.containsKey("1"));

11.检查hashMap中是否存在指定的value 对应的映射关系 : boolean containsValue(Object value)

HashMap hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
System.out.println("hashMap中是否包含值为name的键值对 : " + hashMap.containsValue("name"));

12.如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中 : V putIfAbsent(K key, V value)

HashMap hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
hashMap.putIfAbsent("1","2");
System.out.println("hashMap中的元素为 : " + hashMap);

13.获取指定 key 对应的 value,如果找不到 key ,则返回设置的默认值 : V getOrDefault(Object key, V


         
HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
// 获取key为3的值 , 如果获取不到 , 那么返回null
String value = hashMap.getOrDefault("3", null);
System.out.println("获取key为3的值 : " + value);

14.替换hashMap中是指定的key对应的value : boolean replace(K key, V oldValue, V newValue)

HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
hashMap.replace("1" , "name" , "name1");
System.out.println("将key为1的值name替换为name1 : " + hashMap);

15.将hashMap中的所有映射关系替换成给定的函数所执行的结果 : replaceAll(BiFunction function)

HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
hashMap.replaceAll((key , value) -> value.toUpperCase());
System.out.println("将 hashMap 中的所有映射关系替换成给定的函数所执行的结果 : " + hashMap);

16.删除 hashMap 中的所有键/值对 : void clear()

HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
hashMap.clear();
System.out.println("删除hashMap中所有键/值对 : " + hashMap);

以上就是HashMap中的基本属性及常用的一些方法

相关文章
|
2天前
|
存储 安全 算法
【JAVA】HashMap扩容性能影响及优化策略
【JAVA】HashMap扩容性能影响及优化策略
|
1天前
|
存储 安全 算法
【常见集合】Java 常见集合重点解析
【常见集合】Java 常见集合重点解析
6 0
|
2天前
|
存储 安全 Java
Java一分钟之-Map接口与HashMap详解
【5月更文挑战第10天】Java集合框架中的`Map`接口用于存储唯一键值对,而`HashMap`是其快速实现,基于哈希表支持高效查找、添加和删除。本文介绍了`Map`的核心方法,如`put`、`get`和`remove`,以及`HashMap`的特性:快速访问、无序和非线程安全。讨论了键的唯一性、`equals()`和`hashCode()`的正确实现以及线程安全问题。通过示例展示了基本操作和自定义键的使用,强调理解这些概念对编写健壮代码的重要性。
9 0
|
2天前
|
存储 安全 Java
Java一分钟之-集合框架进阶:Set接口与HashSet
【5月更文挑战第10天】本文介绍了Java集合框架中的`Set`接口和`HashSet`类。`Set`接口继承自`Collection`,特征是不允许重复元素,顺序不确定。`HashSet`是`Set`的实现,基于哈希表,提供快速添加、删除和查找操作,但无序且非线程安全。文章讨论了`HashSet`的特性、常见问题(如元素比较规则、非唯一性和线程安全性)以及如何避免这些问题,并提供了代码示例展示基本操作和自定义对象的使用。理解这些概念和注意事项能提升代码效率和可维护性。
12 0
|
2天前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
8 0
|
2天前
|
存储 Java
【JAVA基础篇教学】第十篇:Java中Map详解说明
【JAVA基础篇教学】第十篇:Java中Map详解说明
|
2天前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
|
2天前
|
存储 安全 算法
掌握Java并发编程:Lock、Condition与并发集合
掌握Java并发编程:Lock、Condition与并发集合
13 0
|
2天前
|
存储 安全 Java
深入理解Java集合框架
深入理解Java集合框架
11 0
|
2天前
|
Java
Java为什么建议初始化HashMap的容量大小?
【5月更文挑战第3天】Java中初始化HashMap容量能提升性能。默认容量16,扩容按当前的1/2进行。预估元素数量设定合适容量可避免频繁扩容,减少性能损耗。过大浪费内存,过小频繁扩容,需权衡。Java 8后扩容策略调整,但核心仍是预估初始容量以优化性能。
40 1