Artikel ini terutama mempelajari masalah membuat objek dalam string Java, sebagai berikut.
Pertama -tama, kita perlu memahami dua konsep: merujuk variabel dan objek. Objek umumnya dibuat di heap melalui baru, dan string hanyalah variabel referensi.
Semua string adalah objek string. Karena banyaknya penggunaan konstanta string, untuk menghemat waktu di Java, pada tahap kompilasi, semua konstanta string akan ditempatkan di kumpulan string konstanta. Salah satu keuntungan dari kumpulan string konstan adalah bahwa string yang sama dapat digabungkan dan ditempati ruang.
Meskipun alamat suatu variabel tidak dapat secara langsung diperoleh di Java, Anda dapat menggunakan == untuk menentukan apakah dua variabel referensi menunjuk ke alamat, yaitu objek.
| Menumpuk memori | Tumpukan memori |
|---|---|
| Tipe Dasar, Referensi Objek (Alamat Memori Tumpukan) | Objek dan array yang dibuat oleh baru |
| Kecepatan akses cepat | Memori lebih lambat dari tumpukan |
| Ukuran data harus ditentukan selama siklus deklarasi | Memori yang dialokasikan dikelola oleh Java Virtual Machine Automatic sampah Collector. Ukuran memori yang dialokasikan secara dinamis |
| Fitur bersama, jika ada string di tumpukan, itu akan direferensikan secara langsung; Jika tidak, buka ruang baru untuk menyimpan nilainya | Setiap yang baru menghasilkan objek baru dalam memori heap. Tidak ada penggunaan kembali |
Paket com.demo.test; import java.lang.reflect.field; kelas publik StringDemo {public static void main (string [] args) {// Pertama cari apakah objek string ini ada dalam memori. Jika ada, arahkan ke objek string ini; String str1 = "ABC"; String str2 = "ABC"; /* public string toString () {return ini; } */ String str3 = "abc" .toString (); // Tidak peduli apakah objek string ini sudah ada dalam memori, objek baru akan dibuat. String str4 = string baru ("ABC"); String str5 = string baru ("ABC"); String str6 = str5; String str7 = "a" + "b" + "c"; String str8 = "a" + "b" + string baru ("c"); // String adalah objek string yang tidak dapat diubah, StringBuilder dan StringBuffer adalah objek string variabel (panjang array karakter di dalamnya adalah variabel), StringBuffer adalah thread-safe, StringBuilder bukan string yang aman-utas str9 = new stringBuilder (). Append ("a"). Append ("b"). String str10 = new stringBuffer (). Append ("a"). Append ("b"). Append ("c"). Tostring (); System.out.println ("---------> =="); System.out.println ("---> 1"); System.out.println (str1 == str2); // true system.out.println ("---> 3"); System.out.println (str3 == str1); // true system.out.println ("-> 4"); System.out.println (str4 == str1); // false system.out.println (str4 == str3); // false system.out.println (str4 == str5); // false system.out.println (str4 == str6); // false system.out.println ("----> 7"); System.out.println (str7 == str1); // true system.out.println (str7 == str3); // true system.out.println (str7 == str4); // false system.out.println ("---> 8"); System.out.println (str8 == str1); // false system.out.println (str8 == str3); // false system.out.println (str8 == str4); // false system.out.println (str7 == str7); // false system.out.println (str8 == str7); System.out.println (str9 == str1); // false system.out.println (str9 == str3); // false system.out.println (str9 == str4); // false system.out.println (str8 == str7); // false system.out.println (str9 == str8); System.out.println (str10 == str1); // false system.out.println (str10 == str3); // false system.out.println (str10 == str4); // false system.out.println (str10 == str7); // false system.out.println (str10 == str8);/false false.out.println (str10 == str8); System.out.println (str10 == str9); // false system.out.println ("--------> sama"); System.out.println (str1.equals (str4)); // true system.out.println (str1.equals (str7)); // true system.out.println (str1.equals (str8)); // true system.out.println ("--------> hashcode"); /*Rumus perhitungan kode hash: S [0]*31^(n-1) + S [1]*31^(n-2) + ... + S [n-1] Oleh karena itu, kode hashc adalah sama, dan sama setiap kali berjalan*/System.out.println (str1.hashcode ()); // System. System.out.println (str3.hashcode ()); System.out.println (str4.hashcode ()); System.out.println (str5.hashcode ()); System.out.println (str6.hashcode ()); System.out.println (str7.hashcode ()); System.out.println ("--------> Nilai Perubahan Normal"); // String adalah kelas yang tidak dapat diubah. String hanya menunjuk ke referensi dalam memori heap. Ini menyimpan alamat objek di tumpukan, bukan objek itu sendiri. Menetapkan nilai ke string hanyalah untuk mengubah objek referensi alih -alih objek itu sendiri str6 = "123"; System.out.println (str5); // ABC System.out.println (str6); // 123 System.out.println ("--------> mencerminkan nilai perubahan"); /* Jika Anda harus mengubah nilai string, itu bukan tidak mungkin. Hanya refleksi yang dapat digunakan. String kelas akhir publik mengimplementasikan java.io.serializable, sebanding <string>, charsequence {// nilainya digunakan untuk penyimpanan karakter. nilai arang akhir pribadi []; …} */ Str6 = str5; Coba {field field = string.class.getDecLaredField ("value"); // field field = str6.getClass (). getDeclaredField ("value"); if (! field.isAccessible ()) {field.setAccessible (true); } char [] value = (char []) field.get (str6); nilai [0] = '0'; System.out.println (str5); // 0bc System.out.println (str6); // 0BC} catch (NosuchfieldException | SecurityException | IllegalArargumentException | IllegalAccessException e) {e.printstacktrace (); } System.out.println ("-------> obj.tostring ()"); Objek obj = objek baru (); /* public string toString () {return getClass (). getName () + "@" + integer.tohexstring (hashcode ()); } */System.out.println (obj.toString ()); // java.lang.object@15db9742 string [] arr1 = {"0"}; String [] arr2 = {"0"}; System.out.println (arr1.equals (arr2)); // false}}Meringkaskan
Di atas adalah semua tentang analisis instance objek pembuatan string Java, dan saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!