Java 基础学习之类集框架 九 (key 可以重复的 Map 集合:IdentityHashMap)

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 允许重复,只要两个对象的地址不等即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值