Map集合是键值对集合,集合的每个元素的格式:key=value(键值对元素)。
Map集合的完整格式:{key1=value1 , key2=value2 , key3=value3 , ...}
特点:Map集合的键是无序、不重复、无索引的,键值对都可以为null
主要的有:HashMap , LinkedHashMap , TreeMap
HashMap:元素按照键是无序,不重复,无索引,值不做要求。
LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求。
TreeMap:元素按照建是排序,不重复,无索引的,值不做要求。
- 添加元素 put()
- 删除 remove() clear()
- 是否包含键或值 containsKey() containsValue()
- 是否空 isEmpty()
- ...
Map<String ,Integer> maps=new HashMap<>(); maps.put("tea",18); maps.put("coffee",16); maps.put("toc",8); System.out.println(maps); //根据键:找值、删除、是否包含 System.out.println(maps.get("tea")); System.out.println(maps.get("tec")); System.out.println(maps.remove("toc")); System.out.println(maps.containsKey("tea")); //是否有这个值 System.out.println(maps.containsValue(16)); //获取全部键的集合 键也是不重复的,所以用set Set<String> keys=maps.keySet(); System.out.println(keys); //获取全部值的集合 值可以重复 Collection<Integer> val=maps.values(); System.out.println(val);
- 遍历一个Map集合
- 方式一:键找值的方式遍历:先获取Map集合全部的键,再根据遍历键找值。
- 方式二:键值对的方式遍历,把“键值对“看成一个整体。
- 方式三:JDK 1.8开始的:Lambda表达式。
System.out.println("- 1. 循环 键找值 ---------------------------------------"); for (String tag:maps.keySet()) { System.out.println(tag+"="+maps.get(tag)); } System.out.println("- 2. Map集合转Set集合 -----------------------------"); Set<Map.Entry<String,Integer>> entries=maps.entrySet(); System.out.println(entries); for(Map.Entry<String,Integer> entry:entries){ String key=entry.getKey(); Integer value=entry.getValue(); System.out.println(key + "=" + value); } System.out.println("- 3. Lambda forEach 其实内部有个Entry的for循环 返回键和值在" + "accept里面输出 ----------------"); maps.forEach(new BiConsumer<String, Integer>() { @Override public void accept(String s, Integer integer) { System.out.println(s+"="+integer); } });
- HashMap的特点
由键决定:无序、不重复、无索引。
HashMap底层是哈希表结构,依赖hashCode方法和equals方法保证键的唯一。
键要存储的是自定义对象,类似HashSet也是需要重写hashCode和equals方法。
- LinkedHashMap集合
由键决定:有序、不重复、无索引。保证存储和取出的元素顺序一致
每个键值对元素额外的多了一个双链表记录存储的顺序。
- TreeMap集合
由键决定:不重复、无索引、可排序
可排序:按照键数据的大小默认升序排序。
TreeMap集合自定义排序规则:
- 类实现Comparable接口,重写比较规则。
- 集合自定义Comparator比较器对象,重写比较规则。