Operator perbandingan, yang boleh menentukan kedua-dua jenis asas dan jenis rujukan
Jika anda menilai jenis asas, nilai sama ada nilai adalah sama
Jika anda menilai jenis rujukan, nilai sama ada alamat adalah sama, iaitu sama ada ia adalah objek yang sama
ialah kaedah kelas objek dan hanya boleh menentukan jenis rujukan
objek - sama dengan kod sumber:
public boolean equals(Object obj) { return (this == obj); }
Anda boleh melihat dengan jelas bahawa kaedah sama dalam kelas objek adalah untuk menentukan sama ada alamat objek adalah Sama (adakah objek yang sama)
Walau bagaimanapun, kelas jenis data lain akan mengatasi kaedah yang sama, seperti mengatasi kelas String: ( tentukan sama ada nilai bagi dua rentetan adalah sama)
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); }
Contoh:
String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1 == str2); // false System.out.println(str1.equals(str2)); // true
Tingkatkan kecekapan bekas dengan struktur cincang
Jika dua rujukan menghala ke objek yang sama, nilai cincang adalah pasti (tiada konflik) ) adalah sama, dan begitu juga sebaliknya
Nilai cincang adalah berdasarkan alamat tetapi bukan alamat
Demo:
// 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()); ------------------------------
Output:
Kod sumber:1324119927
990368553
1324119927
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }Contoh:
// toString A a3 = new A("dahe",25,"安全服务工程师"); System.out.println(a3.toString());Output:
Sekarang Mari kita tulis semula kaedah toString (template) dalam kelas:PackageName.ClassName@Hex hashCode
kelas.A@41629346
@Override public String toString() { return "A{" + "name='" + name + '\'' + ", age=" + age + ", job='" + job + '\'' + '}'; }Jalankan kod di atas sekali lagi, dan sekarang output adalah seperti berikut:
A{name='dahe', age=25, job='安全服务工程师'}Di samping itu, apabila kita mengeluarkan objek secara langsung, ia akan dipanggil terus secara lalai kaedah toString:
System.out.println(a3);Output:
A{name=' dahe', age=25, job='Security Service Engineer'}4.finalizeApabila objek dikitar semula, sistem secara automatik memanggil kaedah finalize objek. Subkelas boleh mengatasi kaedah ini dan melakukan beberapa operasi untuk melepaskan sumber Nota: Dalam JDK18. memuktamadkan tidak digunakan lagi. Walaupun ia boleh membantu kami mengeluarkan sumber asas sistem secara proaktif, sejujurnya, saya tidak pernah menggunakannya Java secara automatik menguruskan memori Menggunakannya akan membawa kepada risiko keselamatan sistem yang berpotensi , jadi ia dirancang untuk dikeluarkan. Instance:
// finalize A a4 = new A("dh",33,"架构师"); a4 = null; // 这是a4成为了垃圾,垃圾回收器就会回收对象 // 在销毁对象之前,会调用对象的finalize方法 // 程序员就可以在这个方法中写入自己的业务,释放资源Timpa kaedah pemuktamadkan:
@Override protected void finalize() throws Throwable { System.out.println("我们销毁对象"); }Selain itu, anda juga boleh menjalankan pengumpul sampah secara aktif:
System.gc(); // 主动调用垃圾回收器
Atas ialah kandungan terperinci Bagaimana untuk menggunakan kelas Objek Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!