Jika String adalah kelas seperti yang lainnya, bagaimana bisa diinisialisasi menggunakan tanda kutip ganda?
java.lang.String
mendapat perlakuan khusus Bahasa Jawa.
Jika String adalah kelas seperti yang lainnya, bagaimana bisa diinisialisasi menggunakan tanda kutip ganda?
java.lang.String
mendapat perlakuan khusus Bahasa Jawa.
Jawaban:
Para perancang Jawa memutuskan untuk mempertahankan tipe primitif dalam bahasa berorientasi objek, alih-alih menjadikan segala sesuatu objek, sehingga dapat meningkatkan kinerja bahasa. Primitif disimpan dalam tumpukan panggilan, yang membutuhkan ruang penyimpanan lebih sedikit dan lebih murah untuk dimanipulasi. Di sisi lain, objek disimpan dalam tumpukan program, yang membutuhkan manajemen memori yang kompleks dan lebih banyak ruang penyimpanan.
Untuk alasan kinerja, Java's String dirancang untuk berada di antara primitif dan kelas.
Sebagai contoh
String s1 = "Hello"; // String literal
String s2 = "Hello"; // String literal
String s3 = s1; // same reference
String s4 = new String("Hello"); // String object
String s5 = new String("Hello"); // String object
Catatan: String literal disimpan di kumpulan yang umum. Ini memfasilitasi berbagi penyimpanan untuk string dengan konten yang sama untuk menghemat penyimpanan. String
objek yang dialokasikan melalui operator baru disimpan di heap
, dan tidak ada pembagian penyimpanan untuk konten yang sama.
Java memperlakukan String sebagai kelas khusus, Anda dapat menginisialisasi dengan dua cara
Langsung menetapkan literal
String a = "adsasdf";
Sebagai Objek lain menggunakan kata kunci baru
String a = new String("adsasdf");
Anda harus berhati-hati ketika ingin membandingkan dengan ==
tanda:
String a = "asdf";
String b = "asdf";
System.out.println(a == b); // True
System.out.println(a.equals(b)); // True
String a = new String("asdf");
String b = new String("asdf");
System.out.println(a == b); // False
System.out.println(a.equals(b)); // True
Itu karena dalam kasus pertama objek a dan b disimpan dalam sesuatu yang disebut literal pool
dan mereka berdua merujuk objek yang sama sehingga keduanya sama dalam kedua cara.
Tetapi dalam kasus kedua a dan b merujuk objek yang berbeda seperti ketika kita menginisialisasi objek lain. sehingga mereka tidak setara bila dibandingkan dengan ==
operator sedangkan mereka memiliki nilai yang sama.
String mendapat perlakuan khusus di JLS: itu adalah salah satu dari dua jenis non-primitif yang ada literal (yang lain adalah Class
) * .
Dari JLS :
String literal adalah referensi ke turunan dari kelas `String [...].
* yah, ada juga "null type" dengan "null literal" null
, tetapi kebanyakan orang tidak menganggap "null type" sebagai tipe yang tepat.
null
untuk ditugaskan ke variabel tipe referensi apa pun. Itu bukan tipe yang menarik.
Teks di dalam tanda kutip ganda menciptakan String
objek literal .
String myString = "Some text";
Kode di atas membuat String
objek, menggunakan tanda kutip ganda.
String sangat sering digunakan dalam bahasa pemrograman. Karena java berorientasi objek, string adalah objek. Untuk menghindari String baru yang rumit ("someString"); pernyataan setiap kali Anda membutuhkan objek string java memungkinkan Anda untuk hanya membuat objek string dengan menggunakan string literal.
Tapi Anda harus ingat kesetaraan tali. Berikut tes singkat JUnit untuk menunjukkan apa yang saya maksud.
@Test
public void stringTest() {
// a string literal and a string object created
// with the same literal are equal
assertEquals("string", new String("string"));
// two string literals are the same string object
assertSame("string", "string");
// a string literal is not the same object instance
// as a string object created with the same string literal
assertFalse("string" == new String("string"));
// java's String.intern() method gives you the same
// string object reference for all strings that are equal.
assertSame("string", new String("string").intern());
}
new String(String src)
, maka Anda bahkan tidak akan bisa memberikan konstruktor literal string. Anda harus menginisialisasi char []
, dan kemudian menggunakan String(char [] src)
konsruktor untuk membangun string, atau Anda harus membaca string dari file.
- String adalah kelas di Jawa . Anda benar tentang hal itu, jadi kami selalu dapat menginisialisasi dengan new
kata kunci.
- Tetapi ketika kita melakukan sesuatu seperti:
String s = "";
Pernyataan di atas ditandai oleh kompiler untuk menjadi objek String khusus dan kemudian JVM selama pemuatan kelas (memuat dilakukan sebelum inisialisasi), melihat ini yang dikenal sebagai string literal , yang disimpan dalam kumpulan string literal .
- Jadi String dapat dibuat menggunakan new()
dan dengan ""
metode ini, tetapi yang terakhir menyediakan string literal yang tetap di heap bahkan ketika tidak ada referensi ke objek string, karena memiliki referensi dari kumpulan string literal.
Java melakukan proses dua langkah untuk kita.
String str = "hello";
setara dengan
char data[] = {'h', 'e', 'l' , 'l', 'o'};
String str = new String(data);
Seperti [.NET] [1] mendapat hal serupa.
String(Char[]) constructor
tidak
String(char[] value)
Menambahkan referensi: -
"hello"
adalah string literal dan akan dimasukkan ke dalam kumpulan konstan oleh kompiler, lihat JLS §3.10.5 dan JVMS §5.1 .
Java.lang.String
bukan hanya kelas. Ini merupakan bagian integral dari bahasa inti. Kompiler memiliki gula sintaksis untuk itu. Misalnya, ""
seperti singkatan untuk new String("")
. Ketika ditulis ""
, kompiler mengoptimalkan string identik ke instance yang sama untuk menghemat ruang."a" + 5 == "a5" ==> true
Kompiler memiliki gula sintaksis untuk banyak hal, termasuk tidak harus kotak / unbox antara versi objek dan jenis asli mereka, tidak ada induk berarti Obyek, konstruktor default, ...
""
bukan singkatan untuk new String("")
. Jika Anda menggunakan ""
, hal pertama yang akan dilakukan adalah mencari kecocokan di kumpulan String JVM dan jika itu benar, itu akan mengembalikan String itu. Dengan menggunakan new String("")
, Anda akan selalu membuat String baru, bahkan jika String itu sendiri sudah ada di kolam String (karena itu tidak akan disimpan di kolam String).
" "
sudah menjadi String!