1. StringTokenizerkelas

Dan sekarang beberapa skenario umum yang melibatkan bekerja dengan string. Bagaimana Anda membagi string menjadi beberapa bagian? Ada beberapa cara untuk melakukan ini.

split()metode

Cara pertama untuk membagi sebuah string menjadi beberapa bagian adalah dengan menggunakan split()metode tersebut. Ekspresi reguler yang mendefinisikan string pembatas khusus harus diteruskan sebagai argumen. Anda akan mempelajari ekspresi reguler dalam pencarian Java Multithreading .

Contoh:

Kode Hasil
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Hasilnya akan menjadi array dari tiga string:
["Good ", "ws everyo", "!"]

Sederhana, tetapi terkadang pendekatan ini berlebihan. Jika ada banyak pembatas (misalnya spasi, karakter baris baru, tab, titik), maka Anda harus membuat ekspresi reguler yang agak rumit. Sulit untuk dibaca dan karena itu sulit untuk dimodifikasi.

StringTokenizerkelas

Java memiliki kelas khusus yang tugasnya adalah membagi string menjadi substring.

Kelas ini tidak menggunakan ekspresi reguler: sebagai gantinya, Anda cukup meneruskan string yang terdiri dari pembatas. Keuntungan dari pendekatan ini adalah tidak memecah seluruh string menjadi potongan-potongan sekaligus, melainkan bergerak dari awal hingga akhir langkah demi langkah.

Kelas memiliki konstruktor dan dua metode penting. Kami meneruskan konstruktor string yang kami pisahkan menjadi beberapa bagian, dan string yang terdiri dari sekumpulan karakter pembatas.

Metode Keterangan
String nextToken()
Mengembalikan substring berikutnya
boolean hasMoreTokens()
Memeriksa apakah ada lebih banyak substring.

Kelas ini entah bagaimana mengingatkan pada kelas Pemindai, yang juga memiliki nextLine()dan hasNextLine()metode.

Anda dapat membuat StringTokenizerobjek dengan perintah ini:

StringTokenizer name = new StringTokenizer(string, delimiters);

Di mana stringstring harus dibagi menjadi beberapa bagian. And delimitersadalah sebuah string, dan setiap karakter di dalamnya diperlakukan sebagai pembatas. Contoh:

Kode Keluaran konsol
String str = "Good news everyone!";

StringTokenizer tokenizer = new StringTokenizer(str,"ne");
while (tokenizer.hasMoreTokens())
{
   String token = tokenizer.nextToken();
   System.out.println(token);
}
Good 
ws 
v
ryo
!

Perhatikan bahwa setiap karakter dalam string yang diteruskan sebagai string kedua ke StringTokenizerkonstruktor dianggap sebagai pemisah.



2. String.format()metode dan StringFormatterkelas

Metode lain yang menarik dari kelas String adalah format().

Katakanlah Anda memiliki berbagai variabel yang menyimpan data. Bagaimana Anda menampilkannya di layar dalam satu baris? Misalnya, kami memiliki beberapa data (kolom kiri) dan keluaran yang diinginkan (kolom kanan):

Kode Keluaran konsol
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

Kode Anda mungkin akan terlihat seperti ini:

Kode program
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + name + ", age:" + age + " years, friend: " + friend+", weight: " + weight + " kg.}");

Kode seperti itu tidak terlalu mudah dibaca. Dan jika nama variabelnya lebih panjang, maka kodenya akan menjadi lebih sulit:

Kode program

class User {
    ......
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public List<String> getFriends() {
        return friends;
    }

    public ExtraInformation getExtraInformation() {
        return extraInformation;
    }
}

User user = new User();

System.out.println("User = {name: " + user.getName() + ", age:" + user.getAge() + " years, friend: " + user.getFriends().get(0) + ", weight: " + user.getExtraInformation().getWeight() + " kg.}");

Sangat tidak enak dibaca, bukan?

Tapi ini adalah situasi umum dalam program dunia nyata, jadi saya ingin memberi tahu Anda tentang cara menulis kode ini dengan lebih sederhana dan ringkas.

String.format

Kelas String memiliki format()metode statis: ini memungkinkan Anda menentukan pola untuk menyusun string dengan data. Tampilan umum dari perintah tersebut adalah sebagai berikut:

String name = String.format(pattern, parameters);

Contoh:

Kode Hasil
String.format("Age=%d, Name=%s", age, name);
Age=12, Name=Amigo
String.format("Width=%d, Height=%d", width, height);
Width=20, Height=10
String.format("Fullname=%s", name);
Fullname=Diego

Parameter pertama metode ini format()adalah string format yang berisi semua teks yang diinginkan bersama dengan karakter khusus yang disebut penentu format (seperti %ddan %s) di tempat Anda perlu memasukkan data.

Metode format()menggantikan penentu format %sdan ini %ddengan parameter yang mengikuti string format dalam daftar parameter. Jika kita ingin menyisipkan string, maka kita menulis %s. Jika kita ingin memasukkan angka, maka penentu formatnya adalah %d. Contoh:

Kode Hasil
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
sadalah sama dengan"a=1, b=4, c=3"

Berikut adalah daftar singkat penentu format yang dapat digunakan di dalam string format:

Penentu Arti
%s
String
%d
interger: byte, short, int,long
%f
bilangan asli: float,double
%b
boolean
%c
char
%t
Date
%%
%karakter

Penspesifikasi ini menunjukkan tipe data, tetapi ada juga penspesifikasi yang menunjukkan urutan data. Untuk mendapatkan argumen berdasarkan nomornya (penomoran dimulai dari satu), Anda perlu menulis " " alih-alih " ". Contoh:%1$d%d

Kode Hasil
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
sadalah sama dengan"a=13, b=12, c=11"

%3$dakan mendapatkan argumen ke-3, %2$dakan mendapatkan argumen kedua, dan %dakan mendapatkan argumen pertama. Penspesifikasi format %sdan %dmengacu pada argumen terlepas dari penspesifikasi seperti %3$datau%2$s



3. Kolam Tali

Setiap string yang ditentukan dalam kode sebagai string literal disimpan di area memori yang disebut saat StringPoolprogram sedang berjalan. StringPooladalah array khusus untuk menyimpan string. Tujuannya adalah untuk mengoptimalkan penyimpanan string:

Pertama, string yang ditentukan dalam kode harus disimpan di suatu tempat, bukan? Kode terdiri dari perintah, tetapi data (terutama string besar) harus disimpan dalam memori secara terpisah dari kode. Hanya referensi ke objek string yang muncul dalam kode.

Kedua, semua literal string yang identik harus disimpan dalam memori hanya sekali. Dan begitulah cara kerjanya. Saat kode kelas Anda dimuat oleh mesin Java, semua literal string ditambahkan ke StringPooljika belum ada. Jika sudah ada, maka kita cukup menggunakan referensi string dari file StringPool.

Oleh karena itu, jika Anda menetapkan literal yang sama ke beberapa Stringvariabel dalam kode Anda, variabel ini akan berisi referensi yang sama. Sebuah literal akan ditambahkan StringPoolhanya sekali. Dalam semua kasus lainnya, kode akan mendapatkan referensi ke string yang sudah dimuat di file StringPool.

Berikut kira-kira cara kerjanya:

Kode Bekerja dengan StringPool
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

Itu sebabnya variabel adan bakan menyimpan referensi yang sama.

intern()metode

Dan bagian terbaiknya adalah Anda dapat secara terprogram menambahkan string apa pun ke file StringPool. Untuk melakukan ini, Anda hanya perlu memanggil metode Stringvariabel intern().

Metode ini intern()akan menambahkan string ke StringPooljika belum ada, dan akan mengembalikan referensi ke string di StringPool.

Jika dua string identik ditambahkan ke metode StringPoolusing intern(), metode tersebut mengembalikan referensi yang sama. Ini dapat digunakan untuk membandingkan string dengan referensi. Contoh:

Kode Catatan
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b);


false
String a = new String("Hello");
String b = new String("Hello");

String t1 = a.intern();
String t2 = b.intern();
System.out.println(a == b);
System.out.println(t1 == t2);





false
true

Anda mungkin tidak sering menggunakan metode ini, tetapi orang senang menanyakannya dalam wawancara . Jadi lebih baik mengetahuinya daripada tidak mengetahuinya.