Hello,大家好呀,我是Yize!今天我们开始学习Map集合(双列集合),至于上次说的数据结构,我们后面在说!!

现在,我们开始:

目录

双列集合的特点及常用API

双列集合的特点:

Map常用API:

Map集合的三种遍历方式

键找值

键值对

Lambda表达式

Map分支

HashMap

LinkedHashMap

TreeMap

经典例题:


双列集合的特点及常用API

双列集合的特点:

①双列集合一次需要存一对数据,分别为键和值

②键不能重复,值可以重复

③ 键和值是一一对应的,每一个键只能找到自己对应的值

④键+值这个整体我们称之为“键值对”或者“键值对对象” ,在Java中叫做"Entry对象”

Map常用API:

其中put方法

添加数据时,如果键不存在,那么直接将键值对对象添加到map集合中,方法返回null

                      如果键存在,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回

Map集合的三种遍历方式

键找值

Map<String,String> map = new HashMap<>();

map.put("灰太狼","红太狼");
map.put("武大郎","潘金莲");
map.put("贾乃亮","李小璐");

//键找值
/将map中的键拿出来装进Set集合中/
Set<String> str = map.keySet();

//迭代器遍历集合
Iterator<String> it = str.iterator();
while(it.hasNext()){
    String i = it.next();
    /利用get方法获取当前键的值/
    String s = map.get(i);
    System.out.println(i + "=" + s);
}

键值对

Map<String,String> map = new HashMap<>();

map.put("灰太狼","红太狼");
map.put("武大郎","潘金莲");
map.put("贾乃亮","李小璐");

//键值对
/利用map集合调用entrySet方法,获取所有键值对的对象,放入Set集合当中/
Set<Map.Entry<String, String>> entry = map.entrySet();

for (Map.Entry<String, String> en : entry) {
    String s1 = en.getKey();
    String s2 = en.getValue();
    System.out.println(s1 + "=" + s2);
}

Lambda表达式

Map<String,String> map = new HashMap<>();

map.put("郭靖","小龙女");
map.put("武大郎","潘金莲");
map.put("贾乃亮","李小璐");

//lambda表达式遍历Map集合
map.forEach(( key,  value) -> System.out.println(key + "=" + value));

Map分支

HashMap

特点:
① HashMap是Map里面的一个实现类。
②没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。
③特点都是由键决定的: 无序不重复无索引
④ HashMap跟HashSet底层原理是一模一样的,都是 哈希表结构
注意点:HashMap的键位置如果存的是 自定义对象,需要重写 hashCodeequals方法

LinkedHashMap

特点:有序,不重复,无索引
原理:底层数据依然是哈希表,只是每个键值对元素又额外多了一个双链表的机制记录存储的顺序(与LinkedHashSet类似)

TreeMap

特点:可排序,不重复,无索引
对键进行排序,默认从小到大排序
原理:与TreeSet类似,底层数据结构都是红黑树
与TreeSet一样,有两种排序规则:
  1. 实现Comparable接口,指定比较比较
  2. 创建集合对象的时候,传递Comparator比较器对象,指定规则比较

经典例题:

统计一个字符串里每个字符出现的次数,按次数进行排序

        //统计字符串中每个字符出现的次数,按照字符出现次数排序
        String str = "ahvxldhbvlzshdvhbhaklanhaj";

        //统计每个字符出现的次数
        TreeMap<Character,Integer> tr = new TreeMap<>();

        for (int i = 0; i < str.length(); i++) {
            char s = str.charAt(i);
            if(tr.containsKey(s)){
                int count = tr.get(s);
                tr.put(s,count+1);
            }else{
                tr.put(s,1);
            }
        }
        //再次创建一个TreeMap,利用tr调用get()获取键对应的值,进行排序
        TreeMap<Character,Integer> tr2 = new TreeMap<>((o1,o2)->tr.get(o2)-tr.get(o1));
        tr2.putAll(tr);

        //遍历tr2,将字符和出现次数添加到StringBuilder中
        StringBuilder sb = new StringBuilder();
        for (Character key : tr2.keySet()) {
            sb.append(key).append("出现了").append(tr2.get(key)).append("次").append("\n");
        }
        System.out.println(sb);
注意点:
  1. 在第一个TreeMap中无法进行传递Comparator进行指定规则,因为获取不到集合
  2. 在第二个TreeMap集合中,利用get()方法获取到键所对应的值从而进行比较
好啦,本期的学习到此结束,我们下次见!!!
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐