Object:萬類之祖
== : 比較的是是否是同一個對象,比較的是地址
equals: 是Object里面的方法,默認的是==,比較的是地址,但在String類型里重寫為比較內容
一般我們在設計一個類中,需要重寫父類的equals方法,需要遵照以下幾個規則設計:
- 自反性(x.equals(x)必須返回true);
- 對稱性(x.equals(y)返回true時,y.equals(x)也必須返回true);
- 傳遞性(x.equals(y)和y.equals(z)都返回true時,x.equals(z)也必須返回true);
- 一致性(當x和y引用的對象信息沒有被修改時,多次調用x.equals(y)應該得到同樣的返回值);
- 非空性(對於任何非null值的引用x,x.equals(null)必須返回false)。
1 String s = "seven" ; 2 String s1 = "seven"; 3 System.out.println(s == s1); //返回false 4 System.out.println(s.equals(s2));//返回true
hashcode : 哈希碼。 native本地方法(C、C++實現),操作系統實現邏輯,把結果返還給我們。把對象的內存地址經過算法得出的一個int。
為什么重寫equals必須重寫hashcode?
以下為重寫equals和hashcode方法的源碼,建議自動生成
1 @Override 2 public int hashCode() { 3 final int prime = 31; 4 int result = 1; 5 result = prime * result + ((name == null) ? 0 : name.hashCode()); 6 return result; 7 } 8 @Override 9 public boolean equals(Object obj) { 10 if (this == obj) 11 return true; 12 if (obj == null) 13 return false; 14 if (getClass() != obj.getClass()) 15 return false; 16 Person other = (Person) obj; 17 if (name == null) { 18 if (other.name != null) 19 return false; 20 } else if (!name.equals(other.name)) 21 return false; 22 return true; 23 }
現有兩個對象
1 Student s1=new Student("小明",18); 2 3 Student s2=new Student("小明",18);
此時s1.equals(s2)返回true,但如果不重寫hashcode,Object默認的hashcode將對象的內存地址經過哈希算法返回給我們一個int,就違反了兩個對象相等,hashcode一定相等的規定
關於hashcode的規定:
- 兩個對象相等,hashcode一定相等
- 兩個對象不等,hashcode不一定不等
- hashcode相等,兩個對象不一定相等("Aa"、"BB")
- hashcode不等,兩個對象一定不等
toString : 把引用數據類型轉換成字符串。直接打印一個引用數據類型的對象則默認調用這個對象動態toString方法。
finalize : 里面的邏輯會在當前對象被垃圾回收器回收的時候執行。
clone:Object默認的方法clone()實現的是淺拷貝
下面實現一個淺拷貝的實例,首先實現接口Cloneable並覆寫方法
1 public class Person implements Cloneable{ 2 3 @Override 4 public Object clone() throws CloneNotSupportedException 5 { 6 Object object = super.clone(); 7 return object; 8 } 9 }
然后可以調用clone()方法,下面代碼也展示了兩種創建對象的方法1,new 2,clone()
1 Person p1=new Person("張三",11); 2 Person p2=(Person)p1.clone();