Coretan kuliah dengan mentor sebagai sebahagian daripada kursus Universiti Codegym. Daftar untuk kursus penuh.


"Hai, Amigo! Hari ini kita akan menganalisis beberapa lagi senario biasa yang melibatkan kerja dengan rentetan. Contohnya, adakah anda tahu cara membahagikan rentetan kepada beberapa bahagian?"

"Saya tidak akan memberitahu awak dengan segera, Ellie. Tetapi awak akan memberitahu saya, kan?"

split()kaedah

"Terdapat beberapa cara untuk melakukan ini. Cara pertama untuk membahagikan rentetan kepada beberapa bahagian ialah menggunakan kaedah split(). Ungkapan biasa yang mentakrifkan rentetan pembatas khas mesti diluluskan sebagai parameter. Anda akan mempelajari apa yang terdapat dalam ungkapan biasa pencarian Java Collections .

Contoh:

Kod Hasilnya
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Hasilnya akan menjadi tatasusunan tiga rentetan:
["Good ", "ws everyo", "!"]

Mudah, tetapi kadang-kadang pendekatan ini berlebihan. Jika terdapat banyak pembatas (contohnya, ruang, aksara baris baharu, tab, noktah), maka anda perlu membina ungkapan biasa yang agak kompleks."

"Baiklah, pasti. Dan jika ia sukar dibaca, maka sukar untuk membuat perubahan.

StringTokenizerkelas

Coretan kuliah dengan mentor sebagai sebahagian daripada kursus Universiti Codegym. Daftar untuk kursus penuh.


"Java mempunyai kelas khas yang seluruh tugasnya adalah untuk memisahkan rentetan kepada subrentetan.

"Kelas ini tidak menggunakan ungkapan biasa: sebaliknya, anda hanya lulus dalam rentetan yang terdiri daripada pembatas. Kelebihan pendekatan ini ialah ia tidak memecahkan keseluruhan rentetan menjadi kepingan sekaligus, sebaliknya bergerak dari awal hingga akhir satu langkah demi satu.

Kelas mempunyai pembina dan dua kaedah. Kami menghantar pembina rentetan yang kami bahagikan kepada bahagian, dan rentetan yang terdiri daripada satu set aksara pembatas.

Kaedah Penerangan
String nextToken()
Mengembalikan subrentetan seterusnya
boolean hasMoreTokens()
Menyemak sama ada terdapat lebih banyak subrentetan.

"Kelas ini entah bagaimana mengingatkan saya kepada kelas Pengimbas, yang juga mempunyai nextLine()dan hashNextLine()kaedah.

"Itu pemerhatian yang baik yang anda buat. Anda boleh mencipta StringTokenizerobjek dengan arahan ini:

StringTokenizer name = new StringTokenizer(string, delimiters);

Di mana rentetan ialah rentetan yang akan dibahagikan kepada bahagian. Dan pembatas ialah rentetan, dan setiap aksara di dalamnya dianggap sebagai pembatas. Contoh:

Kod Output 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 bahawa setiap aksara dalam rentetan yang diluluskan dalam rentetan kedua kepada StringTokenizerpembina dianggap sebagai pemisah.

String.format()kaedah dan StringFormatterkelas

"Satu lagi kaedah menarik kelas String ialah format().

"Katakan anda mempunyai pelbagai pembolehubah yang menyimpan data. Bagaimanakah anda memaparkannya pada skrin dalam satu baris? Sebagai contoh, kami mempunyai beberapa data (lajur kiri) dan output yang dikehendaki (lajur kanan):

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

Kod untuk program sedemikian akan kelihatan seperti ini:

Kod 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.}");

"Anda akan bersetuju dengan saya bahawa kod itu tidak begitu mudah dibaca. Dan jika nama pembolehubah lebih panjang, maka kod itu akan menjadi lebih sukar:

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

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

"Ya, ia sukar dibaca!"

"Jangan risau. Ini adalah situasi biasa dalam program dunia sebenar, jadi saya ingin memberitahu anda tentang cara untuk menulis kod ini dengan lebih ringkas dan lebih ringkas.

String.format

" StringKelas mempunyai kaedah statik format(): ia membolehkan anda menentukan corak untuk memasang rentetan dengan data. Penampilan umum arahan adalah seperti berikut:

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

Contoh:

Kod Hasilnya
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

" format()Parameter pertama kaedah ialah rentetan format yang mengandungi semua teks yang dikehendaki bersama-sama dengan aksara khas yang dipanggil penentu format (seperti %ddan %s) di tempat yang anda perlukan untuk memasukkan data.

" format()Kaedah menggantikan penentu ini %sdan %dformat dengan parameter yang mengikuti rentetan format dalam senarai parameter. Jika kita ingin memasukkan rentetan, maka kita tulis . %sJika kita ingin memasukkan nombor, maka penentu format ialah %d. Contoh:

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

"Berikut ialah senarai pendek penentu format yang boleh digunakan dalam rentetan format:

Penentu Maknanya
%s
String
%d
interger: byte, short, int,long
%f
nombor nyata: float,double
%b
boolean
%c
char
%t
Date
%%
%watak

"Penentukan ini menunjukkan jenis data, tetapi terdapat juga penentu yang menunjukkan susunan data. Untuk mendapatkan hujah mengikut nombornya (penomboran bermula dari satu), anda perlu menulis " % 1$ d " dan bukannya " %d ". Contoh:

Kod Hasilnya
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 mendapat hujah ke-3, %2$dakan mendapat hujah kedua, dan %dakan mendapat hujah pertama. Penentu format %sdan %dmerujuk kepada hujah tanpa mengira penentu seperti %3$datau%2$s

Kolam Rentetan

"Setiap rentetan yang dinyatakan dalam kod sebagai literal rentetan disimpan dalam kawasan memori yang dipanggil semasa StringPoolprogram berjalan. StringPoolialah tatasusunan khas untuk menyimpan rentetan. Tujuannya adalah untuk mengoptimumkan storan rentetan:

"Pertama, rentetan yang dinyatakan dalam kod mesti disimpan di suatu tempat, bukan? Kod terdiri daripada arahan, tetapi data (terutamanya, rentetan besar) mesti disimpan dalam memori secara berasingan daripada kod. Hanya rujukan kepada objek rentetan muncul dalam kod.

"Kedua, semua literal rentetan yang sama mesti disimpan dalam ingatan sekali sahaja. Dan begitulah cara ia berfungsi. Apabila kod kelas anda dimuatkan oleh mesin Java, semua literal rentetan ditambahkan pada jika ia belum ada. Jika StringPoolia sudah ada, maka kita hanya menggunakan rujukan rentetan daripada StringPool.

Sehubungan itu, jika anda menetapkan literal yang sama kepada beberapa pembolehubah String dalam kod anda, maka pembolehubah ini akan mengandungi rujukan yang sama. Satu literal akan ditambahkan pada StringPoolsekali sahaja. Dalam semua kes lain, kod akan mendapat rujukan kepada rentetan yang telah dimuatkan dalam StringPool.

Inilah kira-kira cara ia berfungsi:

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

"Itulah sebabnya pembolehubah adan bakan menyimpan rujukan yang sama."

“Saya harap saya faham semuanya dengan betul.

intern()kaedah.

"Dan bahagian yang terbaik ialah anda boleh menambah sebarang rentetan secara pemrograman pada StringPool. Untuk melakukan ini, anda hanya perlu memanggil kaedah Stringpembolehubah intern().

" intern()Kaedah ini akan menambah rentetan kepada StringPooljika ia belum ada, dan akan mengembalikan rujukan kepada rentetan dalam fail StringPool.

"Dan apakah yang akan berlaku jika dua rentetan yang sama ditambah kepada kaedah StringPoolmenggunakan intern()?"

"Kaedah ini akan mengembalikan rujukan yang sama. Ini boleh digunakan untuk membandingkan rentetan melalui rujukan. Contoh:

Kod 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 tidak mungkin menggunakan kaedah ini dengan kerap. Yang berkata, orang suka bertanya mengenainya dalam temu duga kerja.

"Jadi, lebih baik mengetahuinya daripada tidak tahu. Terima kasih, Ellie!"