首頁 > 軟體

深入瞭解Java Object類的使用

2022-07-13 18:02:40

1.equals方法

==運運算元

比較運運算元,即可以判斷基本型別又可以判斷參照型別

如果判斷基本型別,則判斷值是否相等

如果判斷參照型別,則判斷地址是否相等,即判斷是否為同一個物件

equals

是object類的一個方法,只能判斷參照型別

object - equals原始碼:

public boolean equals(Object obj) {
    return (this == obj);
}

可以清晰的看到,object類裡的equals方法是判斷物件的地址是否相同(是不是同一個物件)

但是,其他資料型別類會重寫equals方法,比如String類的重寫:(判斷兩個字串的值是否相等)

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    return (anObject instanceof String aString)
            && (!COMPACT_STRINGS || this.coder == aString.coder)
            && StringLatin1.equals(value, aString.value);
}

範例:

String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true

2.hashCode

提高具有雜湊結構的容器的效率

兩個參照如果指向同一個物件,雜湊值肯定(不衝突的情況下)一樣,反之不一樣

雜湊值根據地址而來但並非地址

演示:

// hashCode
A a = new A();
A a1 = new A();
A a2 = a;
System.out.println(a.hashCode());
System.out.println(a1.hashCode());
System.out.println(a2.hashCode());
------------------------------

輸出:

1324119927
990368553
1324119927

3.toString

返回該物件的字串表示

原始碼:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

範例:

// toString
A a3 = new A("dahe",25,"安全服務工程師");
System.out.println(a3.toString());

輸出:

classes.A@41629346
包名.類名@十六進位制的hashCode

現在我們在類中重寫一下toString方法(模板):

@Override
public String toString() {
    return "A{" +
            "name='" + name + ''' +
            ", age=" + age +
            ", job='" + job + ''' +
            '}';
}

再次執行上面的程式碼,現在輸出如下:

A{name='dahe', age=25, job='安全服務工程師'}

另外,當我們直接輸出物件時,會預設直接呼叫toString方法:

System.out.println(a3);

輸出:

A{name='dahe', age=25, job='安全服務工程師'}

4.finalize

當物件被回收時,系統自動呼叫該物件的finalize方法,子類可以重寫該方法,做一些釋放資源的操作

注意:在JDK18中。finalize被棄用了。它雖然可以幫助我們主動釋放系統底層資源,但是說實話,沒用過,Java 是自動管理記憶體的,使用它反而會導致潛在的系統安全風險,沒幫助不說反而是負擔,所以計劃移除了。

範例:

// finalize
A a4 = new A("dh",33,"架構師");
a4 = null; // 這是a4成為了垃圾,垃圾回收器就會回收物件
// 在銷燬物件之前,會呼叫物件的finalize方法
// 程式設計師就可以在這個方法中寫入自己的業務,釋放資源

重寫finalize方法:

@Override
protected void finalize() throws Throwable {
    System.out.println("我們銷燬物件");
}

除此之外,還可以主動執行垃圾回收器:

System.gc(); // 主動呼叫垃圾回收器

到此這篇關於深入瞭解Java Object類的使用的文章就介紹到這了,更多相關Java Object類內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com