一、Map集合
1、概述
现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等, 这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即 java.util.Map 接口。
我们通过查看 Map 接口描述,发现 Map 接口下的集合与 Collection 接口下的集合,它们存储数据的形式不同,如下图。
2、Map常用子类
二、 Map接口中的常用方法
Map接口的方法演示
public class MapDemo {
public static void main(String[] args) {
// 创建 map 对象
HashMap<String, String> map = new HashMap<>();
// 添加元素到集合
map.put("aa","11");
map.put("bb","22");
map.put("cc","33");
map.put("cc","33");
System.out.println(map);
// String remove(String key)
System.out.println(map.remove("cc"));
// 看aa 对应的值是多少
System.out.println(map.get("aa"));
System.out.println(map);
}
}
1、Map集合遍历键找值方式
代码演示
public class MapDemo1 {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
// 添加 元素到集合
map.put("胡歌","霍建华");
map.put("郭德纲","于谦");
map.put("薛之谦","大张伟");
// 获取所有的键 获取键集
Set<String> keys = map.keySet();
// 遍历键集 得到 每一个键
for (String key:keys){
// key 就是键
// 获取对应的值
String value = map.get(key);
System.out.println(key+"的cp是:"+value);
}
}
}
遍历图解
三、Entry键值对对象
1、Map集合遍历键值对方式
键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
操作步骤与图解:
-
获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示: entrySet() 。
-
遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。
-
通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示: getkey() getValue()
代码演示
public class MapDemo02 {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("胡歌","霍建华");
map.put("郭德纲","于谦");
map.put("薛之谦","大张伟");
//获取 所有的 entry 对象 entrySet
Set<Map.Entry<String,String>> entrySet = map.entrySet();
// 遍历得到每一个 entry对象
for (Map.Entry<String,String> entry : entrySet){
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"的cp是"+value);
}
}
}
遍历图解
四、练习
1、HashMap存储自定义类型键值
练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到 map集合中。学生作为键, 家庭住址作为值。
注意,学生姓名相同并且年龄相同视为同一名学生。
编写学生类
package people;
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;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return 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 &&
name.equals(student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
编写测试类
package people;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Set;
public class StudentTest {
public static void main(String[] args) {
HashMap<Student, String> map = new LinkedHashMap<>();
// 添加元素
map.put(new Student("lisi",28),"上海");
map.put(new Student("wangwu",22),"上海");
map.put(new Student("zhaoliu",24),"上海");
map.put(new Student("zhouqi",25),"上海");
map.put(new Student("wangwu",22),"南京");
// 取出元素 键找值方式
Set<Student> keySet = map.keySet();
for (Student key:keySet){
String value = map.get(key);
System.out.println(key.toString()+"....."+value);
}
}
}
2、LinkedHashMap
我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那在HashMap下面有一个子类L么我们要保证有序,还要速度快怎么办呢?
LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。
package people;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
public class LinkedHashMapDemo {
public static void main(String[] args) {
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("胡歌","霍建华");
map.put("郭德纲","于谦");
map.put("薛之谦","大张伟");
Set<Map.Entry<String,String>> entrySet = map.entrySet();
for (Map.Entry<String,String> entry : entrySet){
System.out.println(entry.getKey()+" "+entry.getValue());
}
}
}