HashMap中判断两个key是否为同一个key详解

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34970891/article/details/80707259

实例化两个student对象,当两个student对象的属性值都相同的时候将两个student对象存放到hashMap集合当中的key中的时候,另hashMap集合认为这两个student对象是同一个key。

public class Student {
	public Student(String name) {
		// TODO Auto-generated constructor stub
		this.name=name;
	}
	private String name;

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public boolean equals(Object obj) {
		//对当前Student对象当中的方法进行重写,将要进行比较的object对象先强制转变为student对象
		Student stu=(Student)obj;
//		另当前对象当中的指定属性和参数对象当中的指定 属性值进行比较
		boolean flag=this.name.equals(stu.getName());
		if(flag)
		{
			return true;
		}
		else
			return false;
	}
	@Override
	public int hashCode() {
		if(this.name!=null)
		{
			return name.hashCode();
		}
		else
			return super.hashCode();
	}
}
import java.util.HashMap;
import java.util.Map;

/**
 * 
 * @author Administrator
 *实例化两个Student对象,另两个学生对象当中的内容都相同
 *然后将两个对象对象都添加到hasMap集合对象当中
 *另后一个学生对象对前一个学生对象进行覆盖操作
 */
public class HashMapTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student s1=new Student("zhou");
		Student s2=new Student("zhou");
		Map<Student, String> students=new HashMap<Student,String>();
		/**
		 * 当前所实例化的两个学生对象当中的名字完全相同所以将之认为是同一个key值来将之存放到hashMap当中来实现s2对s1的覆盖操作
		 * 但是在进行输出之后发现s1的value依然是AA并没有被s2当中的BB进行覆盖
		 * 现要解决这一问题,使得map集合认为st1对象和st2两个对象在key当中认为是同一个key
		 */
		students.put(s1,"AA");
		students.put(s2,"BB");
		System.out.println(students.get(s1));
		/**
		 * 要解决上述问题首先要明白当对象存放到集合当中的时候hashMap是如何判断两个对象是否是相同的key的:
		 * hashMap会先调用key对象当中的equals方法来和已存在的key进行比较,当值为false的时候则认为是两个不同的key值
		 * 当equals方法相同的时候
		 * 		比较当前key和已经存在的key对象的hashCode值是否是相同的
		 * 			当hashCode也相同的时候则认为当前所进行比较的两个key对象是完全相同的
		 * 				此时后一个key对象当中的value将会对以存在的key所对应的value进行覆盖操作
		 * 			当hashCode不同的时候则认为两个key是不同的,将会为当前key的value开辟新的空间来进行内容的存放操作
		 * 所以:
		 * s2存放到hashMap当中的时候首先会调用其equals方法来和s1来进行比较
		 * 		对student对象当中的equals方法来进行重写另其和参数对象当中的同名属性值进行比较,只有当两个对象当中的属性值都完全相同的时候,则认为两个对象是相等的。
		 * 当两个对象使用equals方法比较返回为true的时候,接下来要对两个对象的hashCode值进行比较
		 * 		此时则要对student对象当中的hashCode方法进行重写
		 * 		此时所返回的hashCode值将不能够是当前实例对象本身的hashCode,因为当前进行比较的两个对象的hashCode值是不相同的
		 * 		选择两个对象都相同的某一属性值然后将其所对应的hashCode做为对象的hashCode进行返回
		 * 		此时两个对象的hashCode都是name所对应的hashCode,当name相同的时候两个对象的hashCode也将相同
		 */
		System.out.println("s1.equals(s2)="+s1.equals(s2));
		System.out.println("s1.hashCode="+s1.hashCode());
		System.out.println("s2.hashCode="+s2.hashCode());
		/**
		 * 此时在对p1所对应的value值进行输出的时候发现值为BB而非AA
		 * 表明p1当中所对应的value值被p2所对应的value值进行了替换操作
		 * 此时在map集合对象当中相当于两个key和同一个value进行了映射操作
		 */
		System.out.println(students.get(s1));
		System.out.println(students.get(s2));
	}

}


展开阅读全文

有关hashmapkey

10-22

[code=Java]rnpackage StartDiaguo;rnrnimport java.io.Serializable;rn//import java.util.*;rnrnpublic class Appointment implements Serializable rn private String clientName;rn rn private String startTime;rn private String endTime;rn private String date;rn private Appointment next;rn rn rn rn public Appointment()rn clientName = null;rn date = null;rn startTime = null;rn endTime = null;rn next = null;rn rn rn public Appointment(String name,String d, String s, String e)rn clientName = name;rn date = d;rn startTime = s;rn endTime = e;rn next = null;rn rn rn rn public Appointment getNext()rn return next;rn rnrn public void setNext(Appointment ap)rn next = ap;rn rn rn public String getName()rn return clientName;rn rn rn public void setName(String name)rn clientName = name;rn rnrn public String getTime()rn return startTime +"-"+ endTime;rn rn rn public void setTime(String s, String e)rn startTime = s;rn endTime = e;rn rn public String getStartTime()rn return startTime;rn rn public void setStartTime(String s)rn startTime = s;rn rn public void setEndTime(String e)rn endTime = e;rn rn public String getEndTime()rn return endTime;rn rn public String getDate()rn return date;rn rn public void setDate(String d)rn date = d;rn rnrn public void setAppointment(String n, String d, String s, String e) rn clientName = n;rn startTime = s;rn endTime = e;rn date = d;rn rnrnrn[/code]rnprivate Map appBook; 来存一个AppointmentrnAppointment 是一个linkedlist的形式 rn我用hashmap来存这个自定linkedlist类,当我想改Appointment.next 的内容后 怎么返回第一个apprn还是有什么办法更改hashmap的key 论坛

关于hashMapKey用法

07-24

我想通过查询hashMap中是否以含有该对象,来决定是否需要存放入hashMap中.rn我有一个类rnpackage iss.com.equals;rnrnimport java.util.Date;rnrnclass CountIsable rnrn private Date date;rnrn private String accountNo;rnrn private String bankCode;rnrnrn public CountIsable(Date transactionTime, String accountNo, String bankCode) rn this.date = transactionTime;rn this.accountNo = accountNo;rn this.bankCode = bankCode;rn rnrn public CountIsable(String accountNo, String bankCode) rn this.accountNo = accountNo;rn this.bankCode = bankCode;rn rnrn public boolean equals(CountIsable mapKey) rn if (DateUtil.compareDate(date, mapKey.getDate()) == 0rn && accountNo.equals(mapKey.getAccountNo())) rn if (mapKey.getBankCode() == nullrn || mapKey.getBankCode().equals(bankCode))rn return true;rn rn return false;rn rn public int hashCode() rn return 1;rn rnrn public String getAccountNo() rn return accountNo;rn rnrn public String getBankCode() rn return bankCode;rn rnrn public Date getDate() rn return date;rn rnrnrnrn下面是测试用例rnpackage iss.com.equals;rnrnimport java.util.Date;rnimport java.util.HashMap;rnrnpublic class TestEquals rnrn public static void main(String[] args)rn rn HashMap importMap=new HashMap(8);rn Date date=new Date();rn String accountNo="1";rn String bankCode="1";rn CountIsable one=new CountIsable(date,accountNo,bankCode);rn CountIsable two=new CountIsable(date,accountNo,bankCode);rn CountIsable three=new CountIsable(date,accountNo,bankCode);rn CountIsable four=new CountIsable(date,accountNo,bankCode);rn importMap.put(one,"1");rn importMap.put(two,"2");rn importMap.put(three,"3");rn if(importMap.containsKey(four))rn rn rn System.out.println(importMap.size());rn System.out.println("--------------"+(String)importMap.get(one));rn rn elsern rn System.out.println("no object!");rn rn rn rnrn程序输出为no object!,是什么原因导致key找不到 论坛

没有更多推荐了,返回首页