文章目录
前言
HashMap最主要的是插入和查找(搜索)快,并且这是他的两个最主要的功能。还有个基于这两个操作的操作,移除。
因为HashMap和HashTable差不多,所以就一起讲了。
区别:
- HashMap 允许键和值为null,HashTable 不允许。
- HashMap 是线程不安全的,HashTable 线程安全。 注意:
注意:
现在 HashTable 基本已经弃用了(他的父类Dictionary被弃用了,作为Dictionary的子类自然也是)。
需要线程安全请使用JUC并发包下的ConcurrentHashMap类,效率比 HashTable 要高。
扩展:
HashMap在JDK1.8之前的实现方式为:数组+链表。
HashMap在JDK1.8后改为了:数组+链表+红黑树实现。主要的目的是提高查找效率。
一、HashMap
HashMap 是以键值对形式存储的,可以通过键来获取值。
HashMap 插入慢、查询快的数据结构(数组是插入慢,查询快的)。
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
二、使用
1.构造器
1.1 创建
构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
创建一个空的 HashMap。
HashMap map = new HashMap();
2.常用方法(JDK 1.6)
2.1 插入 + 获取
put(K key, V value)
在此映射中关联指定值与指定键。
get(Object key)
返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。
put() 方法放入键值对,get() 方法使用键获取到值。size() 方法获取到加入该哈希表中的键值对数量。
HashMap map = new HashMap();
// 插入
map.put("a", 1);
map.put("b", 2);
// 获取
Object a = map.get("a");
Object b = map.get("b");
// 获取数量
int size = map.size();
System.out.println(a); // 1
System.out.println(b); // 2
System.out.println(size); // 2
2.2 插入其他哈希表
putAll(Map<? extends K,? extends V> m)
将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系。
将其他的 HashMap 放入当前HashMap中。
HashMap map = new HashMap();
HashMap newMap = new HashMap();
newMap.put("a",1);
map.putAll(newMap);
System.out.println(map);
2.3 获取所有插入的键
keySet()
返回此映射中所包含的键的 Set 视图。
获取到插入HashMap的所有键,返回的是一个Set,Set中存放了HashMap中的所有键。
HashMap map = new HashMap();
// 插入
map.put("a", 1);
map.put("b", 2);
// 获取所有插入的键
Set set = map.keySet();
System.out.println(set.toString()); // [a, b]
2.4 获取所有插入的键
values()
返回此映射所包含的值的 Collection 视图。
获取到插入HashMap的所有值,返回的是一个Collection,Collection中存放了HashMap中的所有值。
HashMap map = new HashMap();
// 插入
map.put("a", 1);
map.put("b", 2);
// 获取所有插入的值
Collection values = map.values();
System.out.println(values); // [1, 2]
2.5 获取所有键值对
entrySet()
返回此映射所包含的映射关系的 Set 视图。
使用entrySet() 方法获取到所有键值对,然后再迭代获取所有值。
HashMap map = new HashMap();
// 插入
map.put("a", 1);
map.put("b", 2);
// 获取所有键值对
Set set = map.entrySet();
Iterator i = set.iterator();
while (i.hasNext()) {
Object next = i.next();
System.out.println(next);
}
2.6 移除
移除指定键值对
remove(Object key)
从此映射中移除指定键的映射关系(如果存在)。
使用key,移除指定的键值对。
HashMap map = new HashMap();
// 插入
map.put("a", 1);
map.put("b", 2);
// 移除指定键
map.remove("a");
System.out.println(map); // {b=2}
移除清空全部
clear()
从此映射中移除所有映射关系。
清空HashMap中所有的键值对。
HashMap map = new HashMap();
// 插入
map.put("a", 1);
map.put("b", 2);
// 移除指定键
map.clear();
System.out.println(map); // {}
2.7 判断
是否为空
isEmpty()
如果此映射不包含键-值映射关系,则返回 true。
如果H ashMap 没put值则返回 true。
HashMap map = new HashMap();
boolean empty = map.isEmpty();
System.out.println(empty); // true
是否包含某键
containsKey(Object key)
如果此映射包含对于指定键的映射关系,则返回 true。
判断是否包含某个key,包含返回true。
HashMap map = new HashMap();
boolean keyDemo = map.containsKey("keyDemo");
System.out.println(keyDemo); // false
是否包含某值
containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
判断是否包含某个值,包含返回true。
HashMap map = new HashMap();
boolean valueDemo = map.containsValue("valueDemo");
System.out.println(valueDemo); // false
3.常用方法(JDK 1.8)
JDK 1.8 中新增的一些方法。
3.1 插入(如果不存在key才插入)
putIfAbsent(K key, V value)
如果指定的键尚未与某个值相关联(或映射到 null ),则将其与给定值相关联并返回 null ,否则返回当前值。
putIfAbsent() 方法,如果键存在,则返回HashMap中该键的值,如果不存在,则插入该键值对。
HashMap map = new HashMap();
map.put("a",1);
Object a = map.putIfAbsent("a", 123);
System.out.println(a); // 1
3.2 替换
replace(K key, V value)
只有当目标映射到某个值时,才能替换指定键的条目。
replace() 方法只有指定的键存在时才替换,键不存在则不替换。
HashMap map = new HashMap();
map.put("a", 1);
map.replace("a", 123);
System.out.println(map); // {a=123}
4.HashMap的遍历
一共有三种遍历方式,每一种遍历效率都不一样
推荐第三种,效率最高。
HashMap<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
// 第一种效率最差。因为是先获取到键,再获取到值。
Set<String> strings = map.keySet();
for (String key : strings) {
Integer value = map.get(key);
System.out.println(key+ " - " +value);
}
// 第二种,获取到迭代器。性能比第一种好,一次取值
Set<Map.Entry<String, Integer>> entries = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> next = iterator.next();
String key = next.getKey();
Integer value = next.getValue();
System.out.println(key + " - " + value);
}
// 第三种,推荐,效率最高
Set<Map.Entry<String, Integer>> es = map.entrySet();
for (Map.Entry<String,Integer> entry : es) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " - " + value);
}
相关
更多常用类请查看:【Java SE 常用类】目录