Map集合的特点
特点:
双列集合,元素由键值对(Entry)构成:
key(键) -- value(值)
注意:
键(key)不可以重复,值(value)可以重复
应用:
Map<T1, T2> map = new HashMap<>();
解释:
T1: 表示键的数据类型.
T2: 表示值的数据类型
成员方法:
V put(K key,V value); 添加元素(键值对的形式),
元素第一次添加, 返回null,
重复添加, 会用新值覆盖旧值, 并返回旧值.
V get(Object key); 根据键获取其对应的值
Set<K> keySet(); 获取所有键的集合.
import java.util.HashMap;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
//需求:往map集合中添加三个学生对象并打印。
// 1.创建集合对象
// 键:学生的编号;值:具体的学生对象
Map<Integer,Student> map=new HashMap<>();
// 2.创建元素对象
Student s1=new Student("张三",23);
Student s2=new Student("李四",23);
Student s3=new Student("张三",23);
// 3.将元素对象添加到集合中去
// 4.遍历集合,打印结果
System.out.println(map);
}
}
//学生类
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 String toString() {
return "Student{" +
"name='" + name + '\'' +
", 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);
}
}
因为没有进行3.将元素对象添加到集合中,所以map集合是空的打印结果为空
import java.util.HashMap;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
//需求:往map集合中添加三个学生对象并打印。
// 1.创建集合对象
// 键:学生的编号;值:具体的学生对象
Map<Integer,Student> map=new HashMap<>();
// 2.创建元素对象
Student s1=new Student("张三",23);
Student s2=new Student("李四",23);
Student s3=new Student("张三",23);
// 3.将元素对象添加到集合中去
Student stu1=map.put(1,s1);//返回Student类型的对象,用stu1接收。
System.out.println("stu1:"+stu1);
// 4.遍历集合,打印结果
System.out.println(map);
}
}
元素第一次添加, 返回null,
重复添加, 会用新值覆盖旧值, 并返回旧值.
import java.util.HashMap;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
//需求:往map集合中添加三个学生对象并打印。
// 1.创建集合对象
// 键:学生的编号;值:具体的学生对象
Map<Integer,Student> map=new HashMap<>();
// 2.创建元素对象
Student s1=new Student("张三",23);
Student s2=new Student("李四",23);
Student s3=new Student("张三",23);
// 3.将元素对象添加到集合中去
Student stu1=map.put(1,s1);//存储键为1,学生为张三的对象添加进去,第一次添加返回null
Student stu2=map.put(1,s2);//键1已经存在,新值s2覆盖旧值,返回旧值。stu2记录的是旧值
System.out.println("stu1:"+stu1);
System.out.println("stu2:"+stu2);
// 4.遍历集合,打印结果
System.out.println(map);
}
}
打印结果
实际工作中3.将元素对象添加到集合中会用如下代码,就是以上代码的3.用下边的代码替换
map.put(1,s1);
map.put(2,s2);
map.put(3,s3);
打印结果
4.遍历步骤:
双列集合不能直接遍历,要通过keySet()获取键值从而将集合转换成单列集合。
1. 获取所有键的集合. keySet()
2. 遍历所有的键, 获取到每一个键. 迭代器, 增强for.
3. 根据键, 获取指定的值. get()
// 4.遍历集合,打印结果
Set<Integer> keys=map.keySet();
// 使用迭代器
Iterator<Integer> it=keys.iterator();
while (it.hasNext()){
//如果迭代器中有数据,就获取
Integer key=it.next();
//根据键获取值ue
Student value=map.get(key);
System.out.println("key: " + key + "...value:" + value);
}
System.out.println(map);
}
打印结果
使用增强for循环遍历集合
Set<Integer> keys2=map.keySet();
for(Integer key:keys2){
Student value=map.get(key);
System.out.println("key: " + key + "...value:" + value);
}