前言:
对应的代码如下
public class Map_ { public static void main(String[] args) { //Map接口实现类的特点,使用实现类HashMap //1.Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value(双列元素) //2.Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中 //3.Map中的key不允许重复,原因和HashSet一样,前面分析过源码 //4.Map中的value可以重复 //5.Map中的key可以为null,value也可以为null,注意key为null,只能有一个。value为null,可以有多个 //6.常用String类作为Map的key Map map = new HashMap(); map.put("no1", "张三"); map.put("no2", "张无忌"); map.put("no1", "张三丰");//当有相同的key时,就等价于替换 map.put("no3", "张三丰");//k-v map.put(null, null); //k-v map.put(null, "abc");//等价替换 map.put("no5", null);//k-v map.put("no4", null); map.put(1, "赵梅");//k-v map.put(new Object(), "金毛狮王"); System.out.println(map.get(1));//赵梅 System.out.println("map=" + map); } }
输出结果如下
赵梅 map={no2=张无忌, null=abc, no1=张三丰, 1=赵梅, no4=null, no3=张三丰, no5=null, java.lang.Object@135fbaa4=金毛狮王}
Map接口特点
对应的代码如下
@SuppressWarnings({"ALL"}) public class MapSource_ { public static void main(String[] args) { Map map = new HashMap(); map.put("no1", "张三"); map.put("no2", "张无忌"); map.put(new Car(),new Person()); //1.k-v 最后是HashMap$Node node = newNode(hash, key, value, null) //2.k-v 为了方便程序员的遍历,还会创建EntrySet集合,该集合存放的元素的类型Entry,而一个Entry //对象就有k,v EntrySet<Entry<K,V>> 即: transient Set<Map.Entry<K,V>> entrySet; //3.entryset中,定义的类型是Map.Entry,但是实际上存放的还是HashMap$Node //这是因为static class Node<K,V> implements Map.Entry<K,V> //4.当把HashMap$Node对象,存放到entrySet就方便我们的遍历,因为Map.Entry提供了重要了方法 // K getKey(); V getValue(); Set set = map.entrySet(); System.out.println(set.getClass());//class java.util.HashMap$EntrySet for (Object obj : set) { // System.out.println(obj.getClass());//class java.util.HashMap$Node //为了从HashMap$Node中取出k-v //1.先做一个向下转型 Map.Entry entry = (Map.Entry) obj; System.out.println(entry.getKey() + "-" + entry.getValue()); } Set set1 = map.keySet(); System.out.println(set1.getClass());//class java.util.HashMap$KeySet Collection values = map.values(); System.out.println(values.getClass());//class java.util.HashMap$Values } } class Car{ } class Person{ }
输出结果如下
class java.util.HashMap$EntrySet no2-张无忌 no1-张三 com.map_.Car@135fbaa4-com.map_.Person@45ee12a7 class java.util.HashMap$KeySet class java.util.HashMap$Values
我会以代码的形式,把这些方法演示给大家
上代码:
第一个部分:
@Test public void test1(){ Map map = new HashMap(); //1.Object put(Object key,Object value):将指定的key-value添加到(或修改)当前map对象中 //添加操作 map.put("aa",123); map.put("BB",456); map.put("cc",78); //修改操作 map.put("aa",33); System.out.println(map); //2.void putAll(Map m):将m中的所有key-value对存放到当前map中 Map map1 = new HashMap(); map1.put("cc",100); map1.put("DD",400); map.putAll(map1); System.out.println(map); //3.Object remove(Object key):移除指定key的key-value对,并返回value map.remove("aa"); System.out.println(map); //4.void clear():清空当前map中的所有数据 map.clear(); System.out.println(map); //size()是输出集合中元素的个数 System.out.println(map.size()); }
输出结果:
{aa=33, BB=456, cc=78} {aa=33, BB=456, cc=100, DD=400} {BB=456, cc=100, DD=400} {} 0
第二部分:
@Test public void test2(){ Map map = new HashMap(); map.put("aa",123); map.put("BB",456); map.put("cc",78); map.put("aa",33); //5.Object get(Object key):获取指定key对应的value Object aa = map.get("aa"); System.out.println(aa); //6.boolean containsKey(Object key):是否包含指定的key boolean aa1 = map.containsKey("aa"); System.out.println(aa1); //7.int size():map中key-value的个数 System.out.println(map.size()); //8.boolean isEmpty():判断当前map是否为空 boolean empty = map.isEmpty(); System.out.println(empty); //9.boolean equals(Object obj):判断当前map和参数对象obj是否相等 Map map1 = new HashMap(); map1.put("aa",123); map1.put("BB",456); map1.put("cc",78); map1.put("aa",33); boolean ss = map.equals(map1); System.out.println(ss); }
输出结果:
33 true 3 false true
第三部分:
@Test public void test3(){ Map map = new HashMap(); map.put("aa",123); map.put("BB",456); map.put("cc",78); //遍历操作 //10.Set keySet():返回所有key构成的set集合 Set set = map.keySet(); Iterator iterator = set.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } System.out.println("****************"); //11.Collection values():返回所有value构成的Collection集合 Collection values = map.values(); for(Object obj:values){ System.out.println(obj); } System.out.println("***********************"); //12.Set entrySet():返回所有key-value对构成的Set集合 //遍历方法一: Set set1 = map.entrySet(); Iterator iterator1 = set1.iterator(); while (iterator1.hasNext()){ Object obj = iterator1.next(); //entrySet集合中的元素都是entry Map.Entry entry = (Map.Entry) obj; System.out.println(entry.getKey()+"=="+entry.getValue()); } System.out.println("----------"); //方法二: Set set2 = map.keySet(); Iterator iterator2 = set2.iterator(); while (iterator2.hasNext()){ Object next = iterator2.next(); Object obj = map.get(next); System.out.println(next +"="+obj); } }
输出结果:
aa BB cc **************** 123 456 78 *********************** aa==123 BB==456 cc==78 ---------- aa=123 BB=456 cc=78
Map的六大遍历方式,代码如下
@SuppressWarnings({"all"}) public class MapFor { public static void main(String[] args) { Map map = new HashMap(); map.put("aa", 11); map.put("bb", 22); map.put("cc", 33); map.put("dd", 44); map.put("ee", 55); //第一组:先取出所有的key,通过key取出对应的value Set keySet = map.keySet(); //(1)增强for循环 System.out.println("-----------第一种方式-----------"); for (Object key : keySet) { System.out.println(key + "-" + map.get(key)); } //(2)迭代器 System.out.println("-----------第二种方式-----------"); Iterator iterator = keySet.iterator(); while (iterator.hasNext()) { Object key = iterator.next(); System.out.println(key + "-" + map.get(key)); } //第二组,把所有的values取出 Collection values = map.values(); //这里可以使用所有的Collections使用的遍历方式 //(1) 增强for循环 System.out.println("----取出所有的value 使用增强for----"); for (Object value : values) { System.out.println(value); } //(2)使用迭代器 System.out.println("----取出所有的value 使用迭代器----"); Iterator iterator1 = values.iterator(); while (iterator1.hasNext()) { Object next = iterator1.next(); System.out.println(next); } //第三组:通过EntrySet 来获取k-v Set entrySet = map.entrySet(); //EntrySet<Map.Entry<K,V>> //(1)增强for System.out.println("-----使用EntrySet 的 增强for循环(第三种)-----"); for (Object entry : entrySet) { //将entry 转成Map.Entry Map.Entry m = (Map.Entry) entry; System.out.println(m.getKey() + "-" + m.getValue()); } //(2)迭代器 System.out.println("-----使用EntrySet 的 增强for循环(第4种)-----"); Iterator iterator2 = entrySet.iterator(); while (iterator2.hasNext()) { Object next = iterator2.next(); // System.out.println(next.getClass());//HashMap$Node 实现了Map.Entry(getKey,getValue) //向下转型HashMap$Node Map.Entry m = (Map.Entry) next; System.out.println(m.getKey() + "-" + m.getValue()); } } }