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中的基本属性及常用的一些方法