Java自学笔记—Map
Map特点
- Map用于保存具有映射关系的数据:Key-Value(双列元素)
- Map中 key 和 value 可以是任意类型,会封装到HashMap$Node 对象中
- Map 中key不允许重复,key 只能一个为空,value 可以多个为空,key可以为任意对象
- key he value 单项一对一,指定的key有对于的value
/**
* @author Lspero
* @version 1.0
*/
public class Map_ {
public static void main(String[] args) { Map map = new HashMap();
map.put("no1", "C++");
map.put("no2", "java");
map.put("no1", "php");//有相同的key,等价于替换
map.put("no3", "php");//key值不一样,可以保存
map.put(null, null);
map.put(null, "C");//key只能一个为空
map.put("no4", null);
map.put("no5", null);//value可以多个为空
map.put(1, null);
map.put(new Object(), null);
System.out.println("map = " + map);
//通过get方法传入一个key,返回一个value
System.out.println(map.get(1));
}
}
Map常用方法
/**
* @author Lspero
* @version 1.0
*/
@SuppressWarnings("all")
public class MapMethod {
public static void main(String[] args) {
Map map = new HashMap();
//
map.put("no1", "C++");
map.put("no2", "java");
map.put("no1", "php");//有相同的key,等价于替换
map.put("no3", "php");//key值不一样,可以保存
System.out.println(map);
Object no1 = map.get("no1");//根据key找value
map.remove("no3");//删除
boolean no11 = map.containsKey("no1");//判断key是否存在
int size = map.size();//Map大小
boolean empty = map.isEmpty();//判空
System.out.println(map);
map.clear();//清空
}
}
Map数据结构
- k-v 最后以结点方式存储
HashMap$Node node = newNode(hash, key, value, null);
- 为了方便遍历,会创建 entrySet 集合,该集合元素类型为 Entry
即transient Set<Map.Entry<K,V>> entrySet;
- 在EntrySet中,定义的是
Map.Entry
, 但实际上存放的还是HashMap$Node
由于HashMap$Node implements Map.Entry
,有继承关系,因此可以存放- 把 HashMap$Node 对象存放到 EntrySet 中是为了方便遍历,提供
getKey()
和getValue()
方法,可以单独获取keySet和Values,均为set子类,可以用Set接收- 实际数据依然在
HashMap$Node
结点中,entrySet
只是地址指向关系
以HashMap为例,数据结构如下图
遍历方式
- 先取出所有key,通过key取出对应value
Set keyset = map.keySet();
- 直接取出value值
Collection values = map.values();
- 通过EntrySet来获取k-v
Set entryset = map.entrySet();
注意将 Node 转成 EntryMap.Entry m = (Map.Entry) next;
/**
* @author Lspero
* @version 1.0
*/
@SuppressWarnings("all")
public class MapFor {
public static void main(String[] args) {
// 遍历方式
Map map = new HashMap();
map.put("no1", "C+ +");
map.put("no2", "java");
map.put("no1", "php");//有相同的key,等价于替换
map.put("no3", "php");//key值不一样,可以保存
//1.先取出所有key,通过Key取出对应Value
System.out.println("=====第一种=====");
//(1)增强for
Set keyset = map.keySet();
for (Object key :keyset) {
System.out.println(key + "-" + map.get(key));
}
System.out.println("=====第二种=====");
//(2)迭代器
Iterator iterator = keyset.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
System.out.println("=====取出所有value=====");
//2.取出所有value值
Collection values = map.values();
//(1)增强for
for (Object o :values) {
System.out.println("value = " + o);
}
//(2)迭代器,由于没有get()方法,因此不能用普通for循环
Iterator iterator1 = values.iterator();
while (iterator1.hasNext()) {
Object next = iterator1.next();
System.out.println("value = " + next);
}
//3. 通过EntrySet来获取k-v
Set entryset = map.entrySet();
//(1)增强for
System.out.println("=====使用EntrySet的增强for=====");
for (Object entry :entryset) {
//将entry转成Map.Entry, entry 是 HashMap$Node 类型
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
//(2)
Iterator iterator2 = entryset.iterator();
while (iterator2.hasNext()) {
Object next = iterator2.next();
//next是 HashMap$Node 类型
//System.out.println(next.getClass());//class java.util.HashMap$Node
Map.Entry m = (Map.Entry) next;
System.out.println(m.getKey() + "-" + m.getValue());
}
}
}