33、Map简介
Map接口概述
除了Collection之外,常用的集合还有Map接口,里面常用的实现类图如下:
map中的元素是以键-值的方式存在的,通过键可以获取到值,键是不可以重复的,跟地图比较像,通过一个坐标就可以找到具体的位置。
package com.sutaoyu.Map; import java.util.Collection; import java.util.HashMap; import java.util.Map; public class Map_test_1 { public static void main(String[] args) { Map<Integer,String> map = new HashMap(); String s1 = map.put(1001, "成龙"); map.put(1002, "周润发"); map.put(1003, "周星驰"); //将1001 成龙替换掉,并且返回被替换的成龙 String s2 = map.put(1001, "房祖名"); System.out.println(s1); System.out.println(s2); //判断是否包含传入的键 System.out.println(map.containsKey(1002)); //判断是否包含传入的值 System.out.println(map.containsValue("周星驰")); //获取map的大小 System.out.println(map.size()); //将map中的值返回 Collection<String> c = map.values(); System.out.println(c); System.out.println(map); //删除键是1001的数据并且将值返回 String s3 = map.remove(1001); System.out.println(s3); } }
Map的遍历
方式一:Map中的keySet()返回的是一个包含所有键的Set类型的对象,通过键获取值
package com.sutaoyu.Map; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Map_test_2 { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1001, "成龙"); map.put(1002, "周润发"); map.put(1003, "周星驰"); map.put(1004, "刘德华"); // 通过键获取值 String s = map.get(1004); System.out.println(s); // 获取map中所有的键返回给Set Set<Integer> keySet = map.keySet(); //遍历set获取键,根据键获取值 Iterator<Integer> iter = keySet.iterator(); while(iter.hasNext()) { Integer key = (Integer)iter.next(); System.out.println("键:" + key + ",值:" + map.get(key)); } ////使用增强for循环遍历 for(Integer key : map.keySet()) { System.out.println("键:" + key + ",值:" + map.get(key)); } } }
方式二:Map中的键和值被封装成了Entry对象,并存储在Set集合中,通过entrySet()可以获取到这个Set集合。
package com.monkey1024.map; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /** * Map的遍历 * */ public class MapTest03 { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1001, "成龙"); map.put(1002, "周润发"); map.put(1003, "周星驰"); map.put(1004, "刘德华"); //键和值被封装成了Entry对象,并存储在Set集合中 Set<Map.Entry<Integer,String>> entrySet = map.entrySet(); Iterator<Map.Entry<Integer,String>> it = entrySet.iterator(); while(it.hasNext()) { //获取每一个Entry对象 Entry<Integer,String> en = it.next(); //根据键值对对象获取键 Integer key = en.getKey(); //根据键值对对象获取值 String value = en.getValue(); System.out.println("键:" + key + ",值:" + value); } //增强for循环 for (Entry<Integer, String> en : map.entrySet()) { System.out.println("键:" + en.getKey() + ",值:" + en.getValue()); } } }
LinkedHashMap
LinkedHashMap的特点:存取顺序一致
package com.monkey1024.map; import java.util.LinkedHashMap; /** * LinkedHashMap简介 * */ public class MapTest04 { public static void main(String[] args) { LinkedHashMap<Integer,String> lhm = new LinkedHashMap<>(); lhm.put(1003, "周星驰"); lhm.put(1004, "刘德华"); lhm.put(1001, "成龙"); lhm.put(1002, "周润发"); System.out.println(lhm); } }
TreeMap
TreeMap的特点:可以对存储的元素进行排序
package com.monkey1024.map; import java.util.TreeMap; /** * TreeMap简介 * */ public class MapTest05 { public static void main(String[] args) { TreeMap<Integer,String> tm = new TreeMap<>(); tm.put(1003, "周星驰"); tm.put(1004, "刘德华"); tm.put(1001, "成龙"); tm.put(1002, "周润发"); System.out.println(tm); } }
HashMap和Hashtable的区别
Hashtable是JDK1.0版本出现的,是线程安全的,效率低,不可以存储null键和null值
HashMap是JDK1.2版本出现的,可以存储null键和null值