⚔疯狂输出⚔ Collection 之 Map 子类

来源:互联网 发布:英雄无敌5 mac版 编辑:程序博客网 时间:2024/06/02 04:50

Map 数据保存的形态 以键值形态成对存储 一一对应 分别 是 key 和value 键是唯一的不可重复
//接下来我们用Map写一小段程序

Map<String,Integer>  map = new Map<>();//保存键值对int num  =  map.put("小明",18);int num1  =  map.put("小方",20;int num2  = map.put("小刚",23);//打印System.out.println(num);System.out.println(num1);System.out.println(num1);

结果

nullnullnull

下面我们写一个和上面一样的程序有一点不同的是我们创建两个 小明

Map<String,Integer>  map = new Map<>();//保存键值对int num  =  map.put("小明",18);int num1  =  map.put("小方",20;int num2  = map.put("小刚",23);int  num3  =  map.put("小明",33);//打印System.out.println(num);System.out.println(num1);System.out.println(num2);System.out.println(num3);

结果

nullnullnull33

为什么 会有个33了呢 而不是null了呢?原因是什么呢?
原因是因为地址的原因 我们每一次 new一个元素都会保存他的地址 因为出现了两个小明但是他们两个不是同一个元素
但是键值是相同的 键不会重复保存 但是后面的元素会覆盖前面那个元素

HashMap 和HashSet 长的这么像 是不是有什么关系呢?
HashSet底层的实现是依赖 Hashmap的
再向HashSet中添加的 值 相当于 在 map中 添加到key的位置

为什么 HashSet 和HashMap底层要使用 HashMap来实现呢?
因为他们底层都是用哈希算法来写的 所以使用一套就可以了
利用我们面向对象封装的特点来实现的。

HashSet系统里面写的方法
这里写图片描述

HashMap系统里面写的方法
这里写图片描述

HashMap和TreeSet
HashSet 去重功能 都是说的这个键(key) 重写 hashCode();和equals();
TreeSet 排序功能(去重功能) 都是说的这个键(key) 重写 hashCode();和equals();
去重 和排序 相当于是对map键去操作。
系统里面HashMap重写 hashCode和equals
hashCode
这里写图片描述
equals方法
这里写图片描述

系统里面TreeSet重写 hashCode和equals
这里写图片描述

这里写图片描述
接下来我们用写一个 用HashMap 有去重功能的集合

      HashMap<Student, String>map = new HashMap<>();    map.put(new Student("王龙", 18), "北京");    map.put(new Student("涵涵", 23), "无锡");    map.put(new Student("松", 21), "徐州");    map.put(new Student("王龙", 18), "上海");    System.out.println(map);

TreeMap 也有排序功能 键(key)

总结 Map 以键值的形态储存数据键值是成对出现的 键是唯一不可重复的
Map
Set
他们的去重 和排序 都是 对键进行操作的

接下来 map 的遍历方法
map不能直接遍历集合只能间接的遍历
有三种方法

方法一
map 类中 没有迭代器 不能直接迭代(遍历)

//创建三个元素Hashmap<StringInteger>  map = new Hashmap<>();map.put("老王"10);map.put("老宋"3);map.put("老越"13);//去掉所有的keySet<String>keySet  = map.keySet();//取出Set里面的迭代器Iterator<String>  iterator  = keySet.iterator();//为了拿到集合中所有的key 所以要遍历Set集合while (iterator.hasNext()){//获取集合内 每一个元素 String key = Setkey.next(); //通过每一个 key 找出 对应的value的值 Integer value  = map.get(key);  //从map中找出key的值} }}

方法 二 循环遍历
Set keySet()这个方法是 把 map中的所有键(key)取出来 放入一个Set集合中 返回给你

Hashmap <String,Integer>  map =  new  Hashmap<>();map.put("老王"13);map.put("老宋"16);map.put("老岳"18);//去掉所有的的keySet<String>keySet = map.keyset();//利用增强for循环遍历for(String  key:keySet){//通过每一个key 找出 对应的value得值Integer  value = map.get(key);//打印 每一个key对应的值System.out.println(key+"="+value);}

方法三
entrySet();
该方法返回的是一个集合 集合中存储是一个一个键值对 对象
Entry对象 中 保存 key和value
利用该方法遍历

HashMap<String, Integer> map  = new  HashMap<>();        map.put("小王", 11);        map.put("小刚", 13);        map.put("小红", 10);        map.put("小兰",21);        //获取map中所有的  Entry 对象的Set集合        Set<Map.Entry<String, Integer>> entrSet = map.entrySet();        //使用  Set集合中  的迭代器  对每一个Entry对象  遍历        java.util.Iterator<Entry<String, Integer>>   iterator  = entrSet.iterator();        //迭代        while (iterator.hasNext()) {            //取出entry对象             Entry<String, Integer> next =iterator.next();             //从Entry 对象中 获取key 和 value              String key =  next.getKey();             Integer value = next.getValue();             System.out.println(key+"="+value);        }