java中Object 有哪些常用方法?

inkfoxer 發佈 2024-05-10T17:53:52.078119+00:00

Java中的Object是所有類的根類,因此它包含一些最基本、最常用的方法,下面是Object類的一些常用方法及其含義:equals(Object obj):判斷當前對象是否與另一個對象相等。

Java中的Object是所有類的根類,因此它包含一些最基本、最常用的方法,下面是Object類的一些常用方法及其含義:

  1. equals(Object obj):判斷當前對象是否與另一個對象相等。默認實現是判斷兩個對象的內存地址是否相同,但是在具體類中可以覆蓋此方法來實現自定義的相等比較邏輯。
  2. hashCode():返回當前對象的哈希碼,通常用於哈希表等需要高效查找的數據結構中。默認實現是返回對象的內存地址的哈希碼,但是在具體類中可以覆蓋此方法來實現自定義的哈希碼計算邏輯。
  3. toString():返回當前對象的字符串表示。默認實現是返回對象的類名和內存地址的字符串表示,但是在具體類中可以覆蓋此方法來實現自定義的字符串表示邏輯。
  4. getClass():返回當前對象的Class對象,即對象所屬類的元數據對象。可以用於獲取對象的類型信息以及訪問類的靜態欄位和方法。
  5. notify():喚醒當前對象上的一個等待線程,使其進入就緒狀態。必須在持有該對象的監視器鎖的線程中調用。
  6. notifyAll():喚醒當前對象上的所有等待線程,使其進入就緒狀態。必須在持有該對象的監視器鎖的線程中調用。
  7. wait():使當前線程進入該對象的等待隊列,直到被喚醒或者等待時間超時。必須在持有該對象的監視器鎖的線程中調用,並且需要在調用wait()前先獲得監視器鎖。
  8. wait(long timeout):使當前線程進入該對象的等待隊列,直到被喚醒、等待時間超時或者被中斷。必須在持有該對象的監視器鎖的線程中調用,並且需要在調用wait()前先獲得監視器鎖。
  9. 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類中的常用方法主要有:

  1. equals(Object obj):比較兩個對象是否相等,默認實現是比較對象的內存地址是否相同。
  2. hashCode():返回對象的哈希碼,默認實現是返回對象的內存地址的哈希碼。
  3. toString():返回對象的字符串表示,默認實現是返回對象的類名和內存地址的字符串表示。
  4. getClass():返回對象所屬類的元數據對象。
  5. notify():喚醒一個等待該對象的線程。
  6. notifyAll():喚醒所有等待該對象的線程。
  7. wait(long timeout):使當前線程進入該對象的等待隊列,直到被喚醒、等待時間超時或者被中斷。
  8. wait(long timeout, int nanos):使當前線程進入該對象的等待隊列,直到被喚醒、等待時間超時、被中斷或者等待時間加上

在實際使用Object類中的常用方法時,需要注意以下幾點:

  1. equals方法的重寫:如果需要比較兩個對象的內容是否相等,需要重寫equals方法,否則默認的equals方法只是比較兩個對象的內存地址是否相同。重寫equals方法時應該考慮對象的所有屬性,而不是僅僅比較內存地址。
  2. hashCode方法的重寫:如果需要將對象作為HashMap、HashSet等容器的鍵使用,需要重寫hashCode方法,否則默認的hashCode方法只是返回對象的內存地址的哈希碼。重寫hashCode方法時應該保證相等的對象返回相同的哈希碼,不相等的對象返回儘量不同的哈希碼。
  3. toString方法的重寫:如果需要列印對象的字符串表示或者將對象轉化為字符串,需要重寫toString方法,否則默認的toString方法只是返回對象的類名和內存地址的字符串表示。重寫toString方法時應該返回具有可讀性的字符串表示。
  4. 使用wait和notify方法時應該注意線程同步:wait和notify方法只能在同步塊中使用,且wait方法會釋放鎖,如果使用不當可能會導致死鎖或者程序掛起。
  5. 克隆方法clone的使用:默認的clone方法是淺拷貝,如果需要進行深拷貝,需要重寫clone方法並實現深拷貝的邏輯。
  6. finalize方法的使用:finalize方法是Object類的一個保護方法,當對象被垃圾回收器回收時會調用該方法。在實際使用時應該避免使用finalize方法,因為finalize方法的調用時機不確定,可能會導致一些意外的情況。如果需要在對象被回收時執行一些操作,可以考慮使用try-with-resources語句塊或者手動調用close方法。
關鍵字: