Skip to content

Strings

Info

Semua file yang ada pada contoh pada catatan ini ada pada package Ch3/J3_6_Strings

Secara konsep, String pada java adalah kumpulan dari karakter-karakter Unicode. Contohnya adalah kalimatJava\u212 terdiri dari lima karakter unicode, J, a, v, a dan â„¢. Java tidak memiliki tipe String pada bawaanya (built-in), akan tetapi, Java Standard Library yang mengandung class yang sudah terdefinisi (disebut dengan predefined class) disebut dengan class Strings, (atau selanjutnya jika cukup katakan String). Setiap kalimat yang diawali dan akhir dengan quoted " adalah instance dari class Strings.

Check tipe data dari sebuah instance menggunakan operator instanceof

public class kertas {
    public static void main(String[] args) {
        String greets = "Greets";
        System.out.println(greets instanceof String); // True
    }
}
Output
true

Substring

Kita dapat mengambil sebagian kalimat dari string yang panjang pada class String menggunakan method substring().

Substring

package J3_6_Strings;

public class J2_substring {
    public static void main(String[] args) {
        String greets = "Assalamualaikum";
        String g = greets.substring(5); //(1)!
        System.out.println(g);
    }
}
1. Mengambil karakter ke 5 hingga habis

Output
amualaikum
package J3_6_Strings;

public class J3_substring_2 {
    public static void main(String[] args) {
        String greets = "Assalamualaikum";
        String g = greets.substring(5,8); //(1)! Mengambil karakter ke 5 hingga ke 8
        System.out.println(g);
    }
}
  1. Mengambil karakter ke 5 hingga ke 8
Output
amu

Concatenation

Java, like most programming languages, allows you to use (concatenate) two strings. + to jo

Concate using pluss operator +

package J3_6_Strings;

public class J_4_concatenating {
    public static void main(String[] args) {
        String firstName = "Muhammad";
        String lastName = "Farras";
        String fullName = firstName + lastName;
        System.out.println(fullName);
    }
}
        ```

```{.java title="Output"}
MuhammadFarras

Ketika kita menggabungkan sebuah kalimat dengan nilai yang bukan bertipe String, maka java akan mengkonversinya kedalam string.

Convertion when concatenating values

package J3_6_Strings;

public class J_5_concatenating_2 {
    public static void main(String[] args) {
        int value = 78;
        String desc = value + " adalah sebuah nilai yang cukup"; //(1)!
        System.out.println(desc);
    }
}
  1. Variable value yang bertipe int akan dikonversi java kedalam bentuk String.
Output
78 adalah sebuah nilai yang cukup

Java juga menyedikan fitur yang kita butuhkan seandainya kita ingin menggabungkan beberapa kalimat yang terpisah pada variabel menjadi satu kalimat utuh, java menyediakan static fungsi join. Method ini dapat menggabungkan string pada variable yang terpisah atau string yang ditampung pada sebuah array.

Concate multiple Strings

package J3_6_Strings;

public class J_5_concatenating_3_join {
    public static void main(String[] args) {
        String firstName = "Tania";
        String middleName = "Dwi";
        String lastName = "Haryanti";
        String fullName = String.join(" ",firstName,middleName, lastName);
        System.out.println(fullName);
    }
}
Output
Tania Dwi Haryanti
package J3_6_Strings;

public class J_5_concatenating_3_join_2 {
    public static void main(String[] args) {
        String[] name = {"Tania","Dwi","Haryanti"};
        String fullName = String.join(" ",name);
        System.out.println(fullName);
    }
}
Output
Tania Dwi Haryanti

Semenjak java 11, java memiliki method repeate untuk membuat perulangan string.

Perulangan string

Method repeat pada instance String baru ditambahkan pada java 11, maka dari itu untuk memastikan code berjalan dengan benar saya membuat validasi terkait versi java. Kode dibawah akan berjalan setidaknya versi java adalah versi 11.

Saya menggunakan library tambahan org.apache.commons. Anda harus meng-import library tersebut sesuai dengan package anda, seperti maven, gradle atau bahkan mengimport secara manual.

package J3_6_Strings;
import org.apache.commons.lang3.JavaVersion;
import org.apache.commons.lang3.SystemUtils;
public class J_5_concatenating_repeat {
    public static void main(String[] args) {
        if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_11)){
            String java = "Java";
            System.out.println(java.repeat(3));
        }
        else {
            System.out.println("Doesn't have repeat");
        }
    }
}
Output
JavaJavaJava

String are immutable

Di Java, class String tidak memiliki method yang membuat kita dapat mengganti karakter pada sebuah String yang ada. Namun kita dapat mencari cara lain, yaitu dengan menggunakan substring dan diconcatenate dengan karakter yg ingin ditambahkan.

How to modify String

Mengubah kalimat hello menjadi help!!!

package J3_6_Strings;

public class J_6_string_is_immutable {
    public static void main(String[] args) {
        String greets = "Hello";
        greets = greets.substring(0,3)+"p!!!";
        System.out.println(greets);
    }
}
Output
Help!!!

Pada baris ke-6, kita melaukan deklarasi lagi pada variable greets dengan substring dan concatenate karakter yang diinginkan sehingga menjadi kalimat help!!!.

Karena kita tidak dapat merubah karakter-karakter secara individu didalam java (maksudnya bukan mendeklarasi ulang) merujuk pada dokumentasi tentang objek dari class String yang dikatakan class tersebut immutable* (nilai tidak dapat berubah). Seperti contoh diatas, kalimat "Hello" akan selalu mengandung code-unit dengan karakter yang berurut H,e,l,l,o. Kita tidak dapat mengganti nilai tersebut, namun sebagaimana yang telah kita coba diatas, kita dapat mengganti konten dari variable yang menampung string tersebut dengan membuat variable tersebut merujuk ke string yang berbeda.

Namun pertanyaannya adalah, bukankah cara tersebu sangat ribet ? bukannya akan lebih mudah jika mengganti kode unit daripada membuat ulang string baru ?. Jawabannya bisa iya bisa tidak. Akan tetapi, tidak efesien membuat string baru yang menampung concatenation (sebagaimana contoh diatas). Namun, sifat string yang immutable ini memiliki keuntungan, yaitu: compiler dapat mengatur string yang dapat berbagi.

Untuk memahami bagimana hal itu berkerjak, bayangkan beberapa string duduk di sebuah kolom-kolom. Variabel yang menampung string menempati titik disalah satu kolom. Jika kita menyalin (copy) sebuah variable yang berisi string, keduanya, original dan copy-an nya berbagi karakter yang sama.

Testing string for equality

Untuk menguji apakah dua buah string sama atau tidak, gunakan method s.equals(t). Fungsi tersebut me-return true jika kedua buah string, s dan t ekual, false sebaliknya. Variable s dan t dapat variabel yang menampung String atau string literals (ex, string dari proses substring atau concenate).

equals

package J3_6_Strings;

public class J_7_string_test_equals {
    public static void main(String[] args) {
        String greets = "Hello";
        String gree = "Hel";

        System.out.println((gree+"lo").equals(greets));
        System.out.println((gree+"lo") == greets);
    }
}
Output
true
false

Untuk menguji apakah kedua string indetik tanpa memperhatikan upper/lowercase, maka gunakan fungsi equalsIgnoreCase To test whether two strings are identical except for the upper/lowercase letter distinction, use the equalsIgnoreCase method.

equalsIgnoreCase

package J3_6_Strings;

public class J_8_string_test_equalsignorecase {
    public static void main(String[] args) {
        System.out.println("Farras".equalsIgnoreCase("farras"));
    }
}
Output
true

Jangan gunakan == operator untuk menguji apakah dua string sama atau tidak. karena operatir tersebut hanya menghasilkan nilai true atau flase jika string tersebut berada dilokasi yang sama.

Empty and null string

String kosong, "" adalah string dengan pangjag kosong. Kita dapat menggunakan method length() untuk mengetahui panjang dari sebuah string

Check length of string

package J3_6_Strings;

public class J_9_empty_string {
    public static void main(String[] args) {
        String emptyString = "";
        System.out.println(emptyString.length());
    }
}
Output
0

String yang kosong adalah salah satu dari Java Object yang menampung string dengan pangjang nol dan kontent kosong. Namun, variabel yang menampung string juga dapat menampung special value yang disebut dengan null yang mengindikasi bahwa tidak ada objek yang berasosiasi dengan variabel tersebut.

Code

package J3_6_Strings;

public class J_10_variable_string_null {
    public static void main(String[] args) {
        String nullVar = null;
        System.out.println( (nullVar == null)?"Isinya null":"tidak null");
    }
}
Output
Isinya null

Seringkali kita butuh menguji apakah variable string kosong atau null. Maka kita harus mengetest string variable null terlebih dahulu baru panjang dari string. Karena jika menguji panjang string baru menguji null dapat menyebabkan munculnya exception NullPointerException.

Check empty and null string

package J3_6_Strings;

public class J_11_string_check_null_and_length {
    public static void main(String[] args) {
        String stringNull = null;
        String stringDesc = "This is not null";

        checkNullAndEmpty(stringNull);
        checkNullAndEmpty(stringDesc);
    }
    public static void checkNullAndEmpty(String text){
        System.out.println(text != null && text.length()>0?
                text
                :"Variable null atau kosong");
    }
}
Output
Variable null atau kosong
This is not null
// Rasie NullPointerException, karena menguji length terlebih dahulu jika variable yang diuji mengandung nilai NUll
package J3_6_Strings;

public class J_11_string_check_null_and_length_err {
    public static void main(String[] args) {
        String stringNull = null;
        String stringDesc = "This is not null";

        checkEmptyAndNull(stringNull); // (1)! will raise and NullPointerException
        checkEmptyAndNull(stringDesc);
    }
    public static void checkEmptyAndNull(String text){
        System.out.println(text.length() >0 && text != null? //(2)!
                text
                :"Variable null atau kosong");
    }
}
  1. Tempat timbulnya null pointer exception
  2. Menguji length terlabih dahulu dibandingkan menguji null
Output
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "text" is null
at J3_6_Strings.J_11_string_check_null_and_length_err.checkEmptyAndNull(J_11_string_check_null_and_length_err.java:13)
at J3_6_Strings.J_11_string_check_null_and_length_err.main(J_11_string_check_null_and_length_err.java:9)

Berbicara tentang NullPointerException, ini adalah bug yang paling sulit untuk ditemukan, bagusnya, java menyediakan static method Objects.requireNonNull yang dapat menampung nilai yang diuji dan pesan yang timbul jika muncul exception NullPointerException. Dengan demikian kita dapat mengeluarkan excepiton lebih awal (disebut dengan behavior fail-fast) dan lebih detail posisi exception tersebut dibandingkan dengan tidak menggunakan method tersebut.

Code

package J3_6_Strings;
import java.util.Objects; // (1)!

public class J_12_object_require_non_nulls {
    public static void main(String[] args) {
        String posiblyNull = null;
        checkEmptyAndNull(posiblyNull);
    }
    public static void checkEmptyAndNull(String text){
        String nonNull = Objects.requireNonNull(text,"Nilai tidak boleh null"); //(2)!
        System.out.println((nonNull.length()>0?text:"Variable null atau kosong"));
    }
}
  1. Import java.util.Objects untuk menggunakan method requireNonNull
  2. Menspesifikasikan pesan error dan variable mana yang tidak boleh menampung nilai Null.
Output
Exception in thread "main" java.lang.NullPointerException: Nilai tidak boleh null //(1)!
    at java.base/java.util.Objects.requireNonNull(Objects.java:233)
    at J3_6_Strings.J_12_object_require_non_nulls.checkEmptyAndNull(J_12_object_require_non_nulls.java:10)
    at J3_6_Strings.J_12_object_require_non_nulls.main(J_12_object_require_non_nulls.java:7)
  1. Pesan error lebih jelas ditambah dengan pesa costume yang dibuat.

Building String

Terkadang, kita butuh untuk membuat string dari banyak string pendek lainnya, seperti keystrokes atau kalimat dari sebuah file. Pembuatan string dari gabungan string yang pendek2 tersebut sangat tidak efesien jika kita menggunakan string concatenation (menggunakan + operator). Karena, setiap kita concatenate sebuah string, String objek baru akan terbuat dan karena itu akan lebih memakan waktu dan menghabis memeory. Maka dari itu, penggunakan class StringBuilder untuk menghindari pemborosan tersebut.

Secara umum dalam membuat String menggunakan StringBuilder adalah; 1. Membuat isntance dari class StringBuilder 2. Menambahkan kalimat-kalimat untuk menjadi String yang diinginkan 3. Mengkonversinya menjadi satu buah objek String. (konversi ke objek String)

Dibawah contoh kita membuat sebuah kalimat dari kumpulan-kumpulan string.

Code

package J3_6_Strings;

public class J_13_stringbuilder {
    public static void main(String[] args) {
        // Stringbuilder 1
        StringBuilder catatanKaki = new StringBuilder();
        catatanKaki.append("Ditulis oleh : Muhammad Farras Ma'ruf\n");
        catatanKaki.append("-".repeat(30));

        // Stringbuilder 2
        StringBuilder isiPesan = new StringBuilder(); // Inisiasi
        isiPesan.append("Bismillah. Dengan menyebut nama Allah\n");
        isiPesan.append("Suret ke : ");
        isiPesan.append(2); // append int
        isiPesan.append("\nBertakwalah kepada Allah, tuhan satu-satunya " +
                "yang berhak untuk disembah\n");

        // Append another instance StringBuilder
        isiPesan.append(catatanKaki);
        System.out.println(isiPesan.toString());
    }
}
Output
Bismillah. Dengan menyebut nama Allah
Suret ke : 2    
Bertakwalah kepada Allah, tuhan satu-satunya yang berhak untuk disembah
Ditulis oleh : Muhammad Farras Ma'ruf
------------------------------

Info

Selain StribgBuilder terdapat StringBuffer tidak se-efisein kawannya. Namun, StringBuffer dapat digunakan pada threads ganda untuk menambahkan atau menghapus karakter pada String. Jadi, jika perubahan String anda dilakukan pada single tread (umumnya seperti ini) sangat disarankan gunakan saja `#!java StringBilder. Pembahasan tentang thread insyaAllah akan ada saat catatan concurrency.

Text blocks

Pada java 15, Java memperkenalkan. Fitur ini lebih mudah digunakan dari pada string-literal. Karena, dengan menggunakan text blocks kita tidak perlu memikirkan escape code untuk tujuan tertentu, misal \n untuk membuat barus baru pada string literal.

Code

package J3_6_Strings;

public class J_14_text_blocks {
    public static void main(String[] args) {
        String kalimat = """
                Bismillah
                Apa kabar kalian ?
                """;
        System.out.println(kalimat);

        String kalimatDua = """
                Alhamdulillah \ 
                baik, kalau kamu ?
                """; //(1)!
        System.out.println(kalimatDua);
    }
}
  1. \ digunakan pada IDE untuk membuat baris baru namun tidak untuk compiler
Output
Bismillah
Apa kabar kalian ?