1、==如果作用於基本數據類型,則比較的是值是否相等;
如果作用於引用類型,則比較的是變量所指向的對象的地址
2、對於非String、Date類型equals比較的是引用類型的變量所指向的對象的地址
但對於String、Date類型,在其類中重寫了equals(),所以比較的是值
3、Object類型相等判斷為什么重寫equals()和hashcode()
equals()方法是比較兩個對象的內存地址是否相等,如果不重寫,顯然兩個對象由於不同存儲地址所以是不相等的

package nio; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class ListTest { public static void main(String[] args) { Person p1 = new Person(10, "張三"); Person p2 = new Person(10, "張三"); System.out.println(p1.equals(p2)); System.out.println(p1.hashCode()==p2.hashCode()); } } class Person { int age; String name; public Person(int age, String name) { super(); this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object obj) { //重寫equals方法 boolean flag=false; if(this==obj) { flag=true; } if(null != obj) { Person other=(Person) obj; //對象轉化為person類型對象 if((age==other.age) && (name==other.name)){ flag=true; } } return flag; } @Override public int hashCode() { final int prime=31; int result=1; result=prime*result+age; result=prime*result+((name==null)?0:name.hashCode()); return result; } } 如果不重寫equals方法則 System.out.println(p1.equals(p2))返回false 如果不重寫hashcode方法則System.out.println(p1.hashCode()==p2.hashCode())返回false
4、重寫equals()為什么一定要重寫hashcode()
如果兩個對象判斷相等只重寫了euqals()方法,而沒有重寫hashcode()方法,雖然p1.equals(p2)結果是true,但執行p1.hashCode()==p2.hashCode()結果卻是false,這與“兩個對象相等,其hashcode必然相等”矛盾,所以重寫了equals()必然需要重寫hashcode()
hashcode()判斷是equals()判斷的先決條件,所以對象重寫了equals()需要重寫hashcode()