zoukankan      html  css  js  c++  java
  • 详解Map集合体系及方法entrySet、keySet、values

    简单回顾Map集合:

    Map表示映射关系,以键值对的方式来保存数据。key和value一一对应。key是唯一的,不可重复,而value是可重复的,可以被多个key关联。虽然Map是放入两个数据,但是却以key作为操作对象,value只是作为key的关联值。

    通过查看,会发现Set与Map的实现类很相似,Set实现类的底层操作就是用Map来实现的,Set集的特性就来自于Map。唯一不同的就是Map表示一种映射关系,一次存储2个数据,Set只能存储单一数据。

    Map体系中的主要类:

    • HashMap:Map的典型实现,元素是无序且不可重复,这里的元素指的是key。
    • LinkedHashMap:以插入的次序作为排序状态,其他的和HashMap一致。
    • TreeMap:元素处于排序状态,可以使用自然排序也可以使用自定义排序,但key的类型必须一致,不然无法进行比较。
    • Properties:Key-Value都是String类型,用于加载属性文件。后续会说到。

    Map的重要方法和特点:

    常用方法就不概述,关于Map中方法的使用细节,例如replace()和remove()方法,如果返回值是Object,则会返回以前的value,返回值boolean,代表是否执行成功。重点需要了解entrySet()、keySet() 和values()的使用。
    • entrySet()___返回一个包含所有映射关系的Set集合,该Set集合的类型为Map.Entry,一般用于迭代键值对。Map.Entry是一个内部接口。
    • keySet()__..._返回该映射中所有key组成的Set集合。通过key获取键值对。
    • values()___._返回该映射中所有value值。
    • 这三个方法主要用于遍历键值对或直接获取value值,非常方便。但使用返回对象的方法时,会引发错误。代码示例和解析在最下面。

    HashMap的代码示例

    		HashMap hm = new HashMap();
    		//放入键值对
    		hm.put("cn", "中国");
    		hm.put(1, 100);		
    		hm.put("us", "美国");
    		hm.put("Ja", "日本");
    		hm.put("时间", new Date());
    		hm.put(1, 200);//用同一个key关联别的value
    		System.out.println(hm);	//等同于hm.toString()
    		
    		System.out.println("----根据key获取关联的值------");
    		System.out.println(hm.get("Ja"));
    		System.out.println(hm.get(1));
    			
    		System.out.println("----替换指定的键值对-------");
    		System.out.println(hm.replace(1, "100"));//返回被替换的value
    		System.out.println(hm.replace("us", "美国","FuckYou"));//返回boolean,表示是否替换成功
    		
    		System.out.println("----删除指定键值对----");
    		System.out.println(hm.remove("Ja"));//返回被删除的value
    		System.out.println(hm.remove("Ja","日本"));//返回是否成功删除
    典型的Map实现,查看打印结果:元素是无序且不可重复的。在代码中放入两个相同的键值对,key只能有一个,如果value也不同,后来添加的value会覆盖原来的value。
     

    LinkedHashMap简单示例

    		LinkedHashMap lhm = new LinkedHashMap();
    		lhm.put(1,"B");
    		lhm.put(4,"A");
    		lhm.put(3,"C");
    		lhm.put(2,"D");
    		System.out.println(lhm);
    		//输出:{1=B, 4=A, 3=C, 2=D}
    LinkedHashMap就是以插入次序作为排序状态,别的和HashMap一致。非常类似于HashSet与LinkedHashSet的关系。
     

    entrySet() 和 keySet() 和 values()的代码示例

    以TreeMap为例,演示entrySet()

    		TreeMap tm = new TreeMap();	
    		tm.put(1, "壹");		
    		tm.put(3, "叁");
    		tm.put(6, "陆");
    		tm.put(7, "柒");
    		
    		//使用迭代器来遍历元素
    		Set entrys = tm.entrySet();
    		Iterator it = entrys.iterator();
    		while(it.hasNext()) {
    			Map.Entry entry = (Map.Entry)it.next();//转换成Map.Entry类型
    			System.out.println(entry.getKey() +"-" + entry.getValue());			
    		}

    以TreeMap为例,演示keySet()

    		TreeMap tm = new TreeMap();	
    		tm.put(1, "壹");		
    		tm.put(3, "叁");
    		tm.put(6, "陆");
    		tm.put(7, "柒");
    		
    		Set k = tm.keySet();
    		Iterator it = k.iterator();
    		//mode 1
    		while(it.hasNext()) {
    			Object key = it.next();//获取key
    			System.out.println(key + "->" + tm.get(key));
    		}
    		//mode 2
    		for(Object key : k) {
    			System.out.println(key +"->" + tm.get(key));
    		}

    以TreeMap为例,演示values()

    		TreeMap tm = new TreeMap();	
    		tm.put(1, "壹");		
    		tm.put(3, "叁");
    		tm.put(6, "陆");
    		tm.put(7, "柒");
    		Collection value = tm.values();	
    		for(Object v : value) {
    			System.out.println(v);
    		}
     

    entrySet() keySet() 和 values()返回对象中的操作方法

    		TreeMap tm = new TreeMap();	
    		tm.put(1, "壹");		
    		tm.put(3, "叁");
    		tm.put(6, "陆");
    		tm.put(7, "柒");
    		Set entry = tm.entrySet();	
    		Set key = tm.keySet();
    		Collection value = tm.values();		
    
    //		entry.add("A");引发不支持的操作异常
    		System.out.println(entry.remove(1));//false
    		System.out.println(entry.contains(3));//false
    		
    		System.out.println(key.remove(1));//true
    		System.out.println(key.contains(3));//true
    		
    		System.out.println(value.remove("壹"));//false
    上面代码中,可以看出无论是返回Set对象还是Collection,添加元素都会引发不支持的操作异常。这是因为返回的集合对象本质上依然是对键值对操作。它们的不同之处:
    entrySet()中有key和value,所以直接加入元素或者删除元素的方法都是无效的。keySet()中有key,可以对key进行操作,所以能使用remove()和equals(),所以返回true。
    values()中只有value值,没有key,value值是没什么用的,所以values()方法也仅仅是获取所有value值方便。
    相同之处:
    方法中如果没有参数,不涉及到对键值对进行的操作,都是可以使用的。例如Iterator()、clear()、size()和isEmpty()等。
     

    entrySet() 和 keySet() 和 values()的使用总结:

    • 一般只使用它们的迭代器,用于获取所有键值对。
    • 除了迭代器,对元素进行操作的方法不建议使用,容易出错。
    • 如果要高效遍历key-value,建议使用entrySet(),keySet()也可以做到,但需要通过key来获取value,多增加了一步。
    • 获取所有key就使用keySet(),获取所有value就使用values()
  • 相关阅读:
    oracle与DB2
    oracle ORA-01427: 单行子查询返回多个行
    mysql开发总结
    mysql show profile基本详解
    mysql批量插入数据
    mysql索引详解
    mysql性能调优
    MySQL优化
    mysql主从调优
    mysql主从复制
  • 原文地址:https://www.cnblogs.com/fwnboke/p/8529656.html
Copyright © 2011-2022 走看看