Heap dan stack adalah konsep yang sangat penting dalam struktur data Java. Artikel ini menganalisis perbedaan keduanya secara lebih rinci. Untuk referensi Anda. Dengan rincian sebagai berikut:
Heap Java adalah area data runtime tempat objek kelas mengalokasikan ruang. Objek ini dibuat melalui instruksi seperti new, newaray, anewarray, dan multianewarray, dan tidak memerlukan kode program untuk dirilis secara eksplisit Bertanggung jawab, keuntungan dari heap adalah dapat mengalokasikan ukuran memori secara dinamis, dan masa pakai tidak perlu diberitahukan kepada kompiler terlebih dahulu, karena secara dinamis mengalokasikan memori saat runtime, dan pengumpul sampah Java akan secara otomatis mengumpulkan ini tidak lagi digunakan data. Namun kelemahannya adalah karena kebutuhan untuk mengalokasikan memori secara dinamis saat runtime, kecepatan aksesnya lambat.
Keuntungan dari stack adalah kecepatan aksesnya lebih cepat dari heap, nomor dua setelah register, dan data stack dapat dibagikan. Namun kelemahannya adalah ukuran dan masa pakai data yang disimpan dalam tumpukan harus ditentukan dan kurangnya fleksibilitas. Tumpukan terutama menyimpan beberapa tipe dasar variabel (int, short, long, byte, float, double, boolean, char) dan pegangan objek.
Fitur khusus yang sangat penting dari tumpukan adalah data yang disimpan dalam tumpukan dapat dibagikan. Misalkan kita juga mendefinisikan:
ke dalam a = 3;
ke dalam b = 3;
Kompiler pertama-tama memproses int a = 3; pertama-tama ia membuat referensi ke variabel a di tumpukan, dan kemudian memeriksa apakah ada nilai 3 di tumpukan. Jika tidak ditemukan, ia menyimpan 3 di, dan kemudian mengarahkan a ke 3. Kemudian proses int b = 3; setelah membuat variabel referensi b, karena sudah ada nilai 3 di stack maka b akan langsung diarahkan ke 3. Dengan cara ini, terdapat situasi di mana a dan b keduanya menunjuk ke 3 secara bersamaan.
Saat ini, jika a=4 disetel lagi; maka kompiler akan mencari ulang apakah ada nilai 4 di tumpukan. Jika tidak, ia akan menyimpan 4 dan menunjuk ke 4; akan langsung mengarahkan a ke alamat ini. Oleh karena itu, perubahan nilai a tidak akan mempengaruhi nilai b.
Perlu diperhatikan bahwa pembagian data seperti ini berbeda dengan pembagian referensi dua objek yang menunjuk ke satu objek pada saat yang bersamaan, karena dalam hal ini modifikasi a tidak akan mempengaruhi b, melainkan diselesaikan oleh compiler, yang mana bermanfaat untuk Menghemat ruang. Jika suatu variabel referensi objek mengubah keadaan internal objek, hal itu akan mempengaruhi variabel referensi objek lainnya.
String adalah tipe data pembungkus khusus. Dapat digunakan:
String str = String baru("abc");String str = "abc";
Ada dua cara untuk membuatnya. Yang pertama adalah menggunakan new() untuk membuat objek baru, yang akan disimpan di heap. Sebuah objek baru dibuat setiap kali dipanggil.
Metode kedua adalah pertama-tama membuat variabel referensi objek str dari kelas String di tumpukan, dan kemudian memeriksa apakah "abc" disimpan di tumpukan. Jika tidak, simpan "abc" di tumpukan dan buat str menunjuk ke "abc ". , jika sudah ada "abc", langsung arahkan str ke "abc".
Saat membandingkan apakah nilai dalam suatu kelas sama, gunakan metode sama dengan(); saat menguji apakah referensi dari dua kelas pembungkus menunjuk ke objek yang sama, gunakan ==.
String str1 = "abc"; String str2 = "abc"; Sistem.keluar.println(str1==str2);
Terlihat str1 dan str2 menunjuk pada objek yang sama.
String str1 =String baru ("abc"); String str2 =String baru ("abc"); System.out.println(str1==str2);
Menggunakan yang baru berarti menghasilkan objek yang berbeda. Hasilkan satu per satu.
Oleh karena itu, jika Anda menggunakan metode pertama untuk membuat beberapa string "abc", sebenarnya hanya ada satu objek di memori. Cara penulisan ini bermanfaat untuk menghemat ruang memori sekaligus dapat meningkatkan kecepatan lari program sampai batas tertentu, karena JVM akan secara otomatis menentukan apakah perlu membuat objek baru berdasarkan situasi sebenarnya dari data dalam tumpukan. Untuk kode String str = new String("abc");, objek baru selalu dibuat di heap, terlepas dari apakah nilai stringnya sama atau apakah perlu membuat objek baru, sehingga menambah beban pada programnya.
Di sisi lain, harap diperhatikan: Saat kita mendefinisikan kelas menggunakan format seperti String str = "abc";, kita selalu berasumsi bahwa objek str dari kelas String telah dibuat. Khawatir tentang jebakan! Objek tersebut mungkin belum dibuat! Sebaliknya itu mungkin hanya menunjuk ke objek yang dibuat sebelumnya. Hanya melalui metode new() kita dapat memastikan bahwa objek baru dibuat setiap saat.
Karena sifat kelas String yang tidak dapat diubah, ketika variabel String perlu sering mengubah nilainya, Anda harus mempertimbangkan untuk menggunakan kelas StringBuffer untuk meningkatkan efisiensi program.
Saya harap penjelasan artikel ini dapat bermanfaat bagi pembelajaran pemrograman Java semua orang.