Map接口
- Map接口它是以键值对(key=value)的方式进行一对一对的存储数据,在存储的过程中key的值不能重复,但是value的值可以重复。
- 特点:
- key无序,唯一,value可以重复
- 底层是哈希表结构(数组+链表的实现),如:这个HashMap中放入了一个自定义的引用类型(类),就必须重写 hashCode() 和equals()方法,要不然就会存入重复的元素,破坏了 HashMap 的规则。
[1] HashMap实现类
HashMap集合的方法使用:
package zhai.map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
Map集合(接口):key(键):不能重复 value(值):可以重复
*/
public class MapDemo1 {
public static void main(String[] args) {
// 创建一个
Map<String, String> map = new HashMap<>();
map.put("zhangsan","12");
map.put("zhangsan","13"); // 怎么输出的是第二个zhangsan?
map.put("wangwu","14");
map.put("zhaoliu","25");
map.put("zhai","19");
map.put("liu","20");
map.put("li","20");
map.remove("li");
// map.clear(); 清空集合中的所有数据
System.out.println(map.isEmpty()); // 判断集合是否为空 返回 boolean 值
System.out.println(map.containsKey("zhai")); // 查看集合中是否包含zhai这个键
System.out.println(map.containsValue("12")); // 查看集合中是否包含12这个值
System.out.println(map.containsValue("13"));
System.out.println(map.get("zhai")); // get:通过zhai这个键(键)找到相对应的值(value)
System.out.print(map.size()+":");
System.out.println(map);
Map<String, String> map1 = new HashMap<>();
map1.put("zhangsan","12");
map1.put("zhangsan","13"); // 怎么输出的是第二个zhangsan?
map1.put("wangwu","14");
map1.put("zhaoliu","25");
map1.put("zhai","19");
map1.put("liu","20");
map1.put("li","20");
map1.remove("li");
System.out.println(map == map1); // == :比较的是new的内存地址,一定不相等
System.out.println(map.equals(map1)); // equals:比较的是集合中具体的内容,只要内容相等绝对相等
System.out.println("------------");
// 获取集合中所有的 key
Set<String> set1 = map1.keySet();
for (String s1: set1) {
System.out.println(set1);
}
System.out.println("------------");
// 获取集合中所有的 value
Collection<String> coll = map1.values();
for (String s2:coll ) {
System.out.println(s2);
}
System.out.println("------------");
// 通过 keySet 和 get 方法获取集合中的 value
Set<String> set2 = map1.keySet();
for (String s3: set2) {
System.out.println(map1.get(s3));
}
System.out.println("------------");
// 通过 entrySet 方法获取 key 和 value
Set<Map.Entry<String, String>> entries1 = map1.entrySet();
for (Map.Entry<String, String> sss: entries1) {
System.out.println(sss.getKey()+"--->"+sss.getValue());
}
System.out.println("------------");
Set<Map.Entry<String, String>> entries = map1.entrySet();
entries.forEach(System.out::println); // forEach() 的新写法
}
}
输出:
false
true
false
true
19
//这里解释下为什么会输出第二个张三,这个在存储的过程中,当先存储一个张三的时候就把它的键和值都存入集合中,但是看见第二个张三的时候发现这对值中的key都是张三,就会把value值覆盖到第一个张三的value上,所以就会输出第二个张三的value值啦...
5:{zhaoliu=25, zhangsan=13, liu=20, wangwu=14, zhai=19}
false
true
------------
zhaoliu
zhangsan
liu
wangwu
zhai
------------
25
13
20
14
19
------------
25
13
20
14
19
------------
zhaoliu--->25
zhangsan--->13
liu--->20
wangwu--->14
zhai--->19
------------
zhaoliu=25
zhangsan=13
liu=20
wangwu=14
zhai=19
[2] Hashtable实现类
它和HashMap最大区别就是:
- Hashtable:是从 JDK 1.0 开始的,底层的方法都是用了synchronized关键字进行修饰的,线程安全,效率低,其中Hashtable集合中的 key 不能存入 null
- HashMap:是从 JDK 1.2 开始的,它是线程不安全,效率高,key 可以存入 null 但是只能存入一个key为null因为HashMap中的key是唯一的不可重复的。
package zhai.map;
import java.util.Hashtable;
public class HashTableDemo {
public static void main(String[] args) {
Hashtable<String, Integer> ht = new Hashtable<>();
// ht.put(null,14); // 会报错 以为底层线程安全,key 不能存入 null 数据
ht.put("zhang",12);
System.out.println(ht.size());
System.out.println(ht);
}
}
输出:
1
{zhang=12}
[3] LinkedHashMap
Map集合中的 key 是无序且唯一的,它的 value 跟着 key 存储,但是 LinkedHashMap 会以我们添加元素的顺序进行输出。
package zhai.map;
import java.util.LinkedHashMap;
public class LinkedHashMapDemo {
public static void main(String[] args) {
LinkedHashMap<String, Integer> lm = new LinkedHashMap<>();
lm.put("zhang",12);
lm.put("li",18);
lm.put("zhao",40);
lm.put("wang",35);
lm.put("zhai",19);
lm.put("zhang",13);
System.out.println(lm.size());
System.out.println(lm);
}
}
输出:
5
{zhang=13, li=18, zhao=40, wang=35, zhai=19}