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
Substring
Kita dapat mengambil sebagian kalimat dari string yang panjang pada class String menggunakan method substring()
.
Substring
Concatenation
Java, like most programming languages, allows you to use (concatenate) two strings. + to jo
Concate using pluss operator +
Ketika kita menggabungkan sebuah kalimat dengan nilai yang bukan bertipe String, maka java akan mengkonversinya kedalam string.
Convertion when concatenating values
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
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");
}
}
}
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
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
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
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
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
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");
}
}
- Tempat timbulnya null pointer exception
- Menguji
length
terlabih dahulu dibandingkan menguji null
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"));
}
}
- Import
java.util.Objects
untuk menggunakan methodrequireNonNull
- Menspesifikasikan pesan error dan variable mana yang tidak boleh menampung nilai Null.
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)
- 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());
}
}
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);
}
}
\
digunakan pada IDE untuk membuat baris baru namun tidak untuk compiler