ตัวอย่างการบรรยายพร้อมผู้ให้คำปรึกษาซึ่งเป็นส่วนหนึ่งของหลักสูตร Codegym University ลงทะเบียนสำหรับหลักสูตรเต็ม
"สวัสดี Amigo! วันนี้เราจะวิเคราะห์สถานการณ์ทั่วไปที่เกี่ยวข้องกับการทำงานกับสตริง ตัวอย่างเช่น คุณรู้วิธีแยกสตริงออกเป็นหลายส่วนหรือไม่"
"ฉันจะไม่บอกคุณทันที Ellie แต่คุณกำลังจะบอกฉันใช่ไหม"
split()
วิธี
"มีหลายวิธีในการทำเช่นนี้ วิธีแรกในการแยกสตริงออกเป็นหลายส่วนคือการใช้เมธอดsplit()
ต้องส่งนิพจน์ทั่วไปที่กำหนดสตริงคั่นพิเศษเป็นพารามิเตอร์ คุณจะได้เรียนรู้ว่านิพจน์ทั่วไปคืออะไร ภารกิจJava Collections
ตัวอย่าง:
รหัส | ผลลัพธ์ |
---|---|
|
ผลลัพธ์จะเป็นอาร์เรย์ของสามสตริง:
|
ง่าย แต่บางครั้งวิธีนี้ก็มากเกินไป หากมีตัวคั่นจำนวนมาก (เช่น ช่องว่าง อักขระขึ้นบรรทัดใหม่ แท็บ จุด) คุณต้องสร้างนิพจน์ทั่วไปที่ค่อนข้างซับซ้อน"
"แน่นอน และถ้าอ่านยาก การเปลี่ยนแปลงก็ยาก
StringTokenizer
ระดับ
ตัวอย่างการบรรยายพร้อมผู้ให้คำปรึกษาซึ่งเป็นส่วนหนึ่งของหลักสูตร Codegym University ลงทะเบียนสำหรับหลักสูตรเต็ม
"Java มีคลาสพิเศษที่มีหน้าที่ทั้งหมดในการแยกสตริงออกเป็นสตริงย่อย
"คลาสนี้ไม่ได้ใช้นิพจน์ทั่วไป แต่คุณแค่ส่งสตริงที่ประกอบด้วยตัวคั่น ข้อดีของวิธีนี้คือมันไม่ได้แบ่งสตริงทั้งหมดออกเป็นชิ้นๆ ทั้งหมดในคราวเดียว แต่จะย้ายตั้งแต่ต้นจนจบ ทีละขั้นตอน
คลาสมีตัวสร้างและสองวิธี เราส่งตัวสร้างสตริงที่เราแบ่งออกเป็นส่วน ๆ และสตริงที่ประกอบด้วยชุดของอักขระที่ใช้คั่น
วิธีการ | คำอธิบาย |
---|---|
|
ส่งกลับสตริงย่อยถัดไป |
|
ตรวจสอบว่ามีสตริงย่อยเพิ่มเติมหรือไม่ |
"คลาสนี้ทำให้ฉันนึกถึงคลาส Scanner ซึ่งมีnextLine()
และhashNextLine()
เมธอด ด้วย
"นั่นเป็นข้อสังเกตที่ดีที่คุณทำ คุณสามารถสร้างStringTokenizer
วัตถุด้วยคำสั่งนี้:
StringTokenizer name = new StringTokenizer(string, delimiters);
โดยที่สตริงคือสตริงที่จะแบ่งออกเป็นส่วนๆ และตัวคั่นคือสตริง และอักขระแต่ละตัวในนั้นถือเป็นตัวคั่น ตัวอย่าง:
รหัส | เอาต์พุตคอนโซล |
---|---|
|
|
"โปรดทราบว่าอักขระแต่ละตัวในสตริงที่ส่งผ่านในสตริงที่สองไปยังStringTokenizer
ตัวสร้างจะถือเป็นตัวคั่น
String.format()
วิธีการและStringFormatter
คลาส
"อีกวิธีที่น่าสนใจของคลาส String คือformat()
.
"สมมติว่าคุณมีตัวแปรหลายตัวที่เก็บข้อมูล คุณจะแสดงมันบนหน้าจอในบรรทัดเดียวได้อย่างไร ตัวอย่างเช่น เรามีข้อมูลบางส่วน (คอลัมน์ซ้าย) และผลลัพธ์ที่ต้องการ (คอลัมน์ขวา):
รหัส | เอาต์พุตคอนโซล |
---|---|
|
|
รหัสสำหรับโปรแกรมดังกล่าวจะมีลักษณะดังนี้:
รหัสโปรแกรม |
---|
|
"คุณจะเห็นด้วยกับฉันว่าโค้ดไม่สามารถอ่านได้มากนัก และถ้าชื่อตัวแปรยาวกว่านี้ โค้ดก็จะยิ่งยากขึ้น:
รหัสโปรแกรม |
---|
|
"ใช่ มันอ่านยาก!"
"อย่ากังวล นี่เป็นสถานการณ์ทั่วไปในโปรแกรมในโลกแห่งความเป็นจริง ดังนั้นฉันจึงอยากบอกคุณเกี่ยวกับวิธีเขียนโค้ดนี้ให้เรียบง่ายและรัดกุมยิ่งขึ้น
String.format
" String
คลาสมีformat()
เมธอดแบบสแตติก: มันให้คุณระบุรูปแบบสำหรับการประกอบสตริงกับข้อมูล ลักษณะทั่วไปของคำสั่งมีดังนี้:
String name = String.format(pattern, parameters);
ตัวอย่าง:
รหัส | ผลลัพธ์ |
---|---|
|
|
|
|
|
|
" format()
พารามิเตอร์ตัวแรกของเมธอดคือสตริงรูปแบบที่มีข้อความที่ต้องการทั้งหมดพร้อมกับอักขระพิเศษที่เรียกว่าตัวระบุรูปแบบ (เช่น%d
และ%s
) ในตำแหน่งที่คุณต้องการแทรกข้อมูล
" format()
เมธอดจะแทนที่สิ่งเหล่านี้%s
และ%d
ตัวระบุรูปแบบด้วยพารามิเตอร์ที่ตามหลังสตริงรูปแบบในรายการพารามิเตอร์ ถ้าเราต้องการแทรกสตริง เราก็เขียน%s
ถ้าเราต้องการแทรกตัวเลข ตัวระบุรูปแบบคือ%d
ตัวอย่าง:
รหัส | ผลลัพธ์ |
---|---|
|
s เท่ากับ"a=1, b=4, c=3" |
"นี่คือรายการสั้น ๆ ของตัวระบุรูปแบบที่สามารถใช้ภายในสตริงรูปแบบ:
ตัวระบุ | ความหมาย |
---|---|
|
String |
|
ตัวคั่น: byte , short , int ,long |
|
จำนวนจริง: float ,double |
|
boolean |
|
char |
|
Date |
|
% อักขระ |
"ตัวระบุเหล่านี้ระบุประเภทของข้อมูล แต่ก็มีตัวระบุที่ระบุลำดับของข้อมูลด้วย ในการรับอาร์กิวเมนต์ด้วยตัวเลข (การนับเริ่มจากหนึ่ง) คุณต้องเขียน " % 1$ d " แทน " %d " ตัวอย่าง:
รหัส | ผลลัพธ์ |
---|---|
|
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 |
---|---|
|
|
"นั่นคือเหตุผลที่ ตัวแปร a
และb
จะเก็บข้อมูลอ้างอิงเดียวกัน"
“ฉันหวังว่าฉันจะเข้าใจถูกต้องทั้งหมด
intern()
วิธี.
"และส่วนที่ดีที่สุดคือคุณสามารถเพิ่มสตริงใด ๆ ลงในStringPool
. ในการทำเช่นนี้คุณเพียงแค่ต้องเรียกใช้String
เมธอดของintern()
ตัวแปร
" intern()
เมธอดจะเพิ่มสตริงไปที่StringPool
ถ้ายังไม่มี และจะคืนค่าอ้างอิงไปยังสตริงในไฟล์StringPool
.
"และจะเกิดอะไรขึ้นหากมีการเพิ่มสตริงที่เหมือนกันสองสตริงในStringPool
การใช้intern()
วิธีนี้"
"เมธอดจะคืนค่าอ้างอิงเดียวกัน สามารถใช้เปรียบเทียบสตริงตามการอ้างอิงได้ ตัวอย่าง:
รหัส | บันทึก |
---|---|
|
|
|
|
คุณไม่น่าจะใช้วิธีนี้บ่อยนัก อย่างที่บอกว่าคนชอบถามเรื่องนี้ในการสัมภาษณ์งาน
"ดังนั้น รู้เรื่องนี้ดีกว่าไม่รู้ ขอบคุณ เอลลี่!"
GO TO FULL VERSION