1. 程式人生 > >HashMap中判斷兩個key是否為同一個key詳解

HashMap中判斷兩個key是否為同一個key詳解

例項化兩個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));
	}

}