Java hashCode與equals學習

一、關於Object類的equals方法的特色java

a) 自反性: x.equals(x) 應該返回trueide

b) 對稱性: x.equals(y)爲true,那麼y.equals(x) 也爲true性能

c) 傳遞性: x.equals(y)爲true,而且y.equals(z) 爲true, 那麼x.equals(z) 也爲truethis

d) 一致性   x.equals(y)  第一次調用爲true,那麼在沒有修改x和y時, 第二次,第n次調用也應該爲true。code

 

 

二、關於Object類的hashcode()方法對象

a) 在Java應用的一次執行過程當中,對同一個對象的hasCode方法的屢次調用,他們應該返回一樣的值(前提示該對象的信息沒有變化)blog

b)對應兩個對象來講,若是使用equals方法比較返回true,那麼這兩個對象的hashCode值必定是相同的。hash

c)對於兩個對象來講,若是使用equals方法比較返回false,那麼這兩個對象的hashCode值不必定是相同的。若是不一樣,能夠提升應用的性能。io

d) 對於Object類來講,不一樣的Object對象的hashCode值是不一樣的。(Object類的hashCode值表示對象的地址)class

 

三、當使用HashSet的add方法時,hashCode方法就會獲得調用,判斷已經存儲在集合中的全部對象的hash code值是否與增長的對象的hash code值一致;若是不一致,直接加進去;若是一致,再進行equals方法的比較,equals方法若是返回true,表示對象已經加進去了,就不會再增長新的對象,不然加進去。

1)demo1

public static void main(String[] args) {
		HashSet set = new HashSet();
		set.add(new People("Tom"));
		set.add(new People("Nick"));
		set.add(new People("Nick"));
		
		System.out.println(set);
	}

  返回

[com.example.collectiondemo.People@7852e922, com.example.collectiondemo.People@15db9742, com.example.collectiondemo.People@6d06d69c]

 

2)、demo2

	public static void main(String[] args) {
		HashSet set = new HashSet();

		People lisi = new People("Lisi");
		set.add(lisi);
		set.add(lisi);

		System.out.println(set);
	}

  返回

[com.example.collectiondemo.People@15db9742]

 

3)demo3

public static void main(String[] args) {
		HashSet set = new HashSet();
		String s1 = new String("a");
		String s2 = new String("a");
		set.add(s1);
		set.add(s2);
		System.out.println(set);
	}

  返回

[a]

 

四、若是咱們重寫equals方法,那麼也要重寫hashCode方法,反之亦然。

五、Demo: 建立一個Student對象,若是名字同樣,就不添加到Set集合中。

public class SetTest3 {
	
	public static void main(String[] args) {
		HashSet set = new HashSet();
		Student s1 = new Student("Tom");
		Student s2 = new Student("Tom");
		set.add(s1);
		set.add(s2);
		System.out.println(set);
		
	}
	
}

class Student{
	String name;
	
	public Student(String name) {
		this.name = name;
	}
	

	@Override
	public int hashCode() {
		return this.name.hashCode();
	}
	

	@Override
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		if(null != obj && obj instanceof Student){
			Student s = (Student)obj;
			if(name.equals(s.name)){
				return true;
			}
		
		}
		return false;
	}


	@Override
	public String toString() {
		return "Student [name=" + name + "]";
	}
	
	
}

  打印

[Student [name=Tom]]

相關文章
相關標籤/搜索