1. Perbandingan

Pengaturcara perlu membandingkan pembolehubah yang berbeza antara satu sama lain sepanjang masa. Tetapi, seperti yang telah anda lihat, semuanya tidak begitu mudah.

Integer sangat mudah untuk dibandingkan — anda hanya menggunakan ==dan anda sudah selesai. Untuk membandingkan nombor nyata , anda perlu membandingkan perbezaannya (atau lebih tepat, nilai mutlak perbezaan) dengan beberapa nombor yang sangat kecil.

Membandingkan rentetan adalah lebih sukar. Di atas semua, ini kerana rentetan adalah objek. Lebih-lebih lagi, pengaturcara sering mahukan perbandingan rentetan berjalan sedikit berbeza bergantung pada situasi.


2. Bagaimana rentetan disusun ingatan

Seperti yang telah anda lihat, rentetan disimpan dalam memori secara berbeza daripada integer dan nombor nyata:

Bagaimana rentetan disusun ingatan

Dua blok memori digunakan untuk menyimpan rentetan: satu blok menyimpan teks itu sendiri (saiznya bergantung pada saiz teks) manakala blok kedua (4 bait) menyimpan alamat blok pertama.

Walaupun pengaturcara yang berpengalaman akan mengatakan sesuatu seperti "pembolehubah String strmenyimpan rujukan kepada Stringobjek.


3. Memberikan rujukan kepada rentetan

Faedah pendekatan ini menjadi jelas apabila anda perlu menetapkan satu pembolehubah rentetan kepada pembolehubah rentetan yang lain. Contoh:

String text = "This is a very important message";
String message = text;

Dan inilah yang akan terkandung dalam memori sebagai hasilnya:

Menetapkan rujukan kepada rentetan

Selepas jenis operasi tugasan ini, Stringobjek kekal di tempatnya, dan hanya alamatnya (rujukan kepada objek) disalin ke dalam pembolehubah message.


4. Bekerja dengan rujukan dan objek

Tetapi jika anda memutuskan untuk menukar rentetan kepada huruf besar (huruf besar), mesin Java melakukan segala-galanya dengan betul: anda akan mendapat dua Stringobjek, dan textpembolehubah dan messageakan menyimpan rujukan, setiap satu kepada objeknya sendiri.

Contoh:

String text = "This is a very important message";
String message = text.toUpperCase(); 

Dan inilah yang akan terkandung dalam memori sebagai hasilnya:

Bekerja dengan rujukan dan objek

Sila ambil perhatian bahawa toUpperCase()kaedah itu tidak mengubah rentetan yang dipanggil. Sebaliknya, ia mencipta rentetan baharu (objek baharu) dan mengembalikan rujukan kepadanya.

Bagaimana pula dengan contoh yang lebih menarik. Katakan anda memutuskan untuk menghantar rentetan kepada Scannerobjek (supaya ia membaca nilai daripada rentetan).

Contoh:

String text = "10 20 40 80";
Scanner console = new Scanner(text);
int a = console.nextInt();
int b = console.nextInt();

Anda boleh mengetahui lebih lanjut tentang cara Scannerkelas berfungsi di sini .

Ini adalah bagaimana semuanya akan disimpan dalam ingatan:

Bekerja dengan rujukan dan objek.  Kelas pengimbas

Dalam kes ini, satu Stringobjek kekal dalam ingatan seperti dahulu - hanya rujukan kepadanya yang dihantar dan disimpan dalam pembolehubah.


5. Membandingkan rujukan kepada Stringobjek

Dan akhirnya, kami telah mencapai bahagian yang menyeronokkan: perbandingan rentetan.

Terdapat dua operator yang boleh anda gunakan untuk membandingkan pembolehubah rentetan: ==(sama) dan !=(tidak sama). Anda tidak boleh menggunakan pengendali "lebih besar daripada", "kurang daripada", atau "lebih besar daripada atau sama dengan" — pengkompil tidak akan membenarkannya.

Tetapi ada nuansa yang menarik di sini: apa yang sebenarnya disimpan dalam pembolehubah rentetan? Betul: alamat (rujukan) kepada objek. Dan alamat inilah yang akan dibandingkan:

String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase(); 

Inilah yang akan menjadi ingatan:

Membandingkan rujukan kepada objek String

Pembolehubah messagedan textmerujuk kepada (menyimpan alamat) objek yang sama. Tetapi pembolehubah s1dan s2menyimpan rujukan kepada objek yang sangat serupa tetapi berbeza.

Dan jika anda membandingkan 4 pembolehubah ini dalam kod, maka anda mendapat hasil berikut:

Kod Output konsol
String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
System.out.println(text == message);
System.out.println(text == s1);
System.out.println(s1 == s2); 


true  // The addresses are equal
false // The addresses are different
false // The addresses are different