แม้ว่า Java จะพัฒนาขึ้นอยู่กับ C ++ แต่ก็มีการปรับปรุงข้อบกพร่องมากมายของ C ++ หนึ่งในสิ่งที่ต้องกล่าวถึงคือสตริง เรารู้ว่าด้วยการเรียนรู้ที่ลึกซึ้งยิ่งขึ้นเมื่อเข้าสู่ MFC เมื่อประมวลผลสตริงหรืออักขระคุณมักจะต้องใช้แมโคร _t () เพื่อเปลี่ยนอักขระหรือสตริงเป็นประเภท Unicode มิฉะนั้นข้อผิดพลาดจะเกิดขึ้นระหว่างการประมวลผล ใน Java ตัวละครตัวละครหรือตัวละครที่เก็บไว้ในคลาสอักขระนั้นไม่ใช่ไบต์ แต่ 2 ไบต์ UNICODE ใช้ซึ่งเป็นเพื่อสนับสนุนตัวละครทั้งหมดในโลก
ลำดับของอักขระก่อตัวเป็นสตริงและมีสองประเภทของสตริง: หนึ่งคือค่าคงที่สตริงที่ไม่จำเป็นต้องแก้ไขหลังจากการสร้างซึ่งเรียกว่าค่าคงที่สตริง ใน Java มันถูกเก็บไว้โดยใช้คลาสสตริง
หนึ่งคือตัวแปรสตริงที่ต้องแก้ไขหลังจากการสร้างเรียกว่าตัวแปรสตริง ใน Java มันดำเนินการและจัดการโดยใช้คลาส StringBuffer
คลาส StringBuffer
1. สร้างวัตถุคลาส StringBuffer
วัตถุคลาส StringBuffer แสดงถึงตัวแปรสตริง (โปรดทราบว่าเป็น "ตัวแปร") แต่ละวัตถุคลาส StringBuffer เป็นตัวแปรสตริงที่สามารถขยายและแก้ไขได้ ต่อไปนี้เป็นตัวสร้างคลาส StringBuffer ที่ใช้กันทั่วไป:
(1) Public Stringbuffer ()
สร้างวัตถุว่างเปล่าใหม่ของคลาส StringBuffer โดยมีค่าเริ่มต้นของความจุที่ตั้งไว้ที่ 16 อักขระ (โปรดทราบว่าเป็น 16 อักขระ)
(2) Public Stringbuffer (ความยาว int)
สร้างวัตถุ StringBuffer ว่างเปล่าใหม่ซึ่งค่าเริ่มต้นความจุถูกตั้งค่าเป็นอักขระความยาว
(3) Public StringBuffer (String Str)
สร้างวัตถุ StringBuffer ใหม่ซึ่งมีเนื้อหาเป็นเนื้อหาของ STR และความจุถูกตั้งค่าเป็นความยาวของ STR และเพิ่ม 16 อักขระ (หมายเหตุ: เพิ่ม 16 อักขระ)
2. วิธีการทั่วไปของวัตถุคลาส StringBuffer
(1) ส่วนขยายของวัตถุคลาส StringBuffer
คลาส StringBuffer มีสองชุดของวิธีการขยายอักขระที่มีอยู่ในวัตถุ StringBuffer คือ:
1) ภาคผนวกสตริงสาธารณะสาธารณะ
(Object OBJ)
เมธอดภาคผนวกใช้เพื่อขยายอักขระที่มีอยู่ในวัตถุ StringBuffer หลังจากแปลงวัตถุพารามิเตอร์ที่ระบุเป็นสตริงจะต่อท้ายหลังจากวัตถุสตริงบัฟเฟอร์ดั้งเดิมและส่งคืนวัตถุสตริงบัฟเฟอร์ใหม่ วัตถุพารามิเตอร์เพิ่มเติมอาจเป็นประเภทข้อมูลที่หลากหลายเช่น int, char, char, string, double ฯลฯ
2) การแทรกสตริงสาธารณะสาธารณะ (
int แทรกตำแหน่งออฟเซ็ต, ประเภทวัตถุพารามิเตอร์, ชื่อวัตถุพารามิเตอร์)
วิธีนี้จะแปลงวัตถุพารามิเตอร์ที่ระบุเป็นสตริงแทรกที่ตำแหน่งที่ระบุในวัตถุสตริงบัฟเฟอร์ดั้งเดิมและส่งคืนวัตถุสตริงบัฟเฟอร์ใหม่
(2) ความยาวและความจุของวัตถุคลาส StringBuffer
ความยาวของวัตถุคลาสสตริงบัฟเฟอร์หมายถึงจำนวนอักขระที่มีอยู่ ความจุหมายถึงจำนวนพื้นที่อักขระที่จัดสรร
1) ความยาว int สาธารณะ ()
วิธีนี้ส่งคืนจำนวนอักขระที่มีอยู่ในวัตถุคลาส StringBuffer ปัจจุบัน
2) ความสามารถในการสาธารณะ ()
วิธีนี้ส่งคืนจำนวนพื้นที่อักขระที่จัดสรรโดยวัตถุคลาส StringBuffer ปัจจุบัน
(3) การปรับเปลี่ยนวัตถุคลาส StringBuffer
Public Void Setcharat (Intindex, Chearch)
วิธีนี้จะแทนที่อักขระที่ตำแหน่งดัชนีในวัตถุสตริงบัฟเฟอร์ปัจจุบันด้วยอักขระที่ระบุ CH
(4) การมอบหมายและการเพิ่มสตริง
สตริงเป็นชนิดข้อมูลที่มักใช้ในโปรแกรม การมอบหมายและการเพิ่มสตริงถูกนำมาใช้ในระบบการรวบรวม Java
(5) วิธีอื่น ๆ คล้ายกับของคลาสสตริง
3. ใช้คลาส StringTokenizer เพื่อสลายสตริง
คลาส StringTokenizer ตั้งอยู่ในแพ็คเกจ Java.util และเมื่อใช้คลาสนี้จะถูกเพิ่มที่จุดเริ่มต้นของโปรแกรม
importJava.util.stringTokenizer หรือ
importJava.util.*
คลาส StringTokenizer
สำหรับคลาส StringTokenizer ฟังก์ชั่นหลักของมันคือการแยกสตริงตามอักขระแยกที่กำหนดและฟังก์ชั่นของมันคล้ายกับวิธีการแยกของคลาสสตริง
1. ตัวสร้างของคลาส StringTokenizer
(1) StringTokenizer (StringSTR)
สร้างวัตถุ StringTokenizer สำหรับ String Str ที่กำหนดซึ่งมีตัวคั่นถูกตั้งค่าเป็น "/t/n/r/f" นั่นคือ: พื้นที่, แท็บแนวนอน, ตัวแบ่งบรรทัด, การคืนรถ, ตัวอักษรตาราง, อักขระตารางอักขระ
(2) StringTokenizer (String Str, String Delim)
สร้างวัตถุ StringTokenizer สำหรับ String Str ที่กำหนดซึ่งมีตัวคั่นเป็นตัวคั่นสตริงที่ระบุและไม่มีตัวคั่นตามค่าเริ่มต้น
3) StringTokenizer (String Str, String Delim, Boolean returnDelims)
สร้างวัตถุ StringTokenizer สำหรับสตริง Str ที่กำหนดซึ่งมีตัวคั่นเป็นตัวคั่นสตริงที่ระบุ หาก returnDelims เป็นจริงแต่ละสตริงในวัตถุ StringTokenizer ที่สร้างขึ้นจะมีตัวคั่นมิฉะนั้นจะไม่มีตัวคั่น
2. วิธีการทั่วไปของคลาส StringTokenizer
nintcounttokens ()
ส่งคืนจำนวนของย่อยในวัตถุ StringTokenizer หลังจากถูกแยก
nbooleanhasmorelements ()
ฟังก์ชั่นของวิธีนี้เหมือนกับวิธี Hasmoretokens ()
Nbooleanhasmoretokens ()
ตรวจพบว่าวัตถุ StringTokenizer มีสายย่อยที่แบ่งออกหรือไม่ ถ้าเป็นเช่นนั้นมันจะส่งคืนจริงมิฉะนั้นมันจะกลับเท็จ
ObjectNextElement ()
วิธีนี้มีฟังก์ชั่นเดียวกับ NextToken () ความแตกต่างที่สำคัญคือมันส่งคืนไม่ใช่วัตถุสตริง แต่เป็นวัตถุวัตถุ
StringNextToken ()
ส่งคืนสายย่อยแยกถัดไปในวัตถุ StringTokenizer
StringNextToken (String Delim)
ส่งคืนสายย่อยแยกถัดไปในวัตถุ StringTokenizer แต่ตัวคั่นจะถูกรีเซ็ตเป็น Delim
ความจริงในบางภาษาในภาษาการเขียนโปรแกรมเช่น C สตริงประกอบด้วยอาร์เรย์อักขระและส่วนท้ายของแต่ละสตริงจะถูกทำเครื่องหมาย "/0" แต่นี่ไม่ใช่กรณีใน Java
nin java, สตริงมักจะมีอยู่เป็นวัตถุของคลาสสตริงเช่น: strings = "ฉันชอบ Java!" ที่ "ฉันชอบ Java!" เป็นวัตถุ
ดังนั้นสตริงและอาร์เรย์ตัวละครในชวาจึงแตกต่างกันอย่างสิ้นเชิงและพวกเขาก็แตกต่างจากสตริงใน C!
nin คำสั่งเพื่ออำนวยความสะดวกในการแปลงสตริงและอาร์เรย์อักขระตัวสร้างและวิธีการดังกล่าวจำนวนมากมีให้ในคลาสสตริง
n เช่นสตริงคอนสตรัคเตอร์ (ค่าถ่าน [])
n วิธีการ tochararray ()
ค่าวิธีการ (ข้อมูล char [])
สระว่ายน้ำคงที่
สำหรับค่าคงที่สตริงที่ปรากฏในโปรแกรมต้นทางเมื่อโปรแกรมทำงานพวกเขาจะถูกบันทึกลงในพูลคงที่สำหรับแคช
การเปรียบเทียบตัวแปรที่อ้างอิงสตริงเหล่านี้แคชในสระคงที่จะได้รับผลลัพธ์ที่ถูกต้องด้วย ==
อย่างไรก็ตามที่รันไทม์การดำเนินการต่าง ๆ เกี่ยวกับสตริงเช่น +, substring ฯลฯ จะสร้างวัตถุสตริงใหม่
แต่คอมไพเลอร์ที่ทรงพลังจะเพิ่มประสิทธิภาพการเย็บของค่าคงที่สตริงเช่นเมื่อ S3 = "Hell" + "O", S3 จะยังคงชี้ไปที่สตริงในพูลคงที่ อย่างไรก็ตามสำหรับการทำงานของตัวแปรมันเป็นไปไม่ได้ที่จะต้องใช้เครื่องเสมือนเพื่อดำเนินการเช่น S1 + S2 และเพื่อตรวจสอบว่าผลลัพธ์มีอยู่แล้วในสระคงที่หรือไม่ ดังนั้นให้ใช้เท่ากับแทนที่จะเป็น == เพื่อตรวจสอบว่าสองสายเท่ากันหรือไม่
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// ค่าคงที่สตริงจะถูกใส่ในพูลคงที่ สตริง s1 = "สวัสดี"; สตริง s2 = "สวัสดี"; String S3 = "Hell" + "O"; System.out.println (S1 == S2); System.out.println (S1 == S3); // การดำเนินการเช่น +, substring บนสตริงสร้างใหม่ สตริง s4 = "นรก"; String S5 = S4 + "O"; System.out.println (S1 == S5); System.out.println (s1.equals (S5)); // substring มีด้ามจับพิเศษเกี่ยวกับสตริงย่อย (0) สตริง S6 = S1.SubString (0); System.out.println (S1 == S6); -ทดสอบ bytecodes ของ S1, S2, S3:
0: LDC #16; // สตริงสวัสดี
2: store_1
3: LDC #16; // สตริงสวัสดี
5: store_2
6: LDC #16; // สตริงสวัสดี
8: store_3
ทดสอบไบต์ของ S4 และ S5:
41: LDC #30; // สตริงนรก
43: เก็บ 4
45: ใหม่ #32; // คลาส java/lang/stringbuilder
48: DUP
49: Aload 4
51: Invokestatic #34; // วิธีการ java/lang/string.valueof: (ljava/lang/object;) ljava/lang/string;
54: Invokespecial #40; // วิธีการ java/lang/stringbuilder. "<init>" :( ljava/lang/string;) v
57: LDC #43; // สตริง o
59: invokevirtual #45; // วิธีการ java/lang/stringbuilder.append: (ljava/lang/string;) ljava/lang/stringbuilder;
62: invokevirtual #49; // วิธีการ java/lang/stringbuilder.toString :() ljava/lang/string;
โปรดทราบว่าวิธีการย่อยสตริงย่อย (0,3) เป็นสตริงที่ได้รับจากอักขระ 0 ถึง 2 เหตุผลสำหรับการออกแบบนี้อาจเป็นได้ง่ายในการคำนวณความยาวของสตริงย่อย 3-0 = 3 ในเวลาเดียวกัน Substring มีการประมวลผลการเพิ่มประสิทธิภาพพิเศษสำหรับพารามิเตอร์พิเศษ:
สตริงย่อยสาธารณะ (int beginindex, int endindex) {ถ้า (startIndex <0) {โยน stringIndExOutOfBoundSexception ใหม่ (engartIndex); } if (endindex> count) {โยน stringIndExOutOfBoundSexception ใหม่ (endindex); } if (beginindex> endIndex) {โยน stringIndExouToFBoundSexception ใหม่ (EndIndex - bENGININDEX); } return ((enginindex == 0) && (endindex == นับ))? สิ่งนี้: สตริงใหม่ (ออฟเซ็ต + entalindex, endindex - startIndex, ค่า); - จากนี้เราจะเห็นได้ว่าไม่มีอะไรเวทมนตร์ที่อยู่เบื้องหลังวัตถุสตริงและการมีความเข้าใจเกี่ยวกับไบต์บางอย่างสามารถเข้าใจได้ดีขึ้น
ในความเป็นจริงข้อมูลจำนวนมากเกี่ยวกับคลาสและวิธีการจะถูกเก็บไว้ในกลุ่มคงที่เช่นชื่อแพ็คเกจชื่อคลาสลายเซ็นวิธี ฯลฯ หากคุณสนใจคุณสามารถทำการวิจัยเชิงลึกได้