java中容器类和接口总结(三):Map

如上图,java中的Map与collection接口不同,map中的元素由键值对(key,value)组成。

Map接口中键和值一一映射. 可以通过键来获取值。

  • 给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键来访问对应的值。
  • 当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常.
  • 当对象的类型和Map里元素类型不兼容的时候,就会抛出一个 ClassCastException异常。
  • 当在不允许使用Null对象的Map中使用Null对象,会抛出一个NullPointerException 异常。
  • 当尝试修改一个只读的Map时,会抛出一个UnsupportedOperationException异常。
Map 以按键 / 数值对的形式存储数据 ,这里要特别说明(   Map.Entry ,是 Map 的内部类,它用来描述 Map 中的键 / 值对)。   Map 是一个接口,我们平时多用它的实现类 HashMap
 1.key是用Set来存放的,不可重复,value是用Collection来存放的,可重复
  一个key-value对,是一个Entry,所有的Entry是用Set存放的,也是不可重复的。
 2.向HashMap中添加元素时,会调用key所在类的equals()方法,判断两个key是否相同,若相同则只能够添加进一个,则只能添加进后加的那个元素
import java.util.*;

public class TestMap{
	public static void main(String[] args) {
		TestMap tm = new TestMap();
		tm.test1();
		tm.test2();
		tm.testLinkedHashMap();
		tm.testTreeMap();
	}
    public void test1(){

    	System.out.println("***************Test1***************");
    	Map map = new HashMap();
        map.put("AA",213);
        map.put("BB",456);
        //添加相同的key会覆盖原来的键值对
        map.put("BB",45);
        map.put(123,"CC");
        map.put(null,null);
        map.put(new Person("xx",21),89);
        map.put(new Person("xx",21),87);//与上边的key相同所以map中是这个
        System.out.println(map.size());
        map.remove("BB");
        System.out.println(map);
        Object value = map.get(123);
        System.out.println(value);
        System.out.println("***************end***************");
    }
    /*
      Map 遍历
      1.Set keySet()
      2.Collection values()
      3.Set entrySet()
    */
    public void test2(){
    	System.out.println("***************Test2***************");
        Map map = new HashMap();
        map.put("AA",213);
        map.put("BB",45);
        map.put(123,"CC");
        map.put(null,null);
        map.put(new Person("xx",21),89);


        //1.使用keySet遍历
        Set set = map.keySet();
        for(Object obj : set){
            System.out.println(obj);
        }
        //2.使用values遍历
        Collection values = map.values();
        Iterator i = values.iterator();
        while(i.hasNext()){
            System.out.println(i.next());
        }
        //3.使用entrySet遍历
        Set set2 = map.entrySet();
        for(Object obj : set2 ){
            Map.Entry entry = (Map.Entry)obj;	//Map.Entry为Map的内部类
            System.out.println(entry.getKey() + "---->" + entry.getValue());
        }
        System.out.println("***************end***************");
    }

    public void testLinkedHashMap(){
    	System.out.println("************TestLinkedHashMap*************");
        Map map = new LinkedHashMap();
        map.put("AA",213);
        map.put("BB",45);
        map.put(123,"CC");
        map.put(null,null);
        map.put(new Person("xx",21),89);

        Set set1 = map.keySet();
        for(Object obj1 : set1){
            System.out.println(obj1 + "----->" + map.get(obj1));
        }
        System.out.println("***************end***************");
    }

    public void testTreeMap(){
    	System.out.println("************TestTreeMap*************");
        //自然排序
        Map map = new TreeMap();
        map.put(new Person("AA",23),89);
        map.put(new Person("MM",22),79);
        map.put(new Person("BB",23),99);
        map.put(new Person("CC",13),69);

        Set set1 = map.keySet();
        for(Object obj1 : set1){
            System.out.println(obj1 + "----->" + map.get(obj1));
        }
        System.out.println("***************end***************");
    }
    class Person implements Comparable<Person>{
    	private String name;
    	private int age;
    	public Person(String name,int age){
    		this.name = name;
    		this.age = age;
    	}
    	public String getName(){return this.name;}
    	public int getAge(){return this.age;}
    	@Override 
    	public boolean equals(Object o){
    		if(o instanceof Person){
    			Person p = (Person)o;
    			return this.name.equals(p.name) && this.age==p.age;
    		}
    		else
    			return false;
    	}
        @Override  
        public int hashCode() {  
            return Objects.hash(name, age);  
        }
		@Override
		public int compareTo(Person o) {
			// TODO Auto-generated method stub
			if(!this.name.equals(o.getName()))
				return this.name.compareTo(o.getName());
			else
				return this.age - o.getAge();
		}
		@Override
		public String toString() {
			// TODO Auto-generated method stub
			return name + "(" + age + ")";
		} 		
    }
}

猜你喜欢

转载自blog.csdn.net/u010183728/article/details/80050214