1. Map 中的 key 不允许重复,重复就是覆盖
之前讲解的所有 Map 操作中 key 的值是不能重复的,例如,HashMap 操作的时候是不能重复的,如果重复肯定会覆盖之前的内容。
实例 1 代码:
package self.learn.setdemo;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Person{ // 定义 Person 类实现比较器
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) { // 覆写 equals() 方法
if(this == obj) { // 地址相等
return true; // 是同一对象
}
if(!(obj instanceof Person)) { // 传递进来的不是本类对象
return false; // 不是同一对象
}
Person p = (Person)obj; // 进行向下转型
if(this.name.equals(p.name)&&this.age == p.age) { // 属性依次比较
return true; // 全部属性相等,是同一对象
}else {
return true; // 属性不相等,不是同一对象
}
}
public int hashCode() { // 覆写 hashCode() 方法
return this.name.hashCode()*this.age; // 指定编码公式
}
@Override
public String toString() { // 覆写 toString() 方法
return "Person [name=" + name + ", age=" + age + "]";
}
public static void main(String args[]) {
Map<Person, String> map = null;
map = new HashMap<Person, String>();
map.put(new Person("张三", 30),"Zhangsan_1" );
map.put(new Person("张三", 30),"Zhangsan_2" );
map.put(new Person("李四", 31),"lisi");
Set<Map.Entry<Person, String>> allSet = null; // 声明一个 Set 集合
allSet = map.entrySet(); // 将 Map 接口实例变为 Set 接口实例
Iterator<Map.Entry<Person, String>> iter = null; // 声明 Iterator 实例
iter = allSet.iterator(); // 实例化 Iterator 对象
while(iter.hasNext()) {
Map.Entry<Person, String> me = iter.next(); // 每个对象都是 Map.Entry 实例
System.out.println(me.getKey()+"--->"+me.getValue());
}
}
}
运行结果截图:
从程序的运行结果中可以发现,第 2 个内容覆盖了第 1 个内容,所以此时可以使用 IdentityHashMap,使用此类时只要地址不相等(key != key2),就表示不是重复的内容,可以将相同的 key 添加集合中。
实例 2 代码:使用 IdentityHashMap 修改程序
package self.learn.setdemo;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Person{ // 定义 Person 类实现比较器
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) { // 覆写 equals() 方法
if(this == obj) { // 地址相等
return true; // 是同一对象
}
if(!(obj instanceof Person)) { // 传递进来的不是本类对象
return false; // 不是同一对象
}
Person p = (Person)obj; // 进行向下转型
if(this.name.equals(p.name)&&this.age == p.age) { // 属性依次比较
return true; // 全部属性相等,是同一对象
}else {
return true; // 属性不相等,不是同一对象
}
}
public int hashCode() { // 覆写 hashCode() 方法
return this.name.hashCode()*this.age; // 指定编码公式
}
@Override
public String toString() { // 覆写 toString() 方法
return "Person [name=" + name + ", age=" + age + "]";
}
public static void main(String args[]) {
Map<Person, String> map = null;
map = new IdentityHashMap<Person, String>();
map.put(new Person("张三", 30),"Zhangsan_1" );
map.put(new Person("张三", 30),"Zhangsan_2" );
map.put(new Person("李四", 31),"lisi");
Set<Map.Entry<Person, String>> allSet = null; // 声明一个 Set 集合
allSet = map.entrySet(); // 将 Map 接口实例变为 Set 接口实例
Iterator<Map.Entry<Person, String>> iter = null; // 声明 Iterator 实例
iter = allSet.iterator(); // 实例化 Iterator 对象
while(iter.hasNext()) {
Map.Entry<Person, String> me = iter.next(); // 每个对象都是 Map.Entry 实例
System.out.println(me.getKey()+"--->"+me.getValue());
}
}
}
运行结果截图:
从程序运行结果中可以发现,现在的 key 允许重复,只要两个对象的地址不等即可。