🎊专栏【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可以排序,使用时要有所甄别