Gulir untuk membalik halaman
Computer Science A · AP Computer Science A
nilai, referensi, dan metode yang memakainya
Variabel adalah kotak bernama di memori. Variabel primitif menyimpan nilainya; variabel referensi menyimpan lokasi sebuah objek.
int score = 42; int copy = score; // salinan mendapat 42 sendiri copy = 7; // score masih 42 String name = "Ada"; // sebuah referensi String other = name; // referensi yang sama
Gambar menjalankan baris-baris ini. copy = score menyalin nilai 42 ke kotak kedua, sehingga ketika copy menjadi 7, score tidak berubah. name sama sekali tidak menyimpan karakter: kotaknya berisi panah (merah) ke objek String yang dibuat di tempat lain di memori. other = name menyalin panahnya, bukan objeknya: dua panah, satu objek.
Perbedaan itu berlaku di seluruh Java, dan di seluruh bab ini: apa yang disimpan variabel, apa yang diberikan kepada metode dan dikembalikannya, apa yang dibuat oleh new, dan mengapa String tidak pernah berubah setelah dibuat.
Bab ini adalah AP Computer Science A Unit 1, Menggunakan Objek dan Metode, 15–25% dari nilai pilihan ganda: kompilasi dan kesalahan (1.1), tipe, ekspresi, dan penugasan (1.2–1.6), pustaka, dokumentasi, dan metode (1.7–1.11), objek dan pembuatannya (1.12–1.14), serta String (1.15). 42 soal pilihan ganda ujian disertai Java Quick Reference, yang mencantumkan setiap metode pustaka yang boleh dipakai; soal uraian pertamanya memanggil metode String.
dan tiga jenis kesalahan
Algoritma adalah proses langkah demi langkah untuk menyelesaikan suatu tugas atau memecahkan suatu masalah. Algoritma dapat ditulis dengan kata-kata, digambar sebagai diagram, atau ditulis sebagai program.
Sekuensial menempatkan langkah-langkah dalam urutan, dan langkah itu berjalan satu per satu: sebuah metode Java menjalankan pernyataannya dari atas ke bawah kecuali ada yang mengubah alurnya.
Kode dapat ditulis di editor teks apa pun, tetapi sebagian besar pemrogram memakai lingkungan pengembangan terpadu (IDE), yang memiliki alat untuk menulis, mengompilasi, dan menjalankannya. Kompilator memeriksa kode sumber untuk beberapa kesalahan dan menerjemahkannya; kompilator Java membuat bytecode, yang dijalankan oleh Java Virtual Machine (JVM). Kesalahan yang ditemukan kompilator harus diperbaiki sebelum program dapat berjalan sama sekali.
Gambar mengirim tiga program melewati jalur ini, masing-masing dengan satu jenis kesalahan.
int total = 7 + 3 // kurang ; System.out.println(total); Kesalahan sintaks melanggar aturan bahasa. Kompilator menemukannya (error: ';' expected) dan tidak ada yang berjalan.
int count = 0; System.out.println(10 / count);
Kesalahan run-time terjadi saat program berjalan, dan biasanya mengakhirinya secara tidak normal. Yang ini adalah sebuah pengecualian (exception): kesalahan yang tidak terdeteksi kompilator, yang mengganggu alur eksekusi normal (ArithmeticException: / by zero).
double avg = (7 + 8) / 2; System.out.println(avg); // prints 7.0 Kesalahan logika dapat dikompilasi dan dijalankan, tetapi perilakunya salah: rata-rata dari 7 and 8 seharusnya 7.5. Hanya pengujian dengan data tertentu, dan membandingkannya dengan hasil yang diharapkan, yang menemukannya. (Mengapa mencetak 7.0: halaman 1.3.)
int, double, boolean, dan referensi
Tipe data adalah himpunan nilai beserta operasi atasnya. Setiap tipe adalah tipe primitif atau tipe referensi.
Kursus ini memakai tiga tipe primitif, untuk bilangan dan nilai Boolean:
| type | values | examples |
|---|---|---|
int | integers | 7, -40, 0 |
double | bilangan real | 2.5, 7.0, -0.01 |
boolean | true atau false | true |
Java memiliki lima tipe primitif lain (long, short, byte, float, char); semuanya berada di luar kursus dan ujian. Apa pun yang bukan primitif, seperti String, adalah objek, dan tipenya adalah tipe referensi.
Variabel adalah lokasi penyimpanan yang menyimpan sebuah nilai, yang dapat berubah saat program berjalan. Setiap variabel memiliki nama dan tipe, dan variabel bertipe primitif menyimpan nilai bertipe itu.
int n = 7; double d = 2.5; boolean ok = true; double w = 7; // stores 7.0 int m = 2.5; // tidak dapat dikompilasi
Sebuah int muat dalam double: double w = 7; menyimpan 7.0. Sebuah double tidak muat dalam int, sehingga int m = 2.5; adalah kesalahan kompilasi: incompatible types: possible lossy conversion from double to int.
Pilih tipe berdasarkan kemungkinan nilainya: jumlah siswa adalah int, harga atau rata-rata adalah double, apakah lampu menyala adalah boolean.
print, println, dan urutan escape
System.out.print dan System.out.println menampilkan informasi di layar. println lalu memindahkan kursor ke baris baru; print membiarkannya di tempat.
Literal adalah representasi kode dari nilai tetap: 7, 2.5, true. Literal string adalah urutan karakter di dalam tanda kutip ganda: "CSA".
Beberapa karakter tidak dapat diketik langsung di dalam tanda kutip. Urutan escape diawali garis miring terbalik dan memiliki arti khusus. Kursus ini memakai tiga:
| urutan escape | means |
|---|---|
\" | tanda kutip ganda |
\\ | garis miring terbalik |
\n | baris baru |
System.out.print("AP "); System.out.println("CSA"); System.out.println("say \"hi\""); System.out.print("a\\b\nc"); Konsol lalu menampilkan (gambar mengetikkannya):
AP CSA say "hi" a\b c print pertama meninggalkan kursor setelah AP , sehingga CSA berada di baris yang sama. Pada baris terakhir, \\ mencetak satu garis miring terbalik dan \n memulai baris baru di tengah string.
pembagian int, sisa bagi, dan prioritas operator
Ekspresi aritmetika menggabungkan nilai numerik, variabel, dan operator +, -, *, /, dan %. Dua nilai int menghasilkan int; setidaknya satu double menghasilkan double.
System.out.println(17 / 5); // 3 System.out.println(17 % 5); // 2 System.out.println(17.0 / 5); // 3.4
Membagi dua int hanya menyisakan bagian bilangan bulat dari hasil bagi: 17 blok membentuk 3 kelompok penuh berisi 5. Operator sisa bagi % memberi apa yang tersisa: 2. Dengan sebuah double dalam pembagian, hasilnya adalah hasil bagi itu sendiri, 3.4. (Kursus ini memakai % hanya dengan a ≥ 0 dan b > 0.)
Prioritas operator: *, /, dan % diterapkan sebelum + dan -; operator dengan prioritas sama berjalan dari kiri ke kanan; tanda kurung mengubah pengelompokan. Kompilator mengelompokkan nilai dengan operatornya dengan cara ini pada waktu kompilasi.
| expression | value |
|---|---|
2 + 3 * 4 | 14 |
(2 + 3) * 4 | 20 |
10 - 4 - 3 | 3 |
7 + 9 % 4 | 8 |
1 / 2 * 4.0 | 0.0 |
1.0 / 2 * 4 | 2.0 |
Pada 1 / 2 * 4.0, 1 / 2 adalah pembagian int dan sudah bernilai 0 sebelum double muncul.
Membagi sebuah int dengan int nol melempar ArithmeticException saat baris itu dijalankan. (Pembagian dengan nol pada double, dan nilai double khusus yang dihasilkannya, berada di luar kursus.)
sisi kanan, disimpan di kiri
Operator penugasan = mengevaluasi ekspresi di sebelah kanannya menjadi satu nilai dan menyimpannya di variabel di sebelah kirinya.
Sebuah variabel harus diberi nilai sebelum dipakai dalam ekspresi, dan nilainya harus bertipe yang sesuai. Penugasan pertama menginisialisasi-nya. Setiap penugasan berikutnya mengganti nilainya: nilai lama hilang.
int a = 3; // a 3 int b = 8; // a 3, b 8 int temp = a; // a 3, b 8, temp 3 a = b; // a 8, b 8, temp 3 b = temp; // a 8, b 3, temp 3
Itulah sebabnya menukar dua variabel membutuhkan variabel ketiga. Tanpa temp, a = b akan menghancurkan 3 milik a sebelum b sempat mendapatkannya. Gambar memindahkan setiap salinan dari kotak ke kotak: sumbernya tetap menyimpan nilainya.
Saat program berjalan, ekspresi dievaluasi menjadi satu nilai, dan nilai itu memiliki tipe: a + b adalah int, a + 0.5 adalah double. Pernyataan seperti count = count + 1 bukan persamaan; pernyataan itu membaca count, menambahkan 1, dan menyimpan hasilnya kembali.
Variabel referensi dapat diberi objek baru atau null. Literal null berarti referensi tidak terhubung dengan objek mana pun.
Penugasan di dalam ekspresi, seperti a = b = 4;, berada di luar kursus.
Masukan dapat berupa sentuhan, audio, visual, atau teks. Kelas Scanner adalah salah satu cara membaca teks yang diketik di papan ketik; ujian tidak menguji bentuk masukan pengguna tertentu.
pemotongan, pelebaran, dan pembulatan
Operator casting (int) dan (double) mengubah nilai dari satu tipe primitif ke tipe primitif lainnya.
Meng-cast double ke int memotong: angka setelah koma desimal dibuang, sehingga nilainya bergerak mendekati nol, apa pun tandanya.
| expression | value |
|---|---|
(int) 3.99 | 3 |
(int) -3.99 | -3 |
7 / 2 | 3 |
(double) 7 / 2 | 3.5 |
(double) (7 / 2) | 3.0 |
7 / 2.0 | 3.5 |
1 + 2.5 | 3.5 |
Cast berlaku pada nilai tepat setelahnya. (double) 7 / 2 meng-cast 7, lalu membagi sebagai double; (double) (7 / 2) melakukan pembagian int lebih dulu lalu meng-cast hasilnya, 3.0.
Sebagian kode secara otomatis melebarkan int menjadi double: pada 1 + 2.5, dan ketika int disimpan dalam variabel double (halaman 1.2).
Untuk membulatkan double ke bilangan bulat terdekat, geser setengah satuan menjauhi nol lalu potong: (int) (x + 0.5) untuk x tak negatif, (int) (x - 0.5) untuk x negatif.
| x | (int) x | rounded |
|---|---|---|
2.7 | 2 | 3 |
-2.7 | -2 | -3 |
3.2 | 3 | 3 |
-1.4 | -1 | -1 |
Gambar meng-cast masing-masing: merah memotong ke arah nol; biru menggeser setengah, lalu memotong.
overflow bilangan bulat dan galat pembulatan
int disimpan dalam memori dengan ukuran tetap, 4 byte, sehingga memiliki rentang: dari Integer.MIN_VALUE sampai Integer.MAX_VALUE, termasuk kedua ujungnya.
| constant | value |
|---|---|
Integer.MAX_VALUE | 2147483647 |
Integer.MIN_VALUE | -2147483648 |
int n = Integer.MAX_VALUE - 2; // n adalah 2147483645 n = n + 1; // n adalah 2147483646 n = n + 1; // n adalah 2147483647 n = n + 1; // n adalah -2147483648 n = n + 1; // n adalah -2147483647
Jika suatu ekspresi bernilai int di luar rentang, terjadi overflow bilangan bulat. Hasilnya adalah int di dalam rentang, tetapi bukan nilai yang diharapkan: satu di atas MAX_VALUE adalah MIN_VALUE. Gambar menggambarkan int sebagai cincin (tidak sesuai skala) dengan sambungan di atas. Tidak ada pesan kesalahan; program terus berjalan dengan angka yang salah.
Double memiliki batas yang berbeda. Double juga disimpan dalam memori berukuran tetap, sehingga hasil yang lebih presisi daripada yang dapat ditampung dibulatkan ke nilai terdekat yang dapat diwakilinya: sebuah galat pembulatan.
System.out.println(0.1 + 0.2); // 0.30000000000000004 Baik 0.1 maupun 0.2 tidak memiliki bentuk biner yang tepat, dan galat kecilnya terlihat pada hasil penjumlahan. Untuk menghindari galat pembulatan, pakailah nilai int jika bisa: hitung uang dalam sen, bukan dolar. (Tipe desimal khusus yang menghindarinya berada di luar kursus.)
+=, −=, *=, /=, %=, ++, dan −−
Operator penugasan majemuk melakukan aritmetika antara nilai variabel dan nilai di sebelah kanan, lalu menugaskan hasilnya ke variabel itu.
score += 5 melakukan hal yang sama dengan score = score + 5. Hal yang sama berlaku untuk -=, *=, /=, dan %=; /= pada int adalah pembagian int.
Operator post-increment ++ menambah 1 pada variabel numerik dan menyimpannya; operator post-decrement -- mengurangi 1.
int score = 10; // score adalah 10 score += 5; // score adalah 15 score -= 3; // score adalah 12 score *= 2; // score adalah 24 score /= 5; // score adalah 4 score %= 3; // score adalah 1 score++; // score adalah 2 score--; // score adalah 1
Gambar menjalankan baris-baris itu dan menyimpan setiap nilai pada sebuah pita. Telusuri di atas kertas dengan cara yang sama: satu baris, satu nilai baru.
Bentuk prefiks (++x) dan penambahan di dalam ekspresi lain (arr[x++]) berada di luar kursus.
memakai kelas yang tidak kamu tulis
Pustaka adalah kumpulan kelas. Spesifikasi antarmuka pemrograman aplikasi (API) memberi tahu pemrogram cara memakainya.
Kelas mendefinisikan sebuah tipe referensi. Kelas pustaka dikelompokkan dalam paket: String dan Math ada di java.lang, Scanner dan ArrayList di java.util. Kelas yang sudah ada dapat dipakai untuk membuat objek tanpa melihat kodenya; dokumentasinya yang membuatnya dapat dipakai.
Atribut sebuah kelas adalah data terkait kelas itu, disimpan dalam variabel: karakter-karakter sebuah String. Perilakunya adalah apa yang dapat dilakukan instansnya, atau yang dapat dilakukan terhadapnya, dan didefinisikan oleh metode: length(), substring.
Komentar menjelaskan kode kepada pemrogram aslinya dan kepada orang lain. Kompilator mengabaikannya dan komentar tidak pernah dijalankan. Java memiliki tiga jenis:
// a comment to the end of the line /* a block of comment, over several lines */ /** a Javadoc comment, used to make API documentation */
Gambar mengambil String dari rak dan membuka dokumentasinya untuk substring.
Prasyarat (precondition) harus benar tepat sebelum metode dijalankan agar metode itu bekerja seperti yang diharapkan. Metode tidak diharapkan memeriksanya: memanggil substring dengan to melewati ujung akan melanggar prasyarat, dan hasilnya adalah pengecualian, bukan jawaban yang sopan.
Pascasyarat (postcondition) harus selalu benar setelah metode dijalankan. Pascasyarat menggambarkan hasilnya: apa yang dikembalikan, atau nilai atribut objek sesudahnya.
parameter, argumen, nilai kembalian
Metode adalah blok kode bernama yang hanya berjalan ketika dipanggil. Blok adalah kode apa pun di dalam kurung kurawal.
Abstraksi prosedural: kamu dapat memakai metode dengan mengetahui apa yang dilakukannya, tanpa tahu bagaimana ia ditulis. Header-nya memberi tahu apa yang kamu butuhkan:
public static double pow(double base, double exponent)
Parameter adalah variabel yang dideklarasikan di header (base, exponent), dan dipakai di dalam metode. Tanda tangan metode adalah nama metode dan daftar berurutan tipe parameternya: pow(double, double). Metode tanpa parameter memiliki daftar kosong: length().
Argumen adalah nilai yang diberikan saat metode dipanggil. Argumen harus sesuai dengan parameter dalam jumlah dan urutan. Argumen diteruskan menurut nilai: setiap parameter dimulai sebagai salinan argumennya. Pada gambar, 2 dan 10 menjadi salinan 2.0 dan 10.0.
double r = Math.pow(2, 10); System.out.println(r); // 1024.0 Metode non-void mengembalikan nilai bertipe kembaliannya; untuk memakainya, simpan dalam variabel atau pakai dalam ekspresi. Metode void tidak mengembalikan apa-apa, sehingga tidak dapat menjadi bagian dari ekspresi: int x = System.out.println(5); tidak dapat dikompilasi.
Metode di-overload ketika beberapa metode memiliki nama yang sama dengan tanda tangan berbeda: Math.abs(int) dan Math.abs(double). Argumenlah yang menentukan metode mana yang berjalan.
Pemanggilan menyela urutan pernyataan: pernyataan metode dijalankan lebih dulu, dan ketika pernyataan terakhir (atau sebuah return) selesai, kendali kembali ke tepat setelah pemanggilan.
metode static, dan Math.random()
Metode kelas milik kelas, bukan milik objek tertentu. Header-nya memiliki kata kunci static, dan dipanggil dengan nama kelas dan operator titik: Math.sqrt(2.0). Di dalam kelas yang mendefinisikannya, nama kelas boleh dihilangkan.
Kelas Math ada di java.lang, sehingga tersedia tanpa import, dan hanya memiliki metode kelas. Java Quick Reference mencantumkan lima:
| method | returns |
|---|---|
static int abs(int x) | nilai mutlak dari sebuah int |
static double abs(double x) | nilai mutlak dari sebuah double |
static double pow(double base, double exponent) | base dipangkatkan exponent |
static double sqrt(double x) | akar kuadrat tak negatif |
static double random() | sebuah double ≥ 0.0 dan < 1.0 |
Rentang Math.random() mencakup 0.0 (ujung inklusif) dan tidak mencakup 1.0 (ujung eksklusif). Aritmetika dan casting menggesernya ke rentang yang kamu inginkan:
int roll = (int) (Math.random() * 6) + 1;
Gambar melakukannya selangkah demi selangkah. * 6 meregangkan [0.0, 1.0) menjadi [0.0, 6.0). (int) memotong setiap bagian menjadi 0, 1, …, 5: 6 bagian sama besar, sehingga ada 6 nilai yang kemungkinannya sama. + 1 menggesernya menjadi 1, …, 6. Secara umum, (int) (Math.random() * count) + low menghasilkan salah satu dari count int yang dimulai dari low.
30 lemparannya jatuh pada 5 on 1, 5 on 2, 6 on 3, 4 on 4, 6 on 5, 4 on 6: kemungkinan yang sama tidak berarti sama sering dalam percobaan yang singkat.
cetak biru dan apa yang dihasilkannya
Kelas adalah implementasi formal, atau cetak biru, dari atribut dan perilaku sebuah objek. Objek adalah instans tertentu dari sebuah kelas, dengan nilai miliknya sendiri untuk atribut-atribut itu.
Gambar memakai kelas hipotetis, Book, dengan dua atribut (judul dan jumlah halaman) dan dua perilaku (getTitle() dan getPages()). Setiap Book yang dicetak darinya memiliki judul dan halaman sendiri: "Maps", 120; "Birds", 340; "Stars", 96.
Kelas-kelas yang berhubungan dapat berbagi atribut dan perilaku umum dengan menaruhnya dalam satu kelas, yaitu superkelas. Kelas yang memperluasnya, yaitu subkelas, memakai atribut dan perilaku itu tanpa menuliskannya lagi: hubungan pewarisan. (Merancang dan menulis pewarisan berada di luar kursus.)
Setiap kelas di Java adalah subkelas dari kelas Object, itulah sebabnya setiap objek memiliki metode seperti toString() dan equals.
Variabel bertipe referensi menyimpan sebuah referensi objek, yang dapat dibayangkan sebagai alamat memori objek: panah pada gambar, bukan objeknya.
Book b; // b dapat menyimpan referensi ke sebuah Book String s; // s dapat menyimpan referensi ke sebuah String
new, konstruktor, dan null
Objek dibuat dengan kata kunci new diikuti pemanggilan salah satu konstruktor kelas.
Konstruktor memiliki nama yang sama dengan kelasnya. Tanda tangan-nya adalah nama itu dan daftar berurutan tipe parameter; header-nya mencantumkan tipe dan nama parameter. Dokumentasi Book hipotetis mencantumkan:
Book(String title, int pages) Book(String title) String getTitle() int getPages()
Dua konstruktor dengan tanda tangan berbeda: konstruktor tersebut di-overload, dan argumenlah yang menentukan mana yang dipanggil. new Book("Maps") memanggil yang kedua.
Book b = new Book("Maps", 120); Book c = null; Gambar menjalankan baris pertama secara berurutan: new menyediakan memori untuk sebuah Book; konstruktor berjalan, parameternya menentukan nilai awal atribut; lalu referensi ke objek baru disimpan di b. Seperti pemanggilan metode, pemanggilan konstruktor menyela urutan pernyataan, dan kendali kembali ke tepat setelah pemanggilan ketika pernyataan terakhirnya selesai.
Argumen konstruktor harus sesuai dalam jumlah dan urutan dengan tipe parameter, dan diteruskan menurut nilai: new Book(120, "Maps") tidak dapat dikompilasi, karena tidak ada konstruktor yang menerima int lalu String.
Variabel bertipe referensi menyimpan referensi objek atau, jika tidak ada objek, null: c tidak merujuk ke apa pun.
operator titik, dan null
Metode instans dipanggil pada objek dari kelas itu, dengan nama objek, operator titik, dan metode: b.getPages().
int p = b.getPages(); // p adalah 120 int q = c.getPages(); // NullPointerException
Pemanggilan mengikuti referensi di b ke objeknya, menjalankan getPages() pada objek itu, dan int yang dikembalikannya (120) disimpan di p. Objek Book lain akan menjawab dengan jumlah halamannya sendiri.
c adalah null: tidak ada objek yang dapat dituju panahnya. Memanggil metode pada referensi null melempar NullPointerException saat baris itu dijalankan. Kode ini dapat dikompilasi: kompilator hanya memeriksa bahwa Book memiliki getPages().
Bandingkan dengan metode kelas pada halaman 1.10: Math.sqrt(x) dipanggil pada kelas; s.length() dipanggil pada satu objek String, dan menjawab hanya untuk string itu.
imutabel; penggabungan membuat yang baru
Objek String mewakili urutan karakter. Objek ini dibuat dari literal string, "cat", atau dengan konstruktor, new String("cat"). String ada di java.lang, tersedia secara default.
Objek String bersifat imutabel: setelah dibuat, karakternya tidak pernah berubah. Metode yang dipanggil pada String tidak mengubahnya; metode itu mengembalikan nilai baru.
String s = "cat"; // s adalah "cat" s = s + "s"; // s adalah "cats" String t = s + 1 + 2; // t adalah "cats12" String v = 1 + 2 + s; // v adalah "3cats"
+ dan += menggabungkan String, membuat objek String yang baru. Pada gambar, s = s + "s" membentuk "cats" dan mengarahkan s ke sana; objek "cat" tetap persis "cat".
Primitif yang digabungkan dengan String diubah menjadi String. + bekerja dari kiri ke kanan, jadi tempat String pertama kali muncul berpengaruh: pada s + 1 + 2, setiap angka digabungkan sebagai teks; pada 1 + 2 + s, 1 + 2 dijumlahkan lebih dulu, sebagai int.
Objek apa pun dapat digabungkan dengan String: Java memanggil metode toString milik objek itu, yang dimiliki setiap kelas dari Object, dan mengembalikan string yang mewakili objek. Subkelas sering me-override-nya (metode public dengan tanda tangan yang sama dengan milik superkelas, dengan perilaku sendiri); menulis override seperti itu berada di luar kursus.
indeks, panjang, substring, indexOf
Karakter sebuah String memiliki indeks dari 0 sampai satu kurang dari panjangnya. Memakai indeks di luar rentang itu melempar StringIndexOutOfBoundsException.
Java Quick Reference mencantumkan metode String berikut (dan konstruktornya; split hadir bersama berkas teks, pada topik 4.6):
| method | returns |
|---|---|
int length() | jumlah karakter |
String substring(int from, int to) | karakter dari indeks from sampai indeks to - 1 |
String substring(int from) | substring(from, length()) |
int indexOf(String str) | indeks kemunculan pertama str; −1 jika tidak ditemukan |
boolean equals(Object other) | halaman berikutnya |
int compareTo(String other) | halaman berikutnya |
String s = "BANANAS"; s.length(); // 7 s.substring(1, 4); // "ANA" s.substring(4); // "NAS" s.indexOf("NA"); // 2 s.indexOf("X"); // -1 s.substring(3, 4); // "A"
to adalah indeks pertama yang dilewatkan, sehingga substring(from, to) memiliki to - from karakter. indexOf hanya menemukan kemunculan pertama: "NA" juga dimulai pada indeks 4.
String yang berisi satu karakter pada index adalah substring(index, index + 1).
equals, compareTo, dan bukan ==
equals menanyakan apakah dua String memiliki urutan karakter yang sama. compareTo menanyakan mana yang lebih dulu.
String a = "pear"; String b = new String("pear"); System.out.println(a == b); // false System.out.println(a.equals(b)); // true System.out.println(a.compareTo("peach") > 0); // true a dan b merujuk ke dua objek berbeda yang menyimpan karakter yang sama. a.equals(b) membandingkan karakternya, pasangan demi pasangan: true. a == b membandingkan referensinya, yaitu apakah keduanya menunjuk objek yang sama: false. Bandingkan String dengan equals. (Membandingkan referensi dengan == muncul kembali pada topik 2.6.)
a.compareTo(other) mengembalikan nilai kurang dari 0 jika a berada sebelum other, 0 jika keduanya sama, dan lebih dari 0 jika a berada sesudahnya. String diurutkan berdasarkan abjad: karakter pertama yang berbeda yang menentukan. "pear" dan "peach" sama sampai indeks 3, tempat 'r' berada setelah 'c', sehingga hasilnya positif. Andalkan hanya tandanya: hanya itu yang dijanjikan Quick Reference.
Kursus ini memakai equals hanya untuk membandingkan sebuah String dengan String lain.