day19 Java map


I know, i know
地球另一端有你陪我




一、 Map

图。不是 Collection 的子类
包括:
1、HashMap
   ┕  LinkedHashMap
2、TreeMap


二、特点

Map集合的特点:
1、将键映射到值的对象
2、一个映射不能包含重复的键
3、每个键最多可以映射到一个值
    (即可以多对一,不可一对多)

映射  <K , V>
类似一一对应关系,一有夫妻对的叫法
举例:
<“剑帝” , “莱恩哈特”>
<“漆黑之牙” , “约修亚”>
<“歼灭天使” , “玲”>

泛型,即“参数化类型”。经数据的类型转为参数,转变为类似变量的存在
然后在调用时传入具体的类型(类型实参)
能够避免在在使用数据类型时犯错


三、HashMap

常用功能

1、增

V put(K key,V value)
将指定的值与该映射中的指定键相关联(可选操作)
举例:put(“漆黑之牙” , “约修亚”)

2、删

V remove(Object key)
如果存在(从可选的操作),从该地图中删除一个键的映射
举例:remove(“漆黑之牙”)

void clear()
从该地图中删除所有的映射(可选操作)

3、判断

boolean containsKey(Object key)
判断是否包含指定键

boolean containsValue(Object value)
判断是否包含指定值

boolean isEmpty()
判断图是否为空

4、长度

int size()
返回此地图中键值映射的数量

5、获取

Set<Map.Entry<K,V>> entrySet()
返回此Map中包含的映射的 Set 集

V get(Object key)
返回到指定键所映射的值,或null

Set keySet()
返回此图中包含的键的 Set集

Collection values()
返回此图中包含的值的 Collection 集合

    HashMap<String, String> hm = new HashMap<String, String>();
    //<“剑帝” , “莱恩哈特”>
    //<“漆黑之牙” , “约修亚”>
    //<“歼灭天使” , “玲”>
    hm.put("剑帝","莱恩哈特");
    hm.put("漆黑之牙","约修亚");
    hm.put("歼灭天使","玲");
    System.out.println(hm);

    hm.remove("歼灭天使");
    System.out.println(hm);

//    hm.clear();
//    System.out.println(hm.isEmpty());
//    System.out.println(hm);

    System.out.println(hm.containsKey("漆黑之牙"));
    System.out.println(hm.containsValue("约修亚"));

    System.out.println(hm.size());

    String s = hm.get("漆黑之牙");
    System.out.println(s);

    Set<String> keys = hm.keySet();
    System.out.println(keys);

    Collection<String> values = hm.values();
    System.out.println(values);

    Set<Map.Entry<String, String>> mapSet = hm.entrySet();
    System.out.println(mapSet);

6、遍历

根据键找值
1、获取Map集合中所有映射的键的Set集合
2、遍历键的集合,根据每一个键获取对应的值

    Set<String> keys = hm.keySet();
    System.out.println(keys);
    for (String key : keys) {
    
    
    	System.out.println(key + "---" + hm.get(key));
    }
    //	剑帝---莱恩哈特
	//	歼灭天使---玲
	//	漆黑之牙---约修亚

根据键值对对象找键和值
1、获取所有的键值对的集合
2、遍历所有键值对的集合,得到每一个键值对对象
3、根据获取到的每一个键值对,来获取键和值

	Set<Map.Entry<String, String>> mapSet = hm.entrySet();
	System.out.println(mapSet);
	for (Map.Entry<String, String> kv : mapSet) {
    
    
    	String key = kv.getKey();
    	System.out.println(kv.getKey() + "---" + kv.getValue());
}

引用类型遍历

    for (Map.Entry<Pokemon2, String> kv2 : hm2Set) {
    
    
        Pokemon2 key = kv2.getKey();
        System.out.println(key.getName() + "---"
                + key.getLevel() + "---" + kv2.getValue());
    }

四、LinkedHashMap

是实现了Map接口,底层是依赖于哈希表和链表的,具有可预知的遍历顺序
哈希表保证唯一性,保证的是Key的唯一性
链表保证有序,保证的是键的有序(存储和取出顺序一致)

    java.util.LinkedHashMap<Integer, Pokemon2> lhm = 
    new java.util.LinkedHashMap<>();

    Pokemon2 p1 = new Pokemon2("piplup",5);
    Pokemon2 p2 = new Pokemon2("piplup",5);
    Pokemon2 p3 = new Pokemon2("ralts",10);
    Pokemon2 p4 = new Pokemon2("lapras",30);
    Pokemon2 p5 = new Pokemon2("gardevoir",50);
    Pokemon2 p6 = new Pokemon2("piplup",10);

    lhm.put(1,p1);
    lhm.put(2,p2);
    lhm.put(3,p3);
    lhm.put(4,p4);
    lhm.put(5,p5);
    lhm.put(6,p6);

    Set<Map.Entry<Integer, Pokemon2>> lhmSet = lhm.entrySet();

    for (Map.Entry<Integer, Pokemon2> kv : lhmSet) {
    
    
        Pokemon2 value = kv.getValue();
        System.out.println(kv.getKey() + "---"
                + value.getName() + "---" + value.getLevel());

    }
}
	//	1---piplup---5
	//	2---piplup---5
	//	3---ralts---10
	//	4---lapras---30
	//	5---gardevoir---50
	//	6---piplup---10

五、TreeMap

底层是基于红黑树的Map接口的实现类
复杂引用类型,如自定义对象,需要实现接口 Comparable<> ,重写自然排序方法
根据 level 排序

	TreeMap<Pokemon, Integer> tm = new TreeMap<>(new Comparator<Pokemon>() {
    
    
        @Override
        public int compare(Pokemon o1, Pokemon o2) {
    
    
            int i = o1.getLevel() - o2.getLevel();

            int i2 = (i==0 ? o1.getName().compareTo(o2.getName()) : i);

            return i2;
        }
    });

    Pokemon p1 = new Pokemon("piplup", 5);
    Pokemon p2 = new Pokemon("ralts", 10);
    Pokemon p3 = new Pokemon("gardevoir", 30);
    Pokemon p4 = new Pokemon("pikachu", 15);
    Pokemon p5 = new Pokemon("eevee", 15);
    Pokemon p6 = new Pokemon("eevee", 15);

    tm.put(p1,1);
    tm.put(p2,2);
    tm.put(p3,3);
    tm.put(p4,4);
    tm.put(p5,5);
    tm.put(p6,6);

    Set<Map.Entry<Pokemon, Integer>> entries = tm.entrySet();

    for (Map.Entry<Pokemon, Integer> entry : entries) {
    
    

        System.out.println(entry.getKey().getName()
                +"---"+entry.getKey().getLevel());
    }
	//	piplup---5
	//	ralts---10
	//	eevee---15
	//	pikachu---15
	//	gardevoir---30

写法大致相同


总结

图。不是 Collection 的子类
包括:
1、HashMap
   ┕  LinkedHashMap
2、TreeMap

元素为键值对 < k , v >

由于依赖哈希表,所以是无序的,除了有链表支撑的 LinkedHashMap

おすすめ

転載: blog.csdn.net/qq_41464008/article/details/120790643
おすすめ