Java双列集合Map 悠悠 2024-03-31 11:23 20阅读 0赞 **目录** 一、Map 1、Map的常见API 2、map集合的三种遍历方式 3、HashMap 4、LinkedHashMap 5、TreeMap -------------------- ### 一、Map ### **双列集合的特点** 1、双列集合一次需要存一对数据,分别为键和值 2、键不能重复,值可以重复 1双列集合一次需要存一对数据,分别为键和值2键不能重复,值可以 重复 3、键和值是一一对应的,每一个键只能找到自己对应的值 3键和值是一一对应的,每一个键只能找到自己对应的值 4、键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象” 4键+值这个整体我们称之为“键值对”或者“键值对对象”,在中叫做“Entry对象” #### 1、Map的常见API #### Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的 <table style="width:500px;"> <tbody> <tr> <td>方法名称</td> <td>说明</td> </tr> <tr> <td>v put(k key,v value)</td> <td>添加元素</td> </tr> <tr> <td>v remove(object key)</td> <td>根据键删除键值对元素</td> </tr> <tr> <td>void clear()</td> <td>移除所有的键值对元素</td> </tr> <tr> <td>boolean containsKey(object key)</td> <td>判断集合是否包含指定的键</td> </tr> <tr> <td>boolean containsValue(object value)</td> <td>判断集合是否包含指定的值</td> </tr> <tr> <td>boolean isEmpty()</td> <td>判断集合是否为空</td> </tr> <tr> <td>int size()</td> <td>集合的长度,也就是集合中键值对的个数</td> </tr> </tbody> </table> 示例: //创建map集合, Map<String,String> map = new HashMap(); //添加元素 map.put("张三","123"); map.put("李四","456"); map.put("王五","789"); System.out.println(map); System.out.println("_________________"); //根据键删除键值对元素 map.remove("张三"); System.out.println(map); //判断集合是否包含指定的键 boolean flag = map.containsKey("张三"); System.out.println(flag); //判断集合是否包含指定的值 boolean b = map.containsValue("456"); System.out.println(b); //判断集合是否为空 boolean empty = map.isEmpty(); System.out.println(empty); //集合的长度,也就是集合中键值对的个数 int size = map.size(); System.out.println(size); //移除所有的键值对元素 map.clear(); System.out.println(map); #### 2、map集合的三种遍历方式 #### **1、键找值** 示例: //创建map集合, Map<String,String> map = new HashMap(); //添加元素 map.put("张三","123"); map.put("李四","456"); map.put("王五","789"); //获取所有的键放在单列集合里 Set<String> stringSet = map.keySet(); //遍历单列集合,得到每一个键 for (String key : stringSet) { //通过键找到对应的值 String value = map.get(key); System.out.println(key + "=" + value); } System.out.println("-------------"); //通过迭代器遍历 Iterator<String> iterator = stringSet.iterator(); while (iterator.hasNext()){ String key = iterator.next(); String value = map.get(key); System.out.println(key + "=" + value); } System.out.println("-------------"); //通过Lambda表达式遍历 stringSet.forEach(s -> { //通过键找到对应的值 String value = map.get(s); System.out.println(s + "=" + value); }); **2、通过键值对** 示例: //创建map集合, Map<String,String> map = new HashMap(); //添加元素 map.put("张三","123"); map.put("李四","456"); map.put("王五","789"); //获取所有键值对放入一个集合 Set<Map.Entry<String, String>> entries = map.entrySet(); //增强for遍历集合 for (Map.Entry<String, String> entry : entries) { String key = entry.getKey(); String value = entry.getValue(); System.out.println(key + "=" + value); } System.out.println("-----------------"); //迭代器遍历 Iterator<Map.Entry<String, String>> iterator = entries.iterator(); while (iterator.hasNext()){ Map.Entry<String, String> next = iterator.next(); System.out.println(next); } System.out.println("-----------------"); //lambda表达式遍历 entries.forEach(Entry -> { System.out.println(Entry); }); **3、lambda表达式** 示例: //创建map集合, Map<String,String> map = new HashMap(); //添加元素 map.put("张三","123"); map.put("李四","456"); map.put("王五","789"); //匿名内部类 map.forEach(new BiConsumer<String, String>() { @Override public void accept(String s, String s2) { System.out.println(s + "=" + s2); } }); System.out.println("_________________"); //简化 map.forEach((String key,String value)->{ System.out.println(key + "=" + value); }); //简化 System.out.println("_________________"); map.forEach((key,value)->System.out.println(key + "=" + value)); #### 3、HashMap #### **HashMap的特点** 1、HashMap是Map里面的一个实现类。 2、没有特有方法,直接使用Map里面的方法就可以了。 3、特点都是由键决定的:无序、不重复、无索引 4、HashMap跟HashSet底层原理是一模一样的,都是哈希表结构 5、HashMap底层是哈希表结构的 6、依赖hashcode方法和equals方法保证键的唯一 7、如果键存储的是自定义对象,需要重写hashCode和equals方法如果值存储自定义对象,不需要 重写hashCode和equals方法 HashMap练习,统计投票数 //创建map集合, Map<String,Integer> map = new HashMap(); //添加元素;定义四个景点 List<String> list = new ArrayList<>(); String [] array = {"A","B","C","D"}; //定义票数 Random random = new Random(); for (int i = 0; i < 40; i++) { int index = random.nextInt(array.length); list.add(array[index]); } for (String name : list) { //判断当前景点是否在map集合中 if (map.containsKey(name)){ //存在 //先获取当前经典的票数 int count = map.get(name); //景点票数加1 count++; //再放回集合中 map.put(name,count); }else { //不存在 map.put(name,1); } } //求最大值 int max = 0; Set<Map.Entry<String, Integer>> entries = map.entrySet(); for (Map.Entry<String, Integer> entry : entries) { int count = entry.getValue(); if (count>max){ max = count; } } //判断那个景点票数最多,并打印 for (Map.Entry<String, Integer> entry : entries) { int count = entry.getValue(); if (count == max){ System.out.println(entry.getKey()); } } System.out.println(map); #### **4、LinkedHashMap** #### 由键决定:有序、不重复、无索引。 这里的有序指的是保证存储和取出的元素顺序一致 原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储 的顺序。 示例: //创建集合, LinkedHashMap<String,Integer> linkedHashMap = new LinkedHashMap<>(); //添加元素 linkedHashMap.put("a",1); linkedHashMap.put("a",2); linkedHashMap.put("c",3); linkedHashMap.put("d",4); //打印集合 System.out.println(linkedHashMap); #### 5、TreeMap #### TreeMap跟TreeSet底层原理一样,都是红黑树结构的。 由键决定特性:不重复、无索引、可排序 可排序:对键进行排序。 注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则 代码书写两种排序规则 1、实现Comparable接口,指定比较规则。 2、创建集合时传递Comparator比较器对象,指定比较规则。 示例: //创建集合, TreeMap<Integer,String> treeMap = new TreeMap<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { //o1表示当前要添加的元素 //o2表示已在红黑树存在的元素 //实现倒序 return o2-o1; } }); //添加元素 treeMap.put(5,"a"); treeMap.put(4,"b"); treeMap.put(3,"c"); treeMap.put(2,"d"); treeMap.put(1,"e"); //打印 System.out.println(treeMap);
还没有评论,来说两句吧...