ฉันเคยเห็นการอภิปรายเกี่ยวกับการประกบสตริง Java และด้านอื่น ๆ บนอินเทอร์เน็ต ฉันเห็นนักพัฒนา Java บางคนในคำแนะนำของพวกเขาสำหรับโปรแกรมเมอร์มือใหม่ดังต่อไปนี้:
อย่าใช้เครื่องหมาย + ไปยังสายประกบใช้วิธีการผนวก () ของ StringBuffer หรือ StringBuilder กับ Strings Splice
อย่างไรก็ตามมันน่ารำคาญมากที่จะประกบกับสัญญาณ + ไม่มีอะไรดีเกี่ยวกับการใช้ + สัญญาณเพื่อประกบสาย?
โดยการค้นหาเนื้อหาเกี่ยวกับคลาสสตริงในเอกสาร Java API เราสามารถดูตัวอย่างต่อไปนี้:
"ภาษา Java ให้การสนับสนุนเป็นพิเศษสำหรับสัญลักษณ์การเชื่อมต่อสตริง ("+") และแปลงวัตถุอื่น ๆ เป็นสตริงการเชื่อมต่อสตริงจะถูกนำไปใช้ผ่านคลาส StringBuilder (หรือ StringBuffer)
ข้อความนี้บอกเราอย่างชัดเจนว่าใน Java การใช้ + Sign Splicing Strings ถูกนำมาใช้จริงโดย StringBuffer หรือ StringBuilder และวิธีการผนวก
นอกเหนือจากเอกสาร Java API แล้วเรายังสามารถใช้เครื่องมือเพื่อดูคำสั่ง bytecode ของไฟล์คลาสเพื่อรับคำตอบข้างต้น ตัวอย่างเช่นรหัส:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สตริง a = "สวัสดี"; สตริง b = "โลก"; string str = a + b + "!"; System.out.println (str);} คำสั่งที่จะดู bytecode ที่สอดคล้องกันผ่านเครื่องมือมีดังนี้:
จากคำสั่ง bytecode เราสามารถเห็นได้อย่างชัดเจนว่ารหัสต่อไปนี้ที่เราเขียน
string str = a + b + "!";
มันถูกแปลงเป็นคำสั่งคล้ายกับต่อไปนี้:
string str = new Stringbuilder (string.valueof (a)). ผนวก (b) .append ("!"). toString ();ไม่เพียงเท่านั้นคอมไพเลอร์ Java ยังเป็นคอมไพเลอร์ที่ค่อนข้างฉลาด เมื่อการประกบ + เครื่องหมายเป็นตัวอักษรสตริงทั้งหมดคอมไพเลอร์ Java จะแปลงเป็นสตริงที่สมบูรณ์ระหว่างการรวบรวม ตัวอย่างเช่น:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string str = "hello" + "โลก" + ", java!"; System.out.println (str);} คอมไพเลอร์ Java ได้ประกบสตริงชนิดนี้โดยตรงซึ่งเป็นตัวอักษรทั้งหมดและแปลงเป็นสตริงที่สมบูรณ์เมื่อรวบรวม
แม้ว่าจะมีตัวแปรในสตริงที่มีการประกบด้วยเครื่องหมาย + แต่คอมไพเลอร์ Java จะรวมตัวอักษรสตริงด้านหน้าเข้ากับหนึ่งสตริง
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string java = ", java!"; String str = "hello" + "World" + Java; System.out.println (str);}จากด้านบนจะเห็นได้ว่าสำหรับการดำเนินการเช่น string str = str1 + str2 + str3 + str4 ไม่มีปัญหาในการประกบหลายสตริงในครั้งเดียว
ใน Java วัตถุสตริงไม่เปลี่ยนรูป (ไม่เปลี่ยนรูป) ในรหัสคุณสามารถสร้างนามแฝงหลายรายการสำหรับวัตถุสตริงที่แน่นอน แต่การอ้างอิงของนามแฝงเหล่านี้เหมือนกัน
ตัวอย่างเช่น S1 และ S2 เป็นนามแฝงสำหรับวัตถุ "droidyue.com" และนามแฝงจะถูกเก็บไว้ในการอ้างอิงถึงวัตถุจริง ดังนั้น S1 = S2
String S1 = "Droidyue.com"; String S2 = S1; System.out.println ("S1 และ S2 มีการอ้างอิงเดียวกัน =" + (S1 == S2));และใน Java ตัวดำเนินการที่โอเวอร์โหลดเท่านั้นเกี่ยวข้องกับการประกบสตริง - นอกจากนั้นนักออกแบบ Java ไม่อนุญาตให้มีผู้ให้บริการรายอื่นมากเกินไป
ใน Java ตัวดำเนินการที่โอเวอร์โหลดเท่านั้นเกี่ยวข้องกับการประกบสตริง - นอกจากนั้นนักออกแบบ Java ไม่อนุญาตให้มีผู้ให้บริการรายอื่นมากเกินไป
อย่างที่เราทุกคนรู้ก่อน Java 1.4 การเย็บสตริงสามารถใช้เพื่อประกบสตริง เริ่มต้นจาก Java 1.5 เราสามารถใช้ StringBuilder เพื่อ Splice Strings ความแตกต่างที่สำคัญระหว่าง StringBuffer และ StringBuilder คือ StringBuffer คือ Thread-Safe และเหมาะสำหรับการทำงานแบบมัลติเธรดของสตริง StringBuilder เป็นเธรดที่ปลอดภัยและเหมาะสำหรับการใช้งานสตริงภายใต้เธรดเดียว อย่างไรก็ตามการเย็บสตริงของเราส่วนใหญ่ดำเนินการภายใต้เธรดเดียวดังนั้นการใช้ StringBuilder จะเป็นประโยชน์ต่อประสิทธิภาพ
ก่อน Java 1.4 คอมไพเลอร์ใช้ StringBuffer เพื่อจัดการสตริงด้วย + Sign Spliced Strings; เริ่มต้นจาก Java 1.5 คอมไพเลอร์ใช้ StringBuilder เพื่อจัดการสตริงด้วย + Sign Spliced Strings ในกรณีส่วนใหญ่
เมื่อเราเขียนโค้ดในสภาพแวดล้อม JDK 1.4 ขอแนะนำให้ใช้เครื่องหมาย + เพื่อจัดการกับสถานการณ์ข้างต้นที่มีหลายสายในครั้งเดียว ด้วยวิธีนี้เมื่อ JDK ได้รับการอัพเกรดเป็น 1.5 ขึ้นไปคอมไพเลอร์จะแปลงเป็น Stringbuilder เป็น Strings โดยอัตโนมัติซึ่งจะเป็นการปรับปรุงประสิทธิภาพของการประกบสตริง
แน่นอนว่าการใช้สตริงการประกบ + เครื่องหมายที่แนะนำนั้น จำกัด เฉพาะการใช้เมื่อมีการประกบหลายสตริงในคำสั่ง หากคุณแยกสตริงในหลายข้อความก็ยังแนะนำให้ใช้ StringBuffer หรือ StringBuilder ตัวอย่างเช่น:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string java = ", java!"; string str = ""; str += "สวัสดี"; str += "โลก"; str += java; System.out.println (str);} คำสั่งไบต์ที่รวบรวมของคอมไพเลอร์มีดังนี้:
จากภาพด้านบนเราสามารถรู้ได้ว่าคำสั่ง splicing sign แต่ละครั้งจะสร้างวัตถุ StringBuilder ใหม่ สถานการณ์นี้เห็นได้ชัดโดยเฉพาะอย่างยิ่งภายใต้เงื่อนไขวัฏจักรส่งผลให้เกิดการสูญเสียประสิทธิภาพค่อนข้างมาก ดังนั้นจึงขอแนะนำให้ใช้ StringBuffer หรือ StringBuilder เพื่อจัดการสตริงในหลายข้อความ
เกี่ยวกับการเพิ่มประสิทธิภาพที่เกิดจากการใช้ StringBuilder
นอกจากนี้เมื่อใช้ StringBuffer หรือ StringBuilder เรายังสามารถใช้วิธีการต่อไปนี้เพื่อปรับปรุงประสิทธิภาพเพิ่มเติม (รหัสต่อไปนี้ใช้ StringBuilder เป็นตัวอย่าง StringBuffer คล้ายกับนี้)
1. ทำนายความยาวสูงสุดของสตริงสุดท้ายที่ได้รับ
ความยาวเริ่มต้นของอาร์เรย์ถ่านภายใน StringBuilder คือ 16 เมื่อเราผนวกสตริงและเกินความยาวนี้ StringBuilder จะขยายขีดความสามารถของอาร์เรย์ภายในเพื่อตอบสนองความต้องการ ในกระบวนการนี้ StringBuilder สร้างอาร์เรย์ถ่านความจุที่ใหญ่ขึ้นใหม่และคัดลอกข้อมูลจากอาร์เรย์ดั้งเดิมไปยังอาร์เรย์ใหม่ หากเราสามารถทำนายความยาวสูงสุดของสตริงที่มีการประกบกันได้ในที่สุดเราสามารถระบุความจุเริ่มต้นของขนาดที่เหมาะสมเมื่อสร้างวัตถุ StringBuilder ตัวอย่างเช่นเราต้องแยกเพื่อรับสตริงที่มีตัวอักษร 100 ตัว คุณสามารถเขียนรหัสต่อไปนี้:
StringBuilder sb = new StringBuilder (100); สำหรับ (int i = 0; i <100; i ++) {sb.append ('a');} system.out.println (sb);โปรดปรับสมดุลตามเงื่อนไขจริงเพื่อสร้าง Stringbuilder ที่เหมาะสมสำหรับความจุเริ่มต้น
2. สำหรับอักขระแต่ละตัวให้ใช้ประเภทถ่านแทนประเภทสตริงให้มากที่สุด
บางครั้งเราจำเป็นต้องผนวกอักขระตัวเดียวหลังจากสตริง (ตัวอย่างเช่น: a) และเราควรใช้มันให้มากที่สุดในเวลานี้
sb.append ('a');แทนที่จะใช้:
sb.append ("a");