一天一个java知识点----集合(三)---Map

Map集合

认识Map集合(Map集合是键值对集合)

  • Map集合也被叫做“键值对集合”,格式:{key1=value1 , key2=value2 , key3=value3 , ...}
  • Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己对应的值

Map集合概述

需要存储一一对应的数据时,就可以考虑使用Map集合来做。

Map集合体系的特点

注意:Map系列集合的特点都是由键决定的,值只是一个附属品,值是不做要求的

HashMap(由键决定特点): 无序、不重复、无索引;  (用的最多)

javascript
HashMap map1 = new HashMap<>();
map1.put("004", "张三");
map1.put("004", "李四");//覆盖了张三,key=004,value=李四
map1.put("003", "王五");
map1.put("007","abc");
map1.put("008","dd");
map1.put("abc","dd");
map1.put("009","dd");
System.out.println(map1);//{003=王五, 004=李四, 007=abc, 008=dd, abc=dd, 009=dd}

LinkedHashMap(由键决定特点):由键决定的特点:有序、不重复、无索引。

javascript
LinkedHashMap map2 = new LinkedHashMap<>();
map2.put("004","张三");
map2.put("004","李四");//覆盖了张三,key=001,value=李四
map2.put("002","abc");
map2.put("008","dd");
map2.put("abc","dd");
map2.put("009","dd");
System.out.println(map2);

TreeMap(由键决定特点):按照大小默认升序排序、不重复、无索引。

javascript
TreeMap map3 = new TreeMap<>();
map3.put("a","张三");
map3.put("b","李四");//覆盖了张三,key=001,value=李四
map3.put("e","abc");
map3.put("c","dd");
map3.put("h","dd");
System.out.println(map3);//{a=张三, b=李四, c=dd, e=abc, h=dd}

Map集合的常用方法

注意:Map是双列集合的祖宗,它的功能是全部双列集合都可以继承过来使用的。

一天一个java知识点----集合(三)---Map_第1张图片

javascript
Map map1 = new HashMap<>();
map1.put("004","张三");
map1.put("004","李四");//覆盖了张三,key=001,value=李四
map1.put("002","abc");
map1.put("008","dd");
map1.put("abc","dd");
map1.put("009","dd");
map1.put(null,null);//key也可以为null
System.out.println(map1);

// map集合的大小 size()
System.out.println(map1.size());//6
// 判断集合是否为空 isEmpty()
System.out.println(map1.isEmpty());
// 清空集合
// map1.clear();
// 判断集合中是否存在某个键 containsKey(key)
System.out.println(map1.containsKey("004"));// true
System.out.println(map1.containsKey("0041"));// false
// 判断集合中是否包含某个值 containsValue(value)
System.out.println(map1.containsValue("dd"));// true
// 获取某个键对应的值 get(key)
System.out.println(map1.get("004"));// 李四
// 获取所有的键 : public Set keySet()
Set keys = map1.keySet();
System.out.println(keys);// [null, 002, 008, abc, 009, 004]
// 获取所有的值 : public Collection values()
Collection values = map1.values();
System.out.println(values);// [null, abc, dd, dd, dd, 李四]

Map集合的遍历方式

Map集合的遍历方式一:键找值

简单来说:先获取Map集合全部的键,再通过遍历键来找值

一天一个java知识点----集合(三)---Map_第2张图片

Java
//键找值遍历方式
//1.获取所有key的set集合
Set keys = map.keySet();
for (String key : keys) {
    System.out.println(key + "=====" + map.get(key));
}

Map集合的遍历方式二:键值对(难点)

简单来说:把“键值对“看成一个整体进行遍历。

一天一个java知识点----集合(三)---Map_第3张图片

一天一个java知识点----集合(三)---Map_第4张图片

Java
//键值对遍历方式
//1.获取所有所有键值对的set集合
Set> entries = map.entrySet();

//2.遍历set,每个元素是键值对对象
for (Map.Entry entry : entries) {
    System.out.println(entry.getKey()+"===="+entry.getValue());
}

Map集合的遍历方式三:Lambda表达式

Java
public class BiConsumerImpl implements BiConsumer{
    @Override
    public void accept(String key, Integer val) {
        System.out.println(key+"===="+val);
    }
}

Java
//使用真实实现类去遍历
map.forEach(new BiConsumerImpl());

//匿名内部类
map.forEach(new BiConsumer(){
    @Override
    public void accept(String key, Integer val) {
        System.out.println(key+"====="+val);
    }
});

//lambda表达式
map.forEach((key,val)-> System.out.println(key+"====="+val));

使用真实实现类去遍历:就是把匿名内部类BiConsumer写出去。

补:写代码的细节进阶:若程序中只有一个if{}else{},尽可能转换成三目运算符来表达

Java
(条件 ? true : false);

Map集合的实现类

HashMap集合的底层原理(HashMap用的最多)

特点:HashMap(由键决定特点): 无序、不重复、无索引;  (用的最多)

实际上:Set系列集合的底层就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。

一天一个java知识点----集合(三)---Map_第5张图片

HashMap跟HashSet的底层原理是一模一样的,都是基于哈希表实现的。

LinkedHashMap的底层原理

特点:LinkedHashMap (由键决定特点):由键决定的特点:有序、不重复、无索引。

实际上:原来学习的LinkedHashSet集合的底层原理就是LinkedHashMap。

底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序)。

TreeMap的使用

特点:TreeMap (由键决定特点):按照大小默认升序排序,只能对键排序、不重复、无索引。

原理:TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序。

红黑树是自平衡的二叉排序树---》小的在左,大的在右。

TreeMap集合同样也支持两种方式来指定排序规则

  • 让类实现Comparable接口,重写比较规则。
  • TreeMap集合有一个有参数构造器,支持创建Comparator比较器对象,以便用来指定比较规则。

Java
//Student类中实现implements Comparable
//Student类中重写compareTo
@Override
public int compareTo(Student o) {
    return this.getAge() - o.getAge();
}

Java
//目标:TreeMap,key是Student,根据学生年龄升序
//TreeMap objectObjectTreeMap = new TreeMap<>(); key=age,value=student
//方案1:根据Student实现Comparable接口重写的compareTo方法,进行排序
TreeMap map = new TreeMap<>();
map.put(new Student("张三", 20, 99.9, "北京"), "张三");
map.put(new Student("李四", 18, 99.9, "上海"), "李四");
map.put(new Student("王五", 22, 99.9, "广州"), "王五");
map.put(new Student("赵六", 19, 99.9, "深圳"), "赵六");
System.out.println(map);

//方案2:根据TreeMap构造器中Comparator比较器排序
TreeMap map2 = new TreeMap<>((o1, o2) -> Double.compare(o1.getScore(),o2.getScore()));
map2.put(new Student("张三", 20, 92.9, "北京"), "张三");
map2.put(new Student("李四", 18, 95.9, "上海"), "李四");
map2.put(new Student("王五", 22, 93.9, "广州"), "王五");
map2.put(new Student("赵六", 19, 96.9, "深圳"), "赵六");
System.out.println(map2);

你可能感兴趣的:(java,apache,开发语言)