Menurut String # intern () , intern
metode seharusnya mengembalikan String dari kolam String jika String ditemukan di kolam String, jika tidak objek string baru akan ditambahkan dalam kolam String dan referensi dari String ini dikembalikan.
Jadi saya mencoba ini:
String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();
if ( s1 == s2 ){
System.out.println("s1 and s2 are same"); // 1.
}
if ( s1 == s3 ){
System.out.println("s1 and s3 are same" ); // 2.
}
Saya mengharapkan yang s1 and s3 are same
akan dicetak saat s3 diinternir, dan s1 and s2 are same
tidak akan dicetak. Tetapi hasilnya adalah: kedua garis dicetak. Jadi itu berarti, secara konstan konstanta String diinternir. Tetapi jika demikian, mengapa kita perlu intern
metode ini? Dengan kata lain kapan kita harus menggunakan metode ini?
java
string
string-interning
Rakesh Juyal
sumber
sumber
intern
metode publik. Bukankah seharusnya kita memilikiintern
metode pribadi, sehingga tidak ada yang bisa mengaksesnya. Atau adakah tujuan metode ini?Jawaban:
Java secara otomatis magang String literal. Ini berarti bahwa dalam banyak kasus, operator == tampaknya berfungsi untuk String dengan cara yang sama seperti yang dilakukannya untuk int atau nilai primitif lainnya.
Karena magang otomatis untuk string literal,
intern()
metode ini akan digunakan pada Strings yang dibuat dengannew String()
Menggunakan contoh Anda:
akan kembali:
Dalam semua kasus selain
s4
variabel, nilai yang dibuat secara eksplisit menggunakannew
operator dan di manaintern
metode tidak digunakan pada hasilnya, itu adalah contoh permanen tunggal yang dikembalikan kumpulan string konstan JVM .Lihat Teknik Java "String Equality and Interning" untuk informasi lebih lanjut.
sumber
String s1 = "Rakesh";
pertama OB1 OB2String s4 = new String("Rakesh");
kedua Jadi sisa (s2, s3, s5) referensi objek yang sama (OB1) dibuat dalam 'string Pool' Jadi bisa saya katakan.intern()
metode yang digunakan untuk mencegah membuat objek baru jika string yang sama tersedia distring pool
If Asumsi saya salah jadi beri saya arahan.Pada proyek baru-baru ini, beberapa struktur data besar diatur dengan data yang dibaca dari database (dan karenanya bukan konstanta String / literal) tetapi dengan sejumlah besar duplikasi. Itu adalah aplikasi perbankan, dan hal-hal seperti nama-nama perusahaan sederhana (mungkin 100 atau 200) muncul di mana-mana. Struktur data sudah besar, dan jika semua nama perusahaan itu adalah objek unik, mereka akan meluap memori. Sebagai gantinya, semua struktur data memiliki referensi ke objek String 100 atau 200 yang sama, sehingga menghemat banyak ruang.
Keuntungan kecil lain dari String yang diinternir adalah yang
==
dapat digunakan (berhasil!) Untuk membandingkan String jika semua string yang terlibat dijamin akan diinternir. Terlepas dari sintaks yang lebih ramping, ini juga merupakan peningkatan kinerja. Tetapi seperti yang telah ditunjukkan oleh orang lain, melakukan hal ini berisiko besar menyebabkan kesalahan pemrograman, jadi ini harus dilakukan hanya sebagai ukuran terakhir dari upaya terakhir.The downside adalah bahwa menginternir String membutuhkan lebih banyak waktu daripada hanya melemparkannya di heap, dan bahwa ruang untuk Strings diinternir mungkin terbatas, tergantung pada implementasi Java. Paling baik dilakukan ketika Anda berhadapan dengan sejumlah string yang diketahui dengan banyak duplikasi.
sumber
The downside is that interning a String takes more time than simply throwing it on the heap, and that the space for interned Strings may be limited
bahkan jika Anda tidak menggunakan metode intern untuk String konstan itu akan diinternir secara otomatis.==
untuk string sekalipun.Saya ingin menambahkan 2 sen untuk menggunakan
==
string yang diinternir.Hal pertama yang
String.equals
dilakukan adalahthis==object
.Jadi meskipun ada beberapa perolehan kinerja sangat kecil (Anda tidak memanggil metode), dari sudut pandang pengelola menggunakan
==
mimpi buruk, karena beberapa string yang diinternir memiliki kecenderungan untuk menjadi non-magang.Jadi saya sarankan untuk tidak bergantung pada kasus khusus
==
untuk string yang diinternir, tetapi selalu digunakanequals
seperti yang dimaksudkan Gosling.EDIT: diinternir menjadi tidak diinternir:
Dalam versi 2.0, pengelola memutuskan untuk mengumumkan kepada
hasReferenceVal
publik, tanpa menjelaskan lebih lanjut bahwa mereka mengharapkan serangkaian string yang diinternir.Sekarang Anda memiliki bug, yang mungkin sangat sulit ditemukan, karena dalam kebanyakan kasus array berisi nilai-nilai literal, dan kadang-kadang string non-literal digunakan. Jika
equals
digunakan alih-alih==
makahasReferenceVal
masih akan terus bekerja. Sekali lagi, peningkatan kinerja sangat kecil, tetapi biaya pemeliharaan tinggi.sumber
String literal dan konstanta diinternir secara default. Artinya,
"foo" == "foo"
(dinyatakan oleh String literal), tetapinew String("foo") != new String("foo")
.sumber
intern
,String literals and constants are interned by default
benar.new String("foo")
-> Di sini, satu String literal "foo" dibuat di kolam String dan satu di heap, sehingga total 2 objek dibuat.Pelajari Java String Intern - sekali untuk semua
String dalam java adalah objek yang tidak bisa diubah oleh desain. Oleh karena itu, dua objek string bahkan dengan nilai yang sama akan menjadi objek yang berbeda secara default. Namun, jika kita ingin menghemat memori, kita dapat mengindikasikan untuk menggunakan memori yang sama dengan konsep yang disebut string intern.
Aturan di bawah ini akan membantu Anda memahami konsep dalam istilah yang jelas:
Contoh:
Catatan: Kasus motivasi untuk string magang tidak dibahas di sini. Namun, menghemat memori pasti akan menjadi salah satu tujuan utama.
sumber
Anda harus melihat dua periode waktu yaitu waktu kompilasi dan waktu runtime. sebagai contoh:
di satu sisi, dalam contoh 1, kami menemukan hasilnya semua kembali benar, karena dalam waktu kompilasi, jvm akan menempatkan "tes" ke kumpulan string literal, jika jvm menemukan "tes" ada, maka itu akan menggunakan yang sudah ada, dalam contoh 1, string "test" semuanya menunjuk ke alamat memori yang sama, jadi contoh 1 akan mengembalikan true. di sisi lain, dalam contoh 2, metode substring () mengeksekusi dalam waktu runtime, dalam kasus "test" == "! test" .substring (1), pool akan membuat dua objek string, " test "and"! test ", jadi mereka adalah objek referensi yang berbeda, jadi case ini akan mengembalikan false, dalam kasus" test "=="! test ".substring (1) .intern (), metode intern ( ) akan menempatkan ""! test ".substring (1)" ke kumpulan string literal,
sumber
http://en.wikipedia.org/wiki/String_interning
string interning adalah metode menyimpan hanya satu salinan dari masing-masing nilai string yang berbeda, yang harus tidak berubah. Interning string membuat beberapa tugas pemrosesan string lebih hemat waktu atau ruang dengan biaya yang membutuhkan lebih banyak waktu ketika string dibuat atau diinternir. Nilai-nilai yang berbeda disimpan dalam kumpulan string intern.
sumber
Interned Strings menghindari Strings duplikat. Interning menghemat RAM dengan mengorbankan lebih banyak waktu CPU untuk mendeteksi dan mengganti string duplikat. Hanya ada satu salinan dari setiap String yang telah diinternir, tidak peduli berapa banyak referensi yang menunjukkannya. Karena String tidak dapat diubah, jika dua metode berbeda secara kebetulan menggunakan String yang sama, mereka dapat berbagi salinan String yang sama. Proses konversi Strings digandakan ke yang dibagikan disebut interning.String.intern () memberi Anda alamat String master kanonik. Anda dapat membandingkan string yang diinternir dengan == sederhana (yang membandingkan pointer) dan bukan sama denganyang membandingkan karakter String satu per satu. Karena String tidak dapat diubah, proses intern bebas untuk lebih menghemat ruang, misalnya, dengan tidak membuat String literal terpisah untuk "pot" ketika ada sebagai substring dari beberapa literal lain seperti "hippopotamus".
Untuk melihat lebih banyak http://mindprod.com/jgloss/interned.html
sumber
KELUARAN
sumber
Ketika dua string dibuat secara independen,
intern()
memungkinkan Anda untuk membandingkannya dan itu juga membantu Anda dalam membuat referensi di kumpulan string jika referensi itu tidak ada sebelumnya.Ketika Anda menggunakan
String s = new String(hi)
, java membuat instance baru dari string, tetapi ketika Anda menggunakanString s = "hi"
, java memeriksa apakah ada instance kata "hi" dalam kode atau tidak dan jika ada, itu hanya mengembalikan referensi.Karena membandingkan string didasarkan pada referensi,
intern()
membantu Anda membuat referensi dan memungkinkan Anda untuk membandingkan konten string.Ketika Anda menggunakan
intern()
dalam kode, itu membersihkan ruang yang digunakan oleh string yang merujuk ke objek yang sama dan hanya mengembalikan referensi dari objek yang sama yang sudah ada dalam memori.Tetapi dalam hal p5 saat Anda menggunakan:
Hanya isi p3 yang disalin dan p5 dibuat baru. Jadi tidak diinternir .
Jadi hasilnya adalah:
sumber
sumber
Metode string intern () digunakan untuk membuat salinan tepat dari objek string heap dalam kumpulan string konstan. Objek string dalam kumpulan string konstan secara otomatis diinternir tetapi objek string dalam tumpukan tidak. Penggunaan utama pembuatan intern adalah untuk menghemat ruang memori dan untuk melakukan perbandingan objek string yang lebih cepat.
Sumber: Apa itu string intern di java?
sumber
Seperti yang Anda katakan,
intern()
metode string pertama akan menemukan dari kumpulan String, jika ditemukan, maka itu akan mengembalikan objek yang menunjuk ke sana, atau akan menambahkan String baru ke dalam kumpulan.The
s1
dans2
dua objek menunjuk ke String kolam renang "Hello", dan menggunakan"Hello".intern()
akan menemukan bahwas1
dans2
. Jadi"s1 == s3"
mengembalikan true, serta kes3.intern()
.sumber
Dengan menggunakan referensi objek tumpukan jika kita ingin mendapatkan referensi objek konstan string yang sesuai , maka kita harus menggunakan intern ()
Tampilan Bergambar
Langkah 1: Obyek dengan data 'Rakesh' dibuat di heap dan string konstan pool. Juga s1 selalu menunjuk ke objek tumpukan.
Langkah 2: Dengan menggunakan referensi objek heap s1, kami mencoba untuk mendapatkan string yang sesuai dengan referensi objek konstan s2, menggunakan intern ()
Langkah 3: Secara sengaja membuat objek dengan data 'Rakesh' di kumpulan string konstan, dirujuk dengan nama s3
Sebagai "==" operator dimaksudkan untuk perbandingan referensi.
Mendapatkan false untuk s1 == s2
Menjadi kenyataan untuk s2 == s3
Semoga bantuan ini !!
sumber