1. Perbandingan

Pemrogram perlu membandingkan variabel yang berbeda satu sama lain sepanjang waktu. Tapi, seperti yang telah Anda lihat, semuanya tidak sesederhana itu.

Bilangan bulat sangat mudah untuk dibandingkan — Anda cukup menggunakan ==dan selesai. Untuk membandingkan bilangan real , Anda harus membandingkan selisihnya (atau lebih tepatnya, nilai absolut selisihnya) dengan sejumlah angka yang sangat kecil.

Membandingkan string bahkan lebih sulit. Di atas segalanya, ini karena string adalah objek. Terlebih lagi, programmer sering menginginkan perbandingan string berjalan sedikit berbeda tergantung pada situasinya.


2. Bagaimana string disusun memori

Seperti yang telah Anda lihat, string disimpan dalam memori berbeda dari bilangan bulat dan bilangan real:

Bagaimana string diatur memori

Dua blok memori digunakan untuk menyimpan string: satu blok menyimpan teks itu sendiri (ukurannya bergantung pada ukuran teks) sedangkan blok kedua (4 byte) menyimpan alamat blok pertama.

Meskipun programmer berpengalaman akan mengatakan sesuatu seperti " String strvariabel menyimpan referensi ke suatu Stringobjek.


3. Menetapkan referensi ke string

Manfaat dari pendekatan ini menjadi jelas ketika Anda perlu menetapkan satu variabel string ke variabel string lainnya. Contoh:

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

Dan inilah yang akan berisi memori sebagai hasilnya:

Menetapkan referensi ke string

Setelah jenis operasi penugasan ini, Stringobjek tetap berada di tempatnya, dan hanya alamatnya (referensi ke objek) yang disalin ke dalam messagevariabel.


4. Bekerja dengan referensi dan objek

Tetapi jika Anda memutuskan untuk mengonversi string menjadi huruf besar (huruf besar), mesin Java melakukan segalanya dengan benar: Anda akan mendapatkan dua Stringobjek, dan variabel textand messageakan menyimpan referensi, masing-masing ke objeknya sendiri.

Contoh:

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

Dan inilah yang akan berisi memori sebagai hasilnya:

Bekerja dengan referensi dan objek

Harap perhatikan bahwa toUpperCase()metode ini tidak mengubah string yang dipanggil. Sebaliknya, itu membuat string baru (objek baru) dan mengembalikan referensi ke sana.

Bagaimana dengan contoh yang lebih menarik. Katakanlah Anda memutuskan untuk meneruskan string ke Scannerobjek (sehingga objek membaca nilai dari string).

Contoh:

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

Anda dapat mempelajari lebih lanjut tentang cara Scannerkerja kelas di sini .

Ini adalah bagaimana semuanya akan disimpan dalam memori:

Bekerja dengan referensi dan objek.  Kelas pemindai

Dalam hal ini, satu Stringobjek tetap berada di memori seperti sebelumnya — hanya referensi untuk itu yang diteruskan dan disimpan dalam variabel.


5. Membandingkan referensi ke Stringobjek

Dan akhirnya, kita telah mencapai bagian yang menyenangkan: perbandingan string.

Ada dua operator yang dapat Anda gunakan untuk membandingkan variabel string: ==(sama) dan !=(tidak sama). Anda tidak dapat menggunakan operator "lebih besar dari", "kurang dari", atau "lebih besar dari atau sama dengan" — compiler tidak akan mengizinkannya.

Tapi ada nuansa yang menarik di sini: apa yang sebenarnya disimpan dalam variabel string? Itu benar: alamat (referensi) ke objek. Dan alamat inilah yang akan dibandingkan:

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

Inilah yang akan ada di memori:

Membandingkan referensi ke objek String

Variabel messageand textmerujuk ke (menyimpan alamat) objek yang sama. Tetapi variabel s1and s2menyimpan referensi ke objek yang sangat mirip tetapi berbeda.

Dan jika Anda membandingkan 4 variabel ini dalam kode, maka Anda akan mendapatkan hasil sebagai berikut:

Kode Keluaran 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