String di Java dan Operasinya

Hai, teman-teman! Warteg lagi rame. Pelayan nyatet pesanan di kertas, lalu kasir mengetik ulang ke aplikasi Warteg Canggih. Masalahnya, tulisan tiap orang beda-beda. Ada yang ngetik "TEMPE orek", ada yang "tempe orek " dengan spasi nyelip di belakang.

Buat manusia, semuanya jelas tempe orek. Tapi buat program, itu tiga teks yang berbeda. Dari situ muncul pertanyaan, "Kok bisa beda ya? Padahal tulisannya sama. Terus gimana caranya biar kasir tetap ngerti maksudnya?" Jawabannya ada di cara Java mengolah teks, yaitu String di Java dan method-method bawaannya.

TL;DR: String di Java adalah objek untuk menyimpan teks, dan urutan karakternya dihitung mulai dari indeks 0. Method yang paling sering dipakai antara lain length(), toUpperCase(), trim(), contains(), replace(), dan substring(). Untuk membandingkan isi teks, pakai equals() atau equalsIgnoreCase(), bukan ==. Ingat juga, String tidak bisa diubah: setiap method menghasilkan String baru yang harus disimpan ulang.

Kenalan Dulu: Apa Itu String di Java?

String adalah deretan karakter yang disimpan sebagai satu teks. Di artikel Variabel dan Tipe Data, kita sudah tahu String itu objek, bukan tipe primitif. Artinya, dia punya banyak method, semacam kemampuan bawaan yang bisa dipanggil pakai titik. Daftar lengkapnya ada di dokumentasi resmi class String.

Satu hal yang perlu diingat dari awal: urutan karakter di String dihitung mulai dari 0, bukan 1.

T  e  m  p  e     o  r  e  k
0  1  2  3  4  5  6  7  8  9

Jadi di teks "Tempe orek", huruf T ada di indeks 0, dan spasi juga dihitung sebagai karakter (indeks 5).

Menyambung String dengan Tanda Plus

Di artikel sebelumnya, tanda + sudah dipakai untuk menyambung teks dengan angka. Tapi ada jebakan yang sering bikin bingung. Coba tebak hasil baris ini:

System.out.println("Total: " + 5000 + 4000);

Hasilnya bukan Total: 9000, tapi Total: 50004000.

Kenapa? Java membaca dari kiri ke kanan. Begitu ketemu teks "Total: ", semua yang disambung setelahnya ikut dianggap teks. Jadi 5000 dan 4000 ditempel berdampingan, bukan dijumlah.

Solusinya, bungkus hitungannya pakai kurung supaya dihitung duluan:

System.out.println("Total: " + (5000 + 4000)); // Total: 9000

Ini juga alasan kenapa di kasir versi 3 ada kurung di "Rp" + (harga1 * jumlahNasi). Aturan bahwa isi kurung selalu dihitung duluan sudah dibahas di artikel Operator di Java.

Method String di Java yang Paling Sering Dipakai

String punya banyak method, tapi untuk kasir kita, beberapa ini sudah cukup. Semua contoh di bawah pakai variabel yang sama:

String menu = "Tempe orek";

menu.length();                  // 10
menu.toUpperCase();             // "TEMPE OREK"
menu.toLowerCase();             // "tempe orek"
menu.contains("orek");          // true
menu.replace("orek", "bacem");  // "Tempe bacem"
menu.charAt(0);                 // 'T'
menu.substring(0, 5);           // "Tempe"

Komentar di sebelah kanan menunjukkan nilai yang dihasilkan tiap method. Untuk melihatnya di layar, bungkus dengan System.out.println(...), misalnya System.out.println(menu.length());.

Sedikit penjelasan buat yang mungkin bikin ragu:

  • length() menghitung jumlah karakter, termasuk spasi. Makanya hasilnya 10, bukan 9.
  • charAt(0) mengambil satu karakter di indeks 0, hasilnya char, bukan String.
  • substring(0, 5) mengambil karakter dari indeks 0 sampai sebelum indeks 5. Indeks akhirnya tidak ikut diambil.

Satu lagi yang paling berguna buat kasus pembuka tadi: trim(). Method ini membuang spasi di awal dan akhir teks.

String pesanan = "  TEMPE orek ";
String pesananRapi = pesanan.trim(); // "TEMPE orek"

Spasi berantakan sudah beres. Perhatikan, hasilnya disimpan ke variabel baru. Alasannya ada di bagian jebakan sebentar lagi. Tapi hurufnya masih campur besar dan kecil, jadi masih ada satu langkah lagi.

Membandingkan String di Java: equals dan equalsIgnoreCase

Setelah dirapikan, pesanan itu perlu dicocokkan dengan nama menu. Untuk membandingkan isi String, Java punya equals():

String menu = "Tempe orek";
String pesananRapi = "TEMPE orek";

pesananRapi.equals(menu);           // false
pesananRapi.equalsIgnoreCase(menu); // true

equals() membandingkan isi teks persis, termasuk huruf besar dan kecilnya. Karena pelayan nulisnya "TEMPE", hasilnya false. Nah, equalsIgnoreCase() mengabaikan beda huruf besar dan kecil, jadi pesanan tadi akhirnya dikenali.

Kenapa tidak pakai == saja? Karena untuk objek seperti String, == membandingkan apakah dua variabel menunjuk ke tempat yang sama di memori, bukan isinya. Jebakan ini dibahas lengkap di artikel Operator.

Jebakan: String Tidak Bisa Diubah

Ini jebakan yang hampir semua pemula pernah kena. Coba lihat kode ini:

String pesanan = "  es teh ";
pesanan.trim();
System.out.println("[" + pesanan + "]"); // [  es teh ]

Spasinya masih ada. Padahal trim() sudah dipanggil.

Ini karena String di Java bersifat immutable, alias isinya tidak bisa diubah setelah dibuat. Dokumentasi resminya bahkan menulisnya terang-terangan: "Strings are constant; their values cannot be changed after they are created." Method seperti trim() atau toUpperCase() tidak mengubah String aslinya. Dia membuat String baru sebagai hasil, dan kalau hasil itu tidak disimpan, ya hilang begitu saja.

Ibarat kertas pesanan yang ditulis pakai pulpen. Kalau mau rapi, kasir tidak bisa menghapusnya, dia harus menyalin ke kertas baru. Jadi, simpan hasilnya:

pesanan = pesanan.trim();
System.out.println("[" + pesanan + "]"); // [es teh]

Merapikan Struk dengan String.format

Kasir sudah bisa mengenali pesanan. Sekarang struknya. Kalau cuma pakai +, kolom harga jadi tidak sejajar karena panjang nama menu beda-beda.

Untuk itu, ada String.format(). Method ini menyusun teks berdasarkan pola, dengan aturan penulisan yang sama seperti class Formatter:

String.format("%-14s%10s", "Nasi putih", "Rp5000");
// "Nasi putih        Rp5000"

Cara baca polanya:

  • %-14s artinya "taruh teks di sini, sediakan 14 karakter, rata kiri". Tanda minus yang bikin rata kiri.
  • %10s artinya "sediakan 10 karakter, rata kanan".

Hasilnya, sepanjang apa pun nama menunya, harga selalu jatuh di kolom yang sama. Untuk garis pemisah, ada repeat() (sejak Java 11 yang mengulang teks sebanyak yang kita mau:

"-".repeat(24); // "------------------------"

Kasir Warteg Versi 4: Struk yang Rapi

Sekarang semuanya digabung. Kasir mengenali pesanan yang tulisannya berantakan, lalu mencetak struk yang kolomnya sejajar.

public class WartegCanggih {
    public static void main(String[] args) {
        final String NAMA_WARTEG = "Warteg Canggih";

        String menu1 = "Nasi putih";
        int harga1 = 5000;
        String menu2 = "Tempe orek";
        int harga2 = 4000;
        String menu3 = "Es teh";
        int harga3 = 3000;

        // pesanan dari catatan pelayan, tulisannya berantakan
        String pesanan = "  TEMPE orek ";
        String pesananRapi = pesanan.trim();
        boolean dikenali = pesananRapi.equalsIgnoreCase(menu2);
        System.out.println("Pesanan dikenali: " + dikenali);
        System.out.println();

        int total = harga1 + harga2 + harga3;
        String garis = "-".repeat(24);

        System.out.println(NAMA_WARTEG.toUpperCase());
        System.out.println(garis);
        System.out.println(String.format("%-14s%10s", menu1, "Rp" + harga1));
        System.out.println(String.format("%-14s%10s", menu2, "Rp" + harga2));
        System.out.println(String.format("%-14s%10s", menu3, "Rp" + harga3));
        System.out.println(garis);
        System.out.println(String.format("%-14s%10s", "TOTAL", "Rp" + total));
    }
}

Hasilnya:

Pesanan dikenali: true

WARTEG CANGGIH
------------------------
Nasi putih        Rp5000
Tempe orek        Rp4000
Es teh            Rp3000
------------------------
TOTAL            Rp12000

Struknya sudah mulai mirip struk beneran. Kasir juga sudah bisa bilang pesanan itu dikenali, walaupun dia belum bisa memutuskan apa yang harus dilakukan kalau pesanannya tidak dikenali. Itu jatah artikel berikutnya.

Kalau belum tahu cara menjalankan kode ini, langkahnya ada di Mengenal Java dan Menjalankan Program Java Pertama.

Error Umum Pemula

1. Lupa menyimpan hasil method. pesanan.trim(); saja tidak mengubah apa-apa. Yang benar pesanan = pesanan.trim();.

2. Membandingkan isi teks pakai ==. Tidak ada error, tapi hasilnya bisa false walaupun tulisannya sama. Pakai equals() atau equalsIgnoreCase().

3. Indeks kelewatan. menu.charAt(20) pada teks 10 karakter akan menghentikan program:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 10

Ingat, indeks terakhir selalu length() - 1.

4. Memanggil method pada String yang null. Kalau variabelnya belum menunjuk ke teks apa pun, catatan.length() akan memunculkan NullPointerException. Cek dulu catatan != null sebelum dipakai.

5. Angka ikut tertempel jadi teks. "Total: " + 5000 + 4000 menghasilkan 50004000. Bungkus hitungannya pakai kurung.

Penutup

Dari sekian banyak method String, yang paling sering menyelamatkan justru yang paling sederhana: trim() dan equalsIgnoreCase(). Data yang diketik manusia hampir selalu berantakan, dan dua method ini yang bikin program tetap ngerti maksudnya.

Coba tambahkan satu menu baru ke struk di atas. Pilih nama menu yang panjang, misalnya "Sayur lodeh nangka", lalu lihat apakah kolomnya masih sejajar. Kalau tidak, ubah angka 14 di pola %-14s sampai pas.

Setelah itu, lanjut ke artikel berikutnya: Percabangan di Java, tempat kasir mulai bisa mengambil keputusan sendiri, misalnya kapan pembeli dapat diskon. Daftar semua artikel seri ini ada di label Warteg Canggih Series.

Mau lihat lebih banyak method String? Daftar yang lebih lengkap ada di Java String dan Operasinya.

Pesanan paling aneh apa yang pernah kamu lihat ditulis pelayan warteg? Tulis di kolom komentar, nanti kita coba apakah trim() dan equalsIgnoreCase() sanggup mengenalinya.

Source code lengkap artikel ini bisa dilihat di GitHub: 04-string-di-java-dan-operasinya

FAQ

Apa itu String di Java? String adalah objek untuk menyimpan teks berupa deretan karakter. String ditulis dengan tanda kutip dua, dan urutan karakternya dihitung mulai dari indeks 0.

Kenapa hasil trim() tidak mengubah String aslinya? Karena String di Java bersifat immutable, jadi isinya tidak bisa diubah setelah dibuat. Method seperti trim() menghasilkan String baru, sehingga hasilnya harus disimpan ulang, misalnya pesanan = pesanan.trim();.

Apa beda equals() dan equalsIgnoreCase()? equals() membandingkan isi teks persis, termasuk huruf besar dan kecil. equalsIgnoreCase() membandingkan isi teks tanpa memperhatikan beda huruf besar dan kecil.

Kenapa "Total: " + 5000 + 4000 menghasilkan 50004000? Java membaca dari kiri ke kanan. Setelah bertemu teks, semua yang disambung berikutnya ikut diperlakukan sebagai teks. Supaya angkanya dijumlah dulu, bungkus dengan kurung: "Total: " + (5000 + 4000).

Bagaimana cara merapikan kolom teks agar sejajar di Java? Pakai String.format() dengan pola lebar kolom, misalnya %-14s untuk teks rata kiri selebar 14 karakter dan %10s untuk teks rata kanan selebar 10 karakter.

Referensi

Posting Komentar untuk "String di Java dan Operasinya"