ตัวอย่างการบรรยายพร้อมผู้ให้คำปรึกษาซึ่งเป็นส่วนหนึ่งของหลักสูตร Codegym University ลงทะเบียนสำหรับหลักสูตรเต็ม


"สวัสดี Amigo! วันนี้เราจะวิเคราะห์สถานการณ์ทั่วไปที่เกี่ยวข้องกับการทำงานกับสตริง ตัวอย่างเช่น คุณรู้วิธีแยกสตริงออกเป็นหลายส่วนหรือไม่"

"ฉันจะไม่บอกคุณทันที Ellie แต่คุณกำลังจะบอกฉันใช่ไหม"

split()วิธี

"มีหลายวิธีในการทำเช่นนี้ วิธีแรกในการแยกสตริงออกเป็นหลายส่วนคือการใช้เมธอดsplit()ต้องส่งนิพจน์ทั่วไปที่กำหนดสตริงคั่นพิเศษเป็นพารามิเตอร์ คุณจะได้เรียนรู้ว่านิพจน์ทั่วไปคืออะไร ภารกิจJava Collections

ตัวอย่าง:

รหัส ผลลัพธ์
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
ผลลัพธ์จะเป็นอาร์เรย์ของสามสตริง:
["Good ", "ws everyo", "!"]

ง่าย แต่บางครั้งวิธีนี้ก็มากเกินไป หากมีตัวคั่นจำนวนมาก (เช่น ช่องว่าง อักขระขึ้นบรรทัดใหม่ แท็บ จุด) คุณต้องสร้างนิพจน์ทั่วไปที่ค่อนข้างซับซ้อน"

"แน่นอน และถ้าอ่านยาก การเปลี่ยนแปลงก็ยาก

StringTokenizerระดับ

ตัวอย่างการบรรยายพร้อมผู้ให้คำปรึกษาซึ่งเป็นส่วนหนึ่งของหลักสูตร Codegym University ลงทะเบียนสำหรับหลักสูตรเต็ม


"Java มีคลาสพิเศษที่มีหน้าที่ทั้งหมดในการแยกสตริงออกเป็นสตริงย่อย

"คลาสนี้ไม่ได้ใช้นิพจน์ทั่วไป แต่คุณแค่ส่งสตริงที่ประกอบด้วยตัวคั่น ข้อดีของวิธีนี้คือมันไม่ได้แบ่งสตริงทั้งหมดออกเป็นชิ้นๆ ทั้งหมดในคราวเดียว แต่จะย้ายตั้งแต่ต้นจนจบ ทีละขั้นตอน

คลาสมีตัวสร้างและสองวิธี เราส่งตัวสร้างสตริงที่เราแบ่งออกเป็นส่วน ๆ และสตริงที่ประกอบด้วยชุดของอักขระที่ใช้คั่น

วิธีการ คำอธิบาย
String nextToken()
ส่งกลับสตริงย่อยถัดไป
boolean hasMoreTokens()
ตรวจสอบว่ามีสตริงย่อยเพิ่มเติมหรือไม่

"คลาสนี้ทำให้ฉันนึกถึงคลาส Scanner ซึ่งมีnextLine()และhashNextLine()เมธอด ด้วย

"นั่นเป็นข้อสังเกตที่ดีที่คุณทำ คุณสามารถสร้างStringTokenizerวัตถุด้วยคำสั่งนี้:

StringTokenizer name = new StringTokenizer(string, delimiters);

โดยที่สตริงคือสตริงที่จะแบ่งออกเป็นส่วนๆ และตัวคั่นคือสตริง และอักขระแต่ละตัวในนั้นถือเป็นตัวคั่น ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
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
!

"โปรดทราบว่าอักขระแต่ละตัวในสตริงที่ส่งผ่านในสตริงที่สองไปยังStringTokenizerตัวสร้างจะถือเป็นตัวคั่น

String.format()วิธีการและStringFormatterคลาส

"อีกวิธีที่น่าสนใจของคลาส String คือformat().

"สมมติว่าคุณมีตัวแปรหลายตัวที่เก็บข้อมูล คุณจะแสดงมันบนหน้าจอในบรรทัดเดียวได้อย่างไร ตัวอย่างเช่น เรามีข้อมูลบางส่วน (คอลัมน์ซ้าย) และผลลัพธ์ที่ต้องการ (คอลัมน์ขวา):

รหัส เอาต์พุตคอนโซล
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

รหัสสำหรับโปรแกรมดังกล่าวจะมีลักษณะดังนี้:

รหัสโปรแกรม
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.}");

"คุณจะเห็นด้วยกับฉันว่าโค้ดไม่สามารถอ่านได้มากนัก และถ้าชื่อตัวแปรยาวกว่านี้ โค้ดก็จะยิ่งยากขึ้น:

รหัสโปรแกรม
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.}");

"ใช่ มันอ่านยาก!"

"อย่ากังวล นี่เป็นสถานการณ์ทั่วไปในโปรแกรมในโลกแห่งความเป็นจริง ดังนั้นฉันจึงอยากบอกคุณเกี่ยวกับวิธีเขียนโค้ดนี้ให้เรียบง่ายและรัดกุมยิ่งขึ้น

String.format

" Stringคลาสมีformat()เมธอดแบบสแตติก: มันให้คุณระบุรูปแบบสำหรับการประกอบสตริงกับข้อมูล ลักษณะทั่วไปของคำสั่งมีดังนี้:

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

ตัวอย่าง:

รหัส ผลลัพธ์
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()พารามิเตอร์ตัวแรกของเมธอดคือสตริงรูปแบบที่มีข้อความที่ต้องการทั้งหมดพร้อมกับอักขระพิเศษที่เรียกว่าตัวระบุรูปแบบ (เช่น%dและ%s) ในตำแหน่งที่คุณต้องการแทรกข้อมูล

" format()เมธอดจะแทนที่สิ่งเหล่านี้%sและ%dตัวระบุรูปแบบด้วยพารามิเตอร์ที่ตามหลังสตริงรูปแบบในรายการพารามิเตอร์ ถ้าเราต้องการแทรกสตริง เราก็เขียน%sถ้าเราต้องการแทรกตัวเลข ตัวระบุรูปแบบคือ%dตัวอย่าง:

รหัส ผลลัพธ์
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
sเท่ากับ"a=1, b=4, c=3"

"นี่คือรายการสั้น ๆ ของตัวระบุรูปแบบที่สามารถใช้ภายในสตริงรูปแบบ:

ตัวระบุ ความหมาย
%s
String
%d
ตัวคั่น: byte, short, int,long
%f
จำนวนจริง: float,double
%b
boolean
%c
char
%t
Date
%%
%อักขระ

"ตัวระบุเหล่านี้ระบุประเภทของข้อมูล แต่ก็มีตัวระบุที่ระบุลำดับของข้อมูลด้วย ในการรับอาร์กิวเมนต์ด้วยตัวเลข (การนับเริ่มจากหนึ่ง) คุณต้องเขียน " % 1$ d " แทน " %d " ตัวอย่าง:

รหัส ผลลัพธ์
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
sเท่ากับ"a=13, b=12, c=11"

%3$dจะได้อาร์กิวเมนต์ตัวที่ 3 %2$dจะได้อาร์กิวเมนต์ตัวที่สอง และ%dจะได้อาร์กิวเมนต์ตัวแรก ตัว ระบุรูปแบบ %sและ%dอ้างถึงอาร์กิวเมนต์โดยไม่คำนึงถึงตัวระบุเช่น%3$dหรือ%2$s

สระสตริง

"ทุกสตริงที่ระบุในโค้ดเป็นสตริงลิเทอรัลจะถูกจัดเก็บไว้ในพื้นที่หน่วยความจำที่เรียกว่าStringPoolขณะที่โปรแกรมกำลังทำงานStringPoolเป็นอาร์เรย์พิเศษสำหรับจัดเก็บสตริง จุดประสงค์คือเพื่อเพิ่มประสิทธิภาพการจัดเก็บสตริง:

"อย่างแรก สตริงที่ระบุในโค้ดต้องเก็บไว้ที่ใดที่หนึ่ง ใช่ไหม โค้ดประกอบด้วยคำสั่ง แต่ข้อมูล (โดยเฉพาะ สตริงขนาดใหญ่) จะต้องจัดเก็บไว้ในหน่วยความจำแยกต่างหากจากโค้ด การอ้างอิงถึงวัตถุสตริงเท่านั้นที่ปรากฏในโค้ด

"ประการที่สอง สตริงลิเทอรัลที่เหมือนกันทั้งหมดต้องเก็บไว้ในหน่วยความจำเพียงครั้งเดียว และนั่นคือวิธีการทำงาน เมื่อโค้ดคลาสของคุณถูกโหลดโดยเครื่อง Java สตริงลิเทอรัลทั้งหมดจะถูกเพิ่มไปยัง ถ้ายังไม่มี ถ้าพวกมันมีอยู่StringPoolแล้ว อยู่แล้ว จากนั้นเราก็ใช้การอ้างอิงสตริงจากไฟล์StringPool.

ดังนั้น หากคุณกำหนดตัวอักษรเดียวกันให้กับตัวแปรสตริงหลายตัวในโค้ดของคุณ ตัวแปรเหล่านี้ก็จะมีการอ้างอิงเดียวกัน ตัวอักษรจะถูกเพิ่มStringPoolเพียงครั้งเดียว ในกรณีอื่นๆ โค้ดจะได้รับการอ้างอิงถึงสตริงที่โหลดไว้แล้วในไฟล์StringPool.

นี่คือวิธีการทำงานโดยประมาณ:

รหัส การทำงานกับ StringPoll
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

"นั่นคือเหตุผลที่ ตัวแปร aและbจะเก็บข้อมูลอ้างอิงเดียวกัน"

“ฉันหวังว่าฉันจะเข้าใจถูกต้องทั้งหมด

intern()วิธี.

"และส่วนที่ดีที่สุดคือคุณสามารถเพิ่มสตริงใด ๆ ลงในStringPool. ​​ในการทำเช่นนี้คุณเพียงแค่ต้องเรียกใช้Stringเมธอดของintern()ตัวแปร

" intern()เมธอดจะเพิ่มสตริงไปที่StringPoolถ้ายังไม่มี และจะคืนค่าอ้างอิงไปยังสตริงในไฟล์StringPool.

"และจะเกิดอะไรขึ้นหากมีการเพิ่มสตริงที่เหมือนกันสองสตริงในStringPoolการใช้intern()วิธีนี้"

"เมธอดจะคืนค่าอ้างอิงเดียวกัน สามารถใช้เปรียบเทียบสตริงตามการอ้างอิงได้ ตัวอย่าง:

รหัส บันทึก
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

คุณไม่น่าจะใช้วิธีนี้บ่อยนัก อย่างที่บอกว่าคนชอบถามเรื่องนี้ในการสัมภาษณ์งาน

"ดังนั้น รู้เรื่องนี้ดีกว่าไม่รู้ ขอบคุณ เอลลี่!"