Map集合
1.双列集合,可以存储键值对关系的数据,所有数据结构只与键有关,不能包含重复的键,每个键最多只能映射一个值
2.分类:HashMap edHashMap TreeMap
3.Map集合的基本功能
V put(K key,V value) //向集合中添加键值,如果键相同则值覆盖,返回被覆盖的值
V remove( key)//如果存在一个键的映射关系,则将其从此映射中移除
void clear()//从此映射中移除所有映射关系
boolean containsKey( key)//如果此映射包含指定键的映射关系,则返回 true
boolean containsValue( value)//如果此映射将一个或多个键映射到指定值,则返回 true
boolean isEmpty()//如果此映射未包含键-值映射关系,则返回 true
int size()//返回此映射中的键-值映射关系数
V get( key)//返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
Collection<V> values()//返回此映射中包含的值的 Collection 视图
Set<K> keySet()//返回此映射中包含的键的 Set 视图
Set<Map.Entry<K,V>> entrySet()//返回此映射中包含的映射关系的 Set 视图
4.集合的遍历方式
a 键找值,使用keySet()和get()方法
b 键值对对象,用entrySet()方法
(一)HashMap
1.其底层数据结构为哈希表,元素无序且唯一,通过重写hashCode()方法和equals()方法来保证其键的唯一性,允许null值和null键
import java.util.HashMap;
import java.util.Map;
import java.util. s;
import java.util.Set;
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( o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
s.equals(name, student.name);
}
@Override
public int hashCode() {
return s.hash(name, age);
}
}
public class Test {
public static void main(String[] args) {
Map<Student, String> hashMap = new HashMap<>();
hashMap.put(new Student(\"张三\",20),\"x001\");
hashMap.put(new Student(\"李四\",13),\"x002\");
hashMap.put(new Student(\"王五\",24),\"x003\");
hashMap.put(new Student(\"张三\",20),\"x005\");
//键找值遍历
Set<Student> students = hashMap.keySet();
for(Student s : students){
System.out.println(s.getName()+\"--\"+s.getAge()+\"--\"+hashMap.get(s));
}
}
}
运行结果:
张三--20--x005
王五--24--x003
李四--13--x002
2.HashMap和Hashtable的区别:
HashMap:线程不安全, 效率高.允许null值和null键
Hashtable:线程安全, 效率低.不允许null值和null键
(二) edHashMap
底层数据结构为链表和哈希表,元素唯一且有序,通过重写hashCode()方法和equals()方法来保证其键的唯一性,链表来保证其有序,允许null值null键
import java.util.*;
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( o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
s.equals(name, student.name);
}
@Override
public int hashCode() {
return s.hash(name, age);
}
}
public class Test {
public static void main(String[] args) {
Map<Student, String> edHashMap = new edHashMap<>();
edHashMap.put(new Student(\"张三\",20),\"x001\");
edHashMap.put(new Student(\"李四\",13),\"x002\");
edHashMap.put(new Student(\"王五\",24),\"x003\");
edHashMap.put(new Student(\"张三\",20),\"x005\");
//键值对 对象遍历
Set<Map.Entry<Student, String>> entries = edHashMap.entrySet();
for(Map.Entry<Student, String> entry : entries){
Student key = entry.getKey();
System.out.println(key.getName()+\"--\"+key.getAge()+\"--\"+entry.getValue());
}
}
}
运行结果:
张三--20--x005
李四--13--x002
王五--24--x003
(三)TreeMap
1.底层数据结构为红黑树,元素可以按固定顺序排序,元素唯一,不允许null键
2.排序方法
a.实现Comparable<>接口,并重写此接口中compareTo()方法
b.用匿名内部类重写Comparator<>接口中compare()方法
import java.util.*;
class Student implements Comparable<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( o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
s.equals(name, student.name);
}
@Override
public int hashCode() {
return s.hash(name, age);
}
@Override
public int compareTo(Student s) {
int num1 = this.age - s.age ;
int num2 = num1 == 0 ? this.name.length() - s.name.length() : num1 ;
int num3 = num2 == 0 ? this.name.compareTo(s.name) : num2 ;
return num2 ;
}
}
public class Test {
public static void main(String[] args) {
Map<Student, String> treeMap = new TreeMap<>();
treeMap.put(new Student(\"杨颖\",20),\"x001\");
treeMap.put(new Student(\"迪丽热巴\",13),\"x002\");
treeMap.put(new Student(\"范冰冰\",24),\"x003\");
treeMap.put(new Student(\"杨幂\",21),\"x004\");
treeMap.put(new Student(\"赵丽颖\",26),\"x005\");
//键值对 对象遍历
Set<Student> students = treeMap.keySet();
for(Student s : students){
System.out.println(s.getName()+\"--\"+s.getAge()+\"--\"+treeMap.get(s));
}
}
}
运行结果:
迪丽热巴--13--x002
杨颖--20--x001
杨幂--21--x004
范冰冰--24--x003
赵丽颖--26--x005
继续阅读与本文标签相同的文章
上一篇 :
一篇文章搞懂人脸识别的十个概念
-
登榜!风采依旧表现“佳”
2026-05-18栏目: 教程
-
苹果新获专利详细介绍了Measure如何利用AR进行精确视觉测量
2026-05-18栏目: 教程
-
消费升级不是把原来的成熟产品卖得更高更贵
2026-05-18栏目: 教程
-
红旗首款纯电SUV登场!动力强续航足,这外观太漂亮!
2026-05-18栏目: 教程
-
互联网时代,挑战与机遇并存
2026-05-18栏目: 教程
