🎊专栏【Java基础】
🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。
🎆音乐分享【The truth that you leave】
🥰欢迎并且感谢大家指出我的问题
文章目录
- 🌺双列集合的特点
- 🎄Map
- 🍔Map常用的API
- ⭐创建Map集合的对象
- ⭐添加元素
- ✨注意
 
- ⭐移除元素
- ⭐清空元素
- ⭐判断是否存在某个 键 / 值
- ⭐判断集合是否为空
- ⭐判断集合的长度
 
- 🍔Map的遍历方式
- ⭐方法一:键找值
- ⭐方法二:键值对
- ✨分析一下Map.Entry<String,String>
 
- ⭐方法三:Lambda表达式
- ✨分析一下new BiConsumer<String, String>()
 
 
- 🎄HashMap
- 🍔特点
- 🍔例子
- ⭐注意
 
- 🎄LinkHashMap
- 🍔特点
- 🎄TreeMap
- 🍔特点
- ⭐两种排序规则
 
 
 
 
🌺双列集合的特点

- 双列集合一次需要存一对数据,分别是键和值
- 键不能重复,值可以重复
- 键和值是一一对应的,每一个键都能找到自己对应的值
- 键+值 这个整体我们称为"键值对"或者"键值对对象",在Java中称为"Entry对象"
🎄Map
🍔Map常用的API
⭐创建Map集合的对象

⭐添加元素
put("元素1","元素2");

✨注意
在添加元素的时候,如果键不存在,那么直接把 键值对对象 添加到map集合中,方法返回null
 在添加元素的时候,如果键是存在的,那么会把 原来的键值对对象覆盖,把被覆盖的值进行返回
 
⭐移除元素
remove("元素");

⭐清空元素
clear();

⭐判断是否存在某个 键 / 值

⭐判断集合是否为空

⭐判断集合的长度
size();

🍔Map的遍历方式
⭐方法一:键找值
package com.practice;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class practicedemo {
    public static void main(String[] args) {
        Map<String,String>map=new HashMap<>();
        map.put("1","2");
        map.put("3","4");
        map.put("5","6");
        //通过键找值
            //获取所有的键,把这些键都放到一个单列集合中
        Set<String>keys=map.keySet();
        for(String key:keys){
            //利用map集合中的键获取对应的值 get
            String value=map.get(key);
            System.out.println(key+"="+value);
        }
    }
}

⭐方法二:键值对
package com.practice;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class practicedemo {
    public static void main(String[] args) {
        Map<String,String>map=new HashMap<>();
        map.put("1","2");
        map.put("3","4");
        map.put("5","6");
        //通过键值对
            //获取所有的键值对对象,返回一个Set集合
        Set<Map.Entry<String,String>> entries = map.entrySet();
            //遍历entries这个集合,去得到里面的每一个键值对对象
        for (Map.Entry<String,String>entry:entries){
            //通过entry调用get方法获取键和值
            String key=entry.getKey();
            String value=entry.getValue();
            System.out.println(key+"+"+value);
        }
    }
}

✨分析一下Map.Entry<String,String>

 所以我们在表示Entry类型的时候,要使用Map(外部接口) . Entry去调用一下
⭐方法三:Lambda表达式
package com.practice;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
public class practicedemo {
    public static void main(String[] args) {
        Map<String,String>map=new HashMap<>();
        map.put("1","2");
        map.put("3","4");
        map.put("5","6");
        //通过lambda表达式
        	//匿名内部类的方式
        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 s, String s2) -> {
                System.out.println(s+"="+s2);
            }
        );
        System.out.println("----------------------------");
        
        map.forEach(( s, s2) -> System.out.println(s+"="+s2));
    }
}

✨分析一下new BiConsumer<String, String>()
为什么是new BiConsumer<String, String>()
我们来查看一下forEach的源码
 
 继续查看BiConsumer的源码

Lambda表达式只能用于实现只有一个抽象方法的接口,因为BiConsumer是一个接口,所以可以使用Lambda表达式
🎄HashMap
🍔特点
- HashMap是Map里面的一个实现类
- 方法可以直接使用Map里面的方法
- 特点都是由 键 决定的:无序,不重复,无索引
🍔例子
⭐注意
- HashMap底层是哈希表结构的
- 依赖hashCode方法和equals方法保证键的唯一
- 如果键存储的是自定义对象,需要重写hashCode和equals方法
- 如果值存储的是自定义对象,不需要重写hashCode和equals方法
Student.java
package com.itheima.a02myhashmap;
import java.util.Objects;
public class Student {
    private String name;
    private int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }
    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }
    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
    @Override
    public int hashCode() {
        //return Objects.hash(name, age);
        return name.hashCode();
    }
    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}
A01_HashMapDemo1.java
package com.itheima.a02myhashmap;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class A01_HashMapDemo1 {
    public static void main(String[] args) {
       /*
        需求:创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)。
        存储三个键值对元素,并遍历
        要求:同姓名,同年龄认为是同一个学生
        核心点:
            HashMap的键位置如果存储的是自定义对象,需要重写hashCode和equals方法。
       */
        //1.创建HashMap的对象
        HashMap<Student,String> hm = new HashMap<>();
        //2.创建三个学生对象
        Student s1 = new Student("zhangsan",23);
        Student s2 = new Student("lisi",24);
        Student s3 = new Student("wangwu",25);
        Student s4 = new Student("wangwu",25);
        //3.添加元素
        hm.put(s1,"江苏");
        hm.put(s2,"浙江");
        hm.put(s3,"福建");
        hm.put(s4,"山东");
        //4.遍历集合
        Set<Student> keys = hm.keySet();
        for (Student key : keys) {
            String value = hm.get(key);
            System.out.println(key + "=" + value);
        }
        System.out.println("--------------------------");
        Set<Map.Entry<Student, String>> entries = hm.entrySet();
        for (Map.Entry<Student, String> entry : entries) {
            Student key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + "=" + value);
        }
        System.out.println("--------------------------");
        hm.forEach((student, s)-> System.out.println(student + "=" +  s));
    }
}

🎄LinkHashMap
🍔特点
- 由键决定:有序,不重复,无索引
- 这里的有序是指保证存储和取出的元素顺序一致

🎄TreeMap
🍔特点
- TreeMap和TreeSet底层原理一样,都是红黑树结构的
- 由键决定特性:不重复,无索引,可排序
- 可排序是可以对键进行排序,默认按照键从小到大排序,也可以自己定义键的排序规则
⭐两种排序规则
- 实现Comparable接口,指定比较规则
- 创建集合时传递Comparator比较器对象,指定比较规则
默认是升序排列
 
 加上比较器后,可以变成降序排序

对比一下
HashMap效率高但是TreeMap可以排序,使用时要有所甄别



















