java--集合-Map

java--集合-Map

一、什么是Map

 

  • 映射关系,也有人称为字典,Map集合里存在两组值,一组是key,一组是value。Map里的key不允许重复。通过key总能找到唯一的value与之对应。

 

  1. Map里的key集存储方式和对应的Set集合中的元素存储方式一致;
  2. 学生都有一个学号,我们能点学号就能找到某个学生,好比这个学号就是key,学生就是value。

 

 

  • Map.Entry是Map接口的内部接口,专门用来保存key-value内容:

二、Map常用方法

 

  1. void clear():删除该Map对象中所有的key-value对。也就是清理该集合;
  2. boolean containsKey(Object key):查询Map中是否包含指定的key;
  3. boolean containsValue(Object  value):查询Map中是否包含至少一个value;
  4. Set entrySet():返回Map所包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map内部类);
  5. Object get(Object key):返回指定key所对应的value,若此Map中不包含该key,返回null;
  6. boolean isEmpty():判断Map集合是否为空;
  7. Set keySet():返回该Map中所有key所组成的Set集合;
  8. Object put(Object key,Object value):添加一个key-value对,若Map中已有与key相等的key-value对,则新的key-value对覆盖原来的key-value对;
  9. void putAll(Map m):将m中的key-value赋值到调用该方法的Map对象中;
  10. Object remove(Object key):删除指定key所对应的key-value对,返回本删除key所关联的value,若key不存在,返回null;
  11. int size():返回该Map里面key-value对的个数;
  12. Collection values():返回Map里所有value组成的Collection。

 

三、Map.Entry

 

  • Entry是Map接口里面的一个内部接口.
  • 该接口用于封装key- value,有3个方法:

 

 

 

 

  1. Object getKey();返回Entry里包含的key值
  2. Object getValue();返回Entry里包含的value值
  3. Object setValue(Object value):设置Entry里包含的value值,并返回新设置的value值;

 

 

 

 

四、Map集合的输出

 

  • 按照最正统的做法,所有的Map集合的内容都要依靠Iterator输出,以上虽然是完成了输出,但是完成的不标准,Map集合本身并不能直接为Iterator实例化,如果此时非要使用Iterator输出Map集合中内容的话,则要采用如下的步骤:

 

 

 

 

方法一:

 

 

 

 

1.通过entrySet方法变成Set对象

 

 

 

 

2.调用Set的Iterator方法,此时每个Iterator对象是Map.Entry对象

 

 

 

 

3.对Map.Entry分离出 key - value

 

 

 

 

方法二:

 

 

 

 

1.通过keySet得到Map集合多有key的Set集合

 

 

 

 

2.调用Set的Iterator方法,此时每个Iterator对象是key值

 

 

 

 

 

3.通过Map的getValue(key)得到value值

 

 

 

 

 

五、Map集合常用类

 

  • HashMap:线程不安全,速度快,允许存放null键,null值。类中的key都属于无序存放的

 

 

 

 

 

 

  1. 即使HashMap线程不安全,在多线程中也推荐使用
  2. Collections类: public static  Map synchronizedMap(Map m)来返回线程同步的映射;
  3. HashMap里的key存储和保存HashSet里面的元素一致,若自定义类作为HashMap或Hashtable的key:当两个key对象的equals方法返回true时,两个key对象的hashCode值也应一样;

 

 

 

 

 

 

 

  • TreeMap:对key进行排序,排序原理与TreeSet相同。

HashMap实例

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;


public class MapDemo {
	public static void main(String[] args) {
		
		Map map = new  HashMap();
		/**
		 * Map里的key必须唯一,不然后续的会覆盖前面的
		 * 
		 *	Entry是Map的内部接口: 表示一组映射关系
		 *
		 *	Map里key不记录顺序,  和 Set一样;
		 *	
		 * 
		 */
		map.put("1", "A");
		map.put("1", "C");
		map.put("2", "B");
		map.put("3", "C");
		map.put(null, null);
		
		System.out.println(map);
		/**
		 * boolean containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。
		 * boolean containsValue(Object value)  如果此映射将一个或多个键映射到指定值,则返回 true。  
		 */
		
		System.out.println(map.containsKey("3"));
		System.out.println(map.containsKey("33"));
		System.out.println(map.containsValue("E"));
		System.out.println(map.containsValue("C"));
		
		/*
		 *  Object get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。 
		 * */
		
		Object v = map.get("3");
		System.out.println(v);
		
		/*
		 * void putAll(Map m) 
          			从指定映射中将所有映射关系复制到此映射中(可选操作)。  
		 * */
		
		Map map2 = new HashMap();
		map2.put("A", "春哥");
		map2.put("C", "著姐");
		
		map.putAll(map2);
		
		System.out.println(map);
		
		/*
		 *  Object remove(Object key)  如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 
		 * */
		
		 v = map.remove("A");
		 System.out.println(v);
		 System.out.println(map);
		 /**
		  * int size()  多少组映射关系(Entry)
		  */
		 System.out.println(map.size());
		
		 /*
		  * Set entrySet() 返回此映射中包含的映射关系的 Set 视图。 
		  * */
		 
		 Set entrys = map.entrySet();
		 
		 for (Object o : entrys) {
			
			 if(o instanceof Map.Entry){
				 Map.Entry entry  = ( Map.Entry) o;
				 
				 /*
				  *  Object getKey()   返回与此项对应的键。 
				 	 Object getValue()  返回与此项对应的值。 
				 	 Object setValue(V value) 用指定的值替换与此项对应的值(可选操作)。 

				  * */
				 System.out.println("entry.key-->"+entry.getKey());
				 System.out.println("entry.value-->"+entry.getValue());
				 System.out.println("entry.setvalue-->"+entry.setValue("Will"));
				 System.out.println("entry.value-->"+entry.getValue());
			 }
		}
		 System.out.println(map);
		 
		 /*
		  * Set keySet()    返回此映射中包含的键的 Set 视图。 
		  * */
		 
		Set keys =  map.keySet();
		for (Object key : keys) {
			System.out.println("key-->" + key);
			System.out.println("value-->" + map.get(key));
		}
		
		
		/*
		 * Collection<V> values()  返回此映射中包含的值的 Collection 视图。 
		 * */
		
		Collection vs = map.values();
		for (Object val : vs) {
			System.out.println("value===  " + val);
		}
		
		//==========================================
		//Can only iterate over an array or an instance of java.lang.Iterable
		/*for(Object obj : map){
			
		}*/
	}
}

 

六、TreeMap

 

 

  • HashMap子类中的key都属于无序存放的,如果现在希望有序(按key排序)则可以使用TreeMap类完成,但是需要注意的是,由于此类需要按照key进行排序,而且key本身也是对象,那么对象所在的类就必须实现Comparable接口。
  • 使用  HashMap的时候 key和 value都可以保存为  nulll;
  • 当 使用 TreeMap 的时候  key不能为null,value可以是 null;
  • TreeMap对key的排序方式:

 

 

 

 

 

 

 

  1. 自然排序;
  2. 定制排序;

 

 

 

 

 

 

 

  • TreeMap判断两个key元素是否相等标准(和HashSet一样):

 

 

 

 

 

 

 

 

  1. compareTo方法或compare方法返回0;

 

 

 

 

 

 

 

 

TreeMap实例

import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;

class A implements Comparable{

	public int compareTo(Object o) {
		return 0;
	}
	
}
public class TreeMapDemo {
	public static void main(String[] args) {
		
		TreeMap m  = new TreeMap();
		
		m.put("3", "3");
		m.put("7", "7");
		m.put("-9", "-9");
		m.put("A", "A");
		
		System.out.println(m);
		/**
		 * Map.Entry ceilingEntry(K key) 
          			返回一个键-值映射关系,它与大于等于给定键的最小键关联;如果不存在这样的键,则返回 null。 
		 */
		
		System.out.println(m.ceilingEntry("4"));
		
		/**
		 * Map.Entry firstEntry() 
          		返回一个与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。 
		 */
		
		System.out.println(m.firstEntry());
		
		m = new TreeMap();
		//m.put("A", new A());
		//m.put("A", new A());
		
		m.put(new A(), "A");
		m.put(new A(), "A");
		m.put(new A(), "A");
		m.put(new A(), "A");
		/*
		 * 使用  HashMap的时候 key和 value都可以保存为  nulll;
			当 使用 TreeMap 的时候  key不能为null,value可以是 null;
				对象要调用 compreTo方法比较,
		 * */
		m.put(null,null);
		System.out.println(m);
		
		//Map里 key的定制排序
		m = new TreeMap(new Comparator() {
			public int compare(Object o1, Object o2) {
				return 0;
			}
		});
		
		/**
		 * 	HashSet    HashMap
		 * 	TreeSet	   TreeMap
		 * 
		 * 
		 * 其实 Set和Map在底层有莫大的关系:
		 * 	可以这样理解:
		 * 		HashMap里的key其实就是HashSet元素;
		 * 			
		 * 		public HashSet() {
        			map = new HashMap<>();
    			}
		 */
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章