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:
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
str
menyimpan rujukan kepada String
objek.
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:

Selepas jenis operasi tugasan ini, String
objek 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 String
objek, dan text
pembolehubah dan message
akan 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:
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 Scanner
objek (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 Scanner
kelas berfungsi di sini .
Ini adalah bagaimana semuanya akan disimpan dalam ingatan:
Dalam kes ini, satu String
objek kekal dalam ingatan seperti dahulu - hanya rujukan kepadanya yang dihantar dan disimpan dalam pembolehubah.
5. Membandingkan rujukan kepada String
objek
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:
Pembolehubah message
dan text
merujuk kepada (menyimpan alamat) objek yang sama. Tetapi pembolehubah s1
dan s2
menyimpan 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 |
---|---|
|
|
GO TO FULL VERSION