Java中的Map接口与底层解析
Map接口
Map接口实现类的特点
1). Map 与 Collection 并列存在, 用于保存具有映射关系的数据: {Key, Value}
2), Map 中 的Key和Value 可以是任何引用类型的数据, 会封装到HashMap$Node 对象中
3). Map 中的Key不可以重复, 但是Value可以重复, 如果放一个相同的Key, 就会替换对应的Value
4). Key与Value一一对应, 可以通过Key索引到唯一的Value
源码解析 之 Entry
HashMap中的Node 实现了Entry接口, 所以一个键值对也可以称之为一个Entry

解读:
1). k-v 最后是HashMap$Node = node = newNode(hash, key, value, null);
2). k-v 为了方便遍历, 还会创建EntrySet集合, 该集合存放的元素类型是Entry, 而一个
Entry 对象就有k, v
transient Set<Map.Entry<K,V>> entrySet;
但是注意, 其实entrySet里面存放的对象运行类型是HashMap$Node, 这里有个向上转型
因为HashMap$Node 实现了Map.Entry这个接口
public class Main {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
hashMap.put("no1", "111");
hashMap.put("no2", "222");
Set set = hashMap.entrySet();
System.out.println(set.getClass()); // 这里发现EntrySet也是一个内部类
for (Object o : set) {
System.out.println(o.getClass());
// 取出Key和Value
Map.Entry entry = (Map.Entry)o;
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}
3). 除此之外, Map也提供了keySet() 方法 和 Values 方法
public class Main {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
hashMap.put("no1", "111");
hashMap.put("no2", "222");
Set set = hashMap.keySet();
Collection collection = hashMap.values();
System.out.println(set.getClass());
System.out.println(collection.getClass());
}
}
根据输出可以发现, Values 和 KeySet 也是 HashMap的内部类!
class java.util.HashMap$KeySet
class java.util.HashMap$Values
Map接口使用方式
Map接口常用方法
1). put() 添加
2). remove() 根据键删除映射关系
3). get() 根据键获取值
4). size() 获取元素个数
5). isEmpty() 判断元素个数是否为0
6). clear() 清除
7). containKey() 查找键是否存在
Map接口遍历方式
@SuppressWarnings("all")
public class Main {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
String str = "Number";
for (int i = 1; i <= 10; i++) {
hashMap.put(str + i, i);
}
// (1) 先取出所有的key, 然后再取出对应的value
Set keySet = hashMap.keySet();
for (Object key : keySet) {
System.out.println(key + " - " + hashMap.get(key));
}
// (2) 取出所有的value, 但是不能取出对应的key
Collection values = hashMap.values();
for (Object v : values) {
System.out.println("value = " + v);
}
// (3) 通过EntrySet获取
Set entrySet = hashMap.entrySet();
for (Object o : entrySet) {
Map.Entry entry = (Map.Entry)o; // HashMap$Node 并没有提供相应的获取key和value的方法, 所以要向下转型
System.out.println(entry.getKey() + " - " + entry.getValue());
}
}
}

浙公网安备 33010602011771号