Java中的Object是所有類的根類,因此它包含一些最基本、最常用的方法,下面是Object類的一些常用方法及其含義:
- equals(Object obj):判斷當前對象是否與另一個對象相等。默認實現是判斷兩個對象的內存地址是否相同,但是在具體類中可以覆蓋此方法來實現自定義的相等比較邏輯。
- hashCode():返回當前對象的哈希碼,通常用於哈希表等需要高效查找的數據結構中。默認實現是返回對象的內存地址的哈希碼,但是在具體類中可以覆蓋此方法來實現自定義的哈希碼計算邏輯。
- toString():返回當前對象的字符串表示。默認實現是返回對象的類名和內存地址的字符串表示,但是在具體類中可以覆蓋此方法來實現自定義的字符串表示邏輯。
- getClass():返回當前對象的Class對象,即對象所屬類的元數據對象。可以用於獲取對象的類型信息以及訪問類的靜態欄位和方法。
- notify():喚醒當前對象上的一個等待線程,使其進入就緒狀態。必須在持有該對象的監視器鎖的線程中調用。
- notifyAll():喚醒當前對象上的所有等待線程,使其進入就緒狀態。必須在持有該對象的監視器鎖的線程中調用。
- wait():使當前線程進入該對象的等待隊列,直到被喚醒或者等待時間超時。必須在持有該對象的監視器鎖的線程中調用,並且需要在調用wait()前先獲得監視器鎖。
- wait(long timeout):使當前線程進入該對象的等待隊列,直到被喚醒、等待時間超時或者被中斷。必須在持有該對象的監視器鎖的線程中調用,並且需要在調用wait()前先獲得監視器鎖。
- wait(long timeout, int nanos):使當前線程進入該對象的等待隊列,直到被喚醒、等待時間超時、被中斷或者等待時間加上納秒數超時。必須在持有該對象的監視器鎖的線程中調用,並且需要在調用wait()前先獲得監視器鎖。
Object類中還包含了一些其他的方法,如clone()、finalize()等,但是這些方法在實際開發中用得較少。以上列出的方法是Java開發中最常用的Object方法,也是基礎的Java知識點之一。
以下是Object類的源碼,其中包含了常用方法的實現:
javaCopy code
public class Object {
/**
* 比較兩個對象是否相等
*/
public boolean equals(Object obj) {
return (this == obj);
}
/**
* 返回對象的哈希碼
*/
public int hashCode() {
return System.identityHashCode(this);
}
/**
* 返回對象的字符串表示
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
/**
* 返回對象所屬類的元數據對象
*/
public final native Class<?> getClass();
/**
* 喚醒一個等待該對象的線程
*/
public final native void notify();
/**
* 喚醒所有等待該對象的線程
*/
public final native void notifyAll();
/**
* 使當前線程進入該對象的等待隊列,直到被喚醒、等待時間超時或者被中斷
*/
public final native void wait(long timeout) throws InterruptedException;
/**
* 使當前線程進入該對象的等待隊列,直到被喚醒或者等待時間超時
*/
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException("nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}
wait(timeout);
}
/**
* 使當前線程進入該對象的等待隊列,直到被喚醒或者等待時間超時
*/
public final void wait() throws InterruptedException {
wait(0);
}
/**
* 克隆對象
*/
protected native Object clone() throws CloneNotSupportedException;
/**
* 對象被垃圾回收器回收時調用
*/
protected void finalize() throws Throwable { }
}
我們可以看到,Object類中的常用方法主要有:
- equals(Object obj):比較兩個對象是否相等,默認實現是比較對象的內存地址是否相同。
- hashCode():返回對象的哈希碼,默認實現是返回對象的內存地址的哈希碼。
- toString():返回對象的字符串表示,默認實現是返回對象的類名和內存地址的字符串表示。
- getClass():返回對象所屬類的元數據對象。
- notify():喚醒一個等待該對象的線程。
- notifyAll():喚醒所有等待該對象的線程。
- wait(long timeout):使當前線程進入該對象的等待隊列,直到被喚醒、等待時間超時或者被中斷。
- wait(long timeout, int nanos):使當前線程進入該對象的等待隊列,直到被喚醒、等待時間超時、被中斷或者等待時間加上
在實際使用Object類中的常用方法時,需要注意以下幾點:
- equals方法的重寫:如果需要比較兩個對象的內容是否相等,需要重寫equals方法,否則默認的equals方法只是比較兩個對象的內存地址是否相同。重寫equals方法時應該考慮對象的所有屬性,而不是僅僅比較內存地址。
- hashCode方法的重寫:如果需要將對象作為HashMap、HashSet等容器的鍵使用,需要重寫hashCode方法,否則默認的hashCode方法只是返回對象的內存地址的哈希碼。重寫hashCode方法時應該保證相等的對象返回相同的哈希碼,不相等的對象返回儘量不同的哈希碼。
- toString方法的重寫:如果需要列印對象的字符串表示或者將對象轉化為字符串,需要重寫toString方法,否則默認的toString方法只是返回對象的類名和內存地址的字符串表示。重寫toString方法時應該返回具有可讀性的字符串表示。
- 使用wait和notify方法時應該注意線程同步:wait和notify方法只能在同步塊中使用,且wait方法會釋放鎖,如果使用不當可能會導致死鎖或者程序掛起。
- 克隆方法clone的使用:默認的clone方法是淺拷貝,如果需要進行深拷貝,需要重寫clone方法並實現深拷貝的邏輯。
- finalize方法的使用:finalize方法是Object類的一個保護方法,當對象被垃圾回收器回收時會調用該方法。在實際使用時應該避免使用finalize方法,因為finalize方法的調用時機不確定,可能會導致一些意外的情況。如果需要在對象被回收時執行一些操作,可以考慮使用try-with-resources語句塊或者手動調用close方法。