1.HashMap 介绍
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。
1.1构造函数
HashMap() 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。 |
HashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。 |
HashMap(int initialCapacity, float loadFactor) 构造一个带指定初始容量和加载因子的空 HashMap。 |
HashMap(Map<? extends K,? extends V> m) 构造一个映射关系与指定 Map 相同的新 HashMap。 |
在这里提到了两个参数:初始容量,加载因子。这两个参数是影响HashMap性能的重要参数,其中容量表示哈希表中桶的数量,初始容量是创建哈希表时的容量,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度,它衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。对于使用链表法的散列表来说,查找一个元素的平均时间是O(1+a),因此如果负载因子越大,对空间的利用更充分,然而后果是查找效率的降低;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。系统默认负载因子为0.75,一般情况下我们是无需修改的。
1.2 HashMap API
void | clear() 从此映射中移除所有映射关系。 |
Object | clone() 返回此 HashMap 实例的浅表副本:并不复制键和值本身。 |
boolean | containsKey(Object key) 如果此映射包含对于指定键的映射关系,则返回 true。 |
boolean | containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。 |
Set<Map.Entry<K,V>> | entrySet() 返回此映射所包含的映射关系的 Set 视图。 |
V | get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null 。 |
boolean | isEmpty() 如果此映射不包含键-值映射关系,则返回 true。 |
Set<K> | keySet() 返回此映射中所包含的键的 Set 视图。 |
V | put(K key, V value) 在此映射中关联指定值与指定键。 |
void | putAll(Map<? extends K,? extends V> m) 将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系。 |
V | remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。 |
int | size() 返回此映射中的键-值映射关系数。 |
Collection<V> | values() 返回此映射所包含的值的 Collection 视图。 |
1.3 HashMap 的遍历方式
/**
* 1.遍历HashMap的键值对
第一步:根据keySet()获取HashMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
*/
Iterator iterator = hashMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
String key = (String) entry.getKey();
Integer value = (Integer) entry.getValue();
System.out.print(String.format("%s:%d", key, value));
}
System.out.println();
/**
* 2.通过Key遍历HashMap的值
第一步:根据keySet()获取HashMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
*/
Iterator iterator2 = hashMap.keySet().iterator();
while (iterator2.hasNext()) {
String key = (String) iterator2.next();
Integer value = (Integer) hashMap.get(key);
System.out.print(String.format("%s:%d", key, value));
}
System.out.println();
/**
3.遍历HashMap的值
第一步:根据value()获取HashMap的“值”的集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
**/
Collection collection = hashMap.values();
Iterator iterator3 = collection.iterator();
while (iterator3.hasNext()) {
Integer value = (Integer) iterator3.next();
System.out.print(value + ",");
}
1.4 常用方法的使用示例
public class HashMapE {
public static void main(String[] args) {
testHashMapApis();
}
private static void testHashMapApis() {
Random random = new Random();
//新建HashMap
HashMap hashMap = new HashMap();
//添加操作0-10之间的随机数
hashMap.put("one", random.nextInt(10));
hashMap.put("two", random.nextInt(10));
hashMap.put("three", random.nextInt(10));
//打印出map
System.out.println("map:" + hashMap);
/**
* 遍历HashMap的键值对
第一步:根据keySet()获取HashMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
*/
Iterator iterator = hashMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
String key = (String) entry.getKey();
Integer value = (Integer) entry.getValue();
System.out.print(String.format("%s:%d", key, value));
}
System.out.println();
/**
* 通过Key遍历HashMap的值
第一步:根据keySet()获取HashMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
*/
Iterator iterator2 = hashMap.keySet().iterator();
while (iterator2.hasNext()) {
String key = (String) iterator2.next();
Integer value = (Integer) hashMap.get(key);
System.out.print(String.format("%s:%d", key, value));
}
System.out.println();
/**
遍历HashMap的值
第一步:根据value()获取HashMap的“值”的集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
**/
Collection collection = hashMap.values();
Iterator iterator3 = collection.iterator();
while (iterator3.hasNext()) {
Integer value = (Integer) iterator3.next();
System.out.print(value + ",");
}
// HashMap的键值对个数
System.out.println("size:" + hashMap.size());
// containsKey(Object key) :是否包含键key
System.out.println("contains key two : " + hashMap.containsKey("two"));
System.out.println("contains key five : " + hashMap.containsKey("five"));
// containsValue(Object value) :是否包含值value
System.out.println("contains value 0 : " + hashMap.containsValue(new Integer(0)));
// remove(Object key) : 删除键key对应的键值对
hashMap.remove("three");
System.out.println("map:" + hashMap);
// clear() : 清空HashMap
hashMap.clear();
// isEmpty() : HashMap是否为空
System.out.println((hashMap.isEmpty() ? "map is empty" : "map is not empty"));
}
}
推荐阅读