1. StringTokenizer
ชั้นเรียน
และตอนนี้สถานการณ์ทั่วไปอีกเล็กน้อยที่เกี่ยวข้องกับการทำงานกับสตริง คุณจะแยกสตริงออกเป็นหลายส่วนได้อย่างไร มีหลายวิธีในการทำเช่นนี้
split()
วิธี
วิธีแรกในการแยกสตริงออกเป็นหลายส่วนคือการใช้split()
เมธอด นิพจน์ทั่วไปที่กำหนดสตริงการจำกัดพิเศษจะต้องผ่านเป็นอาร์กิวเมนต์ คุณจะได้เรียนรู้ว่า Regular Expression คืออะไรในภารกิจJava Multithreading
ตัวอย่าง:
รหัส | ผลลัพธ์ |
---|---|
|
ผลลัพธ์จะเป็นอาร์เรย์ของสามสตริง:
|
ง่าย แต่บางครั้งวิธีนี้ก็มากเกินไป หากมีตัวคั่นจำนวนมาก (เช่น ช่องว่าง อักขระขึ้นบรรทัดใหม่ แท็บ จุด) คุณต้องสร้างนิพจน์ทั่วไปที่ค่อนข้างซับซ้อน อ่านยากและดัดแปลงยาก
StringTokenizer
ระดับ
Java มีคลาสพิเศษที่มีหน้าที่ทั้งหมดในการแยกสตริงออกเป็นสตริงย่อย
คลาสนี้ไม่ได้ใช้นิพจน์ทั่วไป แต่คุณเพียงแค่ส่งสตริงที่ประกอบด้วยตัวคั่นแทน ข้อดีของวิธีนี้คือจะไม่ทำให้สตริงทั้งหมดแตกเป็นชิ้นๆ ในคราวเดียว แต่จะย้ายตั้งแต่ต้นจนจบทีละขั้นตอนแทน
คลาสนี้มีคอนสตรัคเตอร์และเมธอดสำคัญสองเมธอด เราส่งตัวสร้างสตริงที่เราแบ่งออกเป็นส่วน ๆ และสตริงที่ประกอบด้วยชุดของอักขระที่ใช้คั่น
วิธีการ | คำอธิบาย |
---|---|
|
ส่งกลับสตริงย่อยถัดไป |
|
ตรวจสอบว่ามีสตริงย่อยเพิ่มเติมหรือไม่ |
คลาสนี้ชวนให้นึกถึงคลาส Scanner ซึ่งมีnextLine()
และhashNextLine()
เมธอด ด้วย
คุณสามารถสร้างStringTokenizer
วัตถุด้วยคำสั่งนี้:
StringTokenizer name = new StringTokenizer(string, delimiters);
string
สตริงที่จะแบ่งออกเป็นส่วน ๆ อยู่ที่ไหน และdelimiters
เป็นสตริง และอักขระแต่ละตัวในนั้นถือเป็นตัวคั่น ตัวอย่าง:
รหัส | เอาต์พุตคอนโซล |
---|---|
|
|
โปรดทราบว่าอักขระแต่ละตัวในสตริงที่ส่งผ่านเป็นสตริงที่สองไปยังStringTokenizer
คอนสตรัคเตอร์ถือเป็นตัวคั่น
2. String.format()
วิธีการและStringFormatter
คลาส
อีกวิธีที่น่าสนใจของคลาส String format()
คือ
สมมติว่าคุณมีตัวแปรต่างๆ ที่เก็บข้อมูล คุณจะแสดงบนหน้าจอในบรรทัดเดียวได้อย่างไร ตัวอย่างเช่น เรามีข้อมูลบางส่วน (คอลัมน์ซ้าย) และเอาต์พุตที่ต้องการ (คอลัมน์ขวา):
รหัส | เอาต์พุตคอนโซล |
---|---|
|
|
รหัสของคุณอาจมีลักษณะดังนี้:
รหัสโปรแกรม |
---|
|
รหัสดังกล่าวไม่สามารถอ่านได้มากนัก และถ้าชื่อตัวแปรยาวกว่านี้ โค้ดก็จะยิ่งยากขึ้นไปอีก:
รหัสโปรแกรม |
---|
|
อ่านไม่ค่อยออกใช่ไหม
แต่นี่เป็นสถานการณ์ทั่วไปในโปรแกรมในโลกแห่งความเป็นจริง ดังนั้นฉันจึงอยากบอกคุณเกี่ยวกับวิธีเขียนโค้ดนี้ให้เรียบง่ายและรัดกุมยิ่งขึ้น
String.format
คลาสสตริงมี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
3. สระสตริง
ทุกสตริงที่ระบุในโค้ดเป็นสตริงลิเทอรัลจะถูกจัดเก็บไว้ในพื้นที่หน่วยความจำที่เรียกว่าStringPool
ขณะที่โปรแกรมกำลังทำงาน StringPool
เป็นอาร์เรย์พิเศษสำหรับจัดเก็บสตริง จุดประสงค์คือเพื่อเพิ่มประสิทธิภาพการจัดเก็บสตริง:
ขั้นแรก สตริงที่ระบุในโค้ดต้องเก็บไว้ที่ใดที่หนึ่งใช่ไหม รหัสประกอบด้วยคำสั่ง แต่ข้อมูล (โดยเฉพาะ สตริงขนาดใหญ่) จะต้องจัดเก็บไว้ในหน่วยความจำแยกจากรหัส การอ้างอิงถึงวัตถุสตริงเท่านั้นที่ปรากฏในรหัส
ประการที่สอง ตัวอักษรสตริงที่เหมือนกันทั้งหมดจะต้องเก็บไว้ในหน่วยความจำเพียงครั้งเดียว และนั่นเป็นเพียงวิธีการทำงาน เมื่อรหัสคลาสของคุณถูกโหลดโดยเครื่อง Java ตัวอักษรสตริงทั้งหมดจะถูกเพิ่มไปยัง the StringPool
หากยังไม่มี หากมีอยู่แล้ว เราก็ใช้การอ้างอิงสตริงจากไฟล์StringPool
.
ดังนั้น หากคุณกำหนดตัวอักษรเดียวกันให้กับString
ตัวแปรหลายตัวในโค้ดของคุณ ตัวแปรเหล่านี้ก็จะมีการอ้างอิงเดียวกัน ตัวอักษรจะถูกเพิ่มStringPool
เพียงครั้งเดียว ในกรณีอื่นๆ โค้ดจะได้รับการอ้างอิงถึงสตริงที่โหลดไว้แล้วในไฟล์StringPool
.
นี่คือวิธีการทำงานโดยประมาณ:
รหัส | การทำงานกับ StringPool |
---|---|
|
|
นั่นคือสาเหตุที่ ตัวแปร a
และb
จะเก็บข้อมูลอ้างอิงเดียวกัน
intern()
วิธี
และส่วนที่ดีที่สุดคือคุณสามารถเพิ่มสตริงใดๆ ลงในไฟล์StringPool
. ในการทำเช่นนี้ คุณเพียงแค่เรียกใช้String
เมธอดของintern()
ตัวแปร
เมธอดintern()
จะเพิ่มสตริงไปที่StringPool
ถ้ายังไม่มี และจะคืนค่าอ้างอิงไปยังสตริงในไฟล์StringPool
.
หากมีการเพิ่มสตริงที่เหมือนกันสองสตริง ใน StringPool
เมธอดintern()
เมธอดจะคืนค่าการอ้างอิงเดียวกัน สามารถใช้เพื่อเปรียบเทียบสตริงโดยการอ้างอิง ตัวอย่าง:
รหัส | บันทึก |
---|---|
|
|
|
|
คุณไม่ค่อยใช้วิธีนี้บ่อยนักแต่คนชอบถามเกี่ยวกับวิธีนี้ในการสัมภาษณ์ ดังนั้นจึงควรรู้ไว้ดีกว่าไม่รู้
GO TO FULL VERSION