🎊专栏【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集合中的键获取对应的值 getString 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>() {@Overridepublic 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;}@Overridepublic 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);}@Overridepublic 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可以排序,使用时要有所甄别