Map接口
特点:key-value键值对集合,键key唯一,值value允许重复
常见实现类
- HashMap:无序
- LinkedHashMap:有序
- TreeMap:按照key自动排序
- Hashtable:无序
- 线程安全,性能低
- 不允许使用null做key
- 不允许使用null做value
package com.ztt.Demo02;
import java.util.Arrays;
import java.util.HashMap;
import java.util.TreeSet;
public class demo07 {
public static void main(String[] args) {
//单列集合
TreeSet set = new TreeSet();set.add("x西安");
set.addAll(Arrays.asList("A阿城","B北京","C长春" , "D大连", "E鄂尔多斯" , "A阿富汗"));
System.out.println(set);
// Map键值对集合
//保存城市人口信息
//key :城市名称
// val : 人口数量
HashMap map=new HashMap();
map.put("X西安", 1100);
HashMap anotherMap=new HashMap();
anotherMap.put("B北京", 2500);
anotherMap.put("C长春", 300);
anotherMap.put("D大连", 1000);
map.put("X西安", 1100);
anotherMap.put("D大连", 1000);//key不允许重复
map.put("E鄂尔多斯", 1000);//value允许重复
System.out.println(map);
}
}
运行结果:
[A阿城, A阿富汗, B北京, C长春, D大连, E鄂尔多斯, x西安]
{X西安=1100, E鄂尔多斯=1000}
HashMap:KV键值对集合,key唯一,value允许重复
put()方法 : 添加键值对,如果key不存在,则返回null;如果key存在,则保存新value,返回旧value
get()方法:根据key,获取value ,如果key存在,获取该元素的键值对的value值;如果不存在,则获取该元素的键值对的value值为null;如果返回的value为null,类型转换时,会发生空指针
package com.ztt.Demo02;
import java.util.HashMap;
public class demo08 {
public static void main(String[] args) {
// HashMap
//KV键值对集合,key唯一,value允许重复
HashMap cityMap=new HashMap();
//put()方法:添加键值对
//如果key不存在,则返回null
System.out.println(cityMap.put("X西安", 1100));
System.out.println(cityMap.put("B北京", 1100));
System.out.println(cityMap.put("C长春", 1100));
System.out.println(cityMap.put("D大连", 1100));
//如果key存在,则保存新value,返回旧value
System.out.println(cityMap.put("X西安", 1200));
// get()方法:根据key,获取value
// key存在
int value1=cityMap.get("B北京");//Integer->int
System.out.println("B北京==>"+value1);
// key不存在
Integer value2=cityMap.get("N南京");//Integer->int
System.out.println("N南京==>"+value2);
//如果返回的value为null,类型转换时,会发生空指针
int value3=cityMap.get("N南京");//Integer->int
}
}
运行结果:
null
null
null
null
1100
B北京==>1100
N南京==>null
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.HashMap.get(Object)" is null
at com.ztt.Demo02.demo08.main(demo08.java:31)
遍历Map
方式1:获取所有的key,然后按照每个key获取对应的value
方式2:获取所有的value
方式3:将每个KV键值对按照Entry类型的对象,统一获取
方式1:获取所有的key,然后按照每个key获取对应的value
package com.ztt.Demo02;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class demo09 {
public static void main(String[] args) {
//歌手分类
HashMap map=new HashMap();
map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });
map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });
map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });
//遍历Map
//方式1:获取所有的key,然后按照每个key获取对应的value
Set keys=map.keySet();//获取map中所有的key
System.out.println("所有的key:"+keys);
System.out.println("按照每个key,获取每个对应的value");
Iterator it=keys.iterator();
while(it.hasNext()) {
String key=it.next();//获取每个key
String[] val=map.get(key);//按照每个key获取对应的value
System.out.printf("%s--->%s\n",key,Arrays.toString(val));
//根据key,获取value(数组)
// String[]array = map.get("乐队");
// for ( String name : array) {
// System.out.println( name ) ;
// }
}
}
}
运行结果:
所有的key:[华语, 乐队, 欧美]
按照每个key,获取每个对应的value
华语--->[林俊杰, 陈奕迅, 邓紫棋, 薛之谦, 汪苏泷, 李荣浩]
乐队--->[魔力红, 烟鬼组合, 共和时代, 辅音组合, Linkin Park, Westlife]
欧美--->[贾斯丁比伯, 威肯, 艾兰沃克, 德雷克]
方式2:获取所有的value
package com.ztt.Demo02;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
public class demo10 {
public static void main(String[] args) {
//歌手分类
HashMap map=new HashMap();
map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });
map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });
map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });
//遍历map
//方式2:获取所有的value
Collection values=map.values();
for(String[] array:values) {
System.out.println(Arrays.toString(array));
}
}
}
运行结果:
[林俊杰, 陈奕迅, 邓紫棋, 薛之谦, 汪苏泷, 李荣浩]
[魔力红, 烟鬼组合, 共和时代, 辅音组合, Linkin Park, Westlife]
[贾斯丁比伯, 威肯, 艾兰沃克, 德雷克]
方式3:将每个KV键值对按照Entry类型的对象,统一获取
package com.ztt.Demo02;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
public class demo11 {
public static void main(String[] args) {
//歌手分类
HashMap map=new HashMap();
map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });
map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });
map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });
//遍历map
//方式3:将每个KV键值对按照Entry类型的对象,统一获取
Set> entrys=map.entrySet();
for(Entry keyValue:entrys) {
System.out.printf("%s--->%s\n",keyValue.getKey(),Arrays.toString(keyValue.getValue()));
}
}
}
运行结果:
华语--->[林俊杰, 陈奕迅, 邓紫棋, 薛之谦, 汪苏泷, 李荣浩]
乐队--->[魔力红, 烟鬼组合, 共和时代, 辅音组合, Linkin Park, Westlife]
欧美--->[贾斯丁比伯, 威肯, 艾兰沃克, 德雷克]
- 判断key是否存在:containsKey()方法
- 根据key获取value,如果key不存在,则返回default默认值:getOrDefault()方法
- 根据key,删除KV键值对:remove()方法
- 获取键值对的数量:size()方法
package com.ztt.Demo02;
import java.util.Arrays;
import java.util.HashMap;
public class demo12 {
public static void main(String[] args) {
//歌手分类
HashMap map=new HashMap();
map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });
map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });
map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });
//判断key是否存在
boolean isContains = map.containsKey("日韩");
System.out.println(isContains);
//根据key获取value,如果key不存在,则返回default默认值
String[] value = map.getOrDefault("日韩", new String[] {});
System.out.println(Arrays.toString(value));
//根据key,删除KV键值对
map.remove("欧美");
System.out.println(map);
//获取键值对的数量
int size = map.size();
System.out.println(size);
}
}
运行结果:
false
[]
{华语=[Ljava.lang.String;@626b2d4a, 乐队=[Ljava.lang.String;@5e91993f}
2
LinkedHashMap:有序
package com.ztt.Demo02;
import java.util.HashMap;
import java.util.LinkedHashMap;
public class demo14 {
public static void main(String[] args) {
//统计每个字符出现的次数
String str="aabbbbsssddffghjjkllkjhgfdsaqwertyuiozxcvcxzzxccvvoozzz";
//无序
//HashMap map=new HashMap();
//有序
LinkedHashMap map=new LinkedHashMap();
for(int i=0;i
运行结果:
{a=3, b=4, s=4, d=3, f=3, g=2, h=2, j=3, k=2, l=2, q=1, w=1, e=1, r=1, t=1, y=1, u=1, i=1, o=3, z=6, x=3, c=4, v=3}
TreeMap:按照key自动排序
package com.ztt.Demo02;
import java.util.Map.Entry;
import java.util.Comparator;
import java.util.TreeMap;
public class demo15 {
public static void main(String[] args) {
// HashMap:无序,按照key计算保存位置
// HashMap map = new HashMap();
// TreeMap:按照key自动排序,通过key进行比较后排序
TreeMap map=new TreeMap(new Comparator() {
@Override
public int compare(String o1, String o2) {
int n1=Integer.parseInt(o1.substring(2));
int n2=Integer.parseInt(o2.substring(2));
return n1-n2;
}
});
map.put("SN201", "A1");
map.put("SN101", "A2");
map.put("SN111", "A3");
map.put("SN191", "A4");
map.put("SN100", "A5");
map.put("SN110", "A6");
map.put("SN1231", "A7");
map.put("SN2001", "A8");
map.put("SN2024", "A9");
for(Entry entry:map.entrySet()) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
运行结果:
SN100:A5
SN101:A2
SN110:A6
SN111:A3
SN191:A4
SN201:A1
SN1231:A7
SN2001:A8
SN2024:A9
Hashtable:无序
package com.ztt.Demo02;
import java.util.HashMap;
import java.util.Hashtable;
public class demo16 {
public static void main(String[] args) {
HashMap map=new HashMap();
map.put(null, "巴黎世家");//不允许使用null做key
map.put("AAA", null);//允许使用null做value
System.out.println(map);
Hashtable table=new Hashtable();
table.put(null, "巴黎世家");//不允许使用null做key
table.put("AAA", null);//不允许使用null做value
System.out.println(table);
}
}
运行结果:
{null=巴黎世家, AAA=null}
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Object.hashCode()" because "key" is null
at java.base/java.util.Hashtable.put(Hashtable.java:481)
at com.ztt.Demo02.demo16.main(demo16.java:15)