เราไม่สามารถแน่ใจได้ว่านักออกแบบ Java กำลังคิดอะไรอยู่ในขณะที่ออกแบบStringแต่เราสามารถสรุปเหตุผลเหล่านี้ได้จากข้อดีที่เราไม่สามารถเปลี่ยนแปลงได้ของสตริง
1. การดำรงอยู่ของ String Constant Pool
ดังที่อธิบายไว้ในWhy String ถูกเก็บไว้ในบทความString Constant Poolทุกแอปพลิเคชันสร้างวัตถุสตริงมากเกินไปและเพื่อบันทึก JVM จากการสร้างวัตถุสตริงจำนวนมากก่อนแล้วจึงเก็บรวบรวมขยะ JVM เก็บวัตถุสตริงทั้งหมดในพื้นที่หน่วยความจำแยกต่างหากที่เรียกว่า String ค่าคงที่สระว่ายน้ำและนำวัตถุจากสระว่ายน้ำแคชนั้น
เมื่อใดก็ตามที่เราสร้างสตริงตัวอักษร JVM จะเห็นเป็นครั้งแรกว่าตัวอักษรนั้นมีอยู่ในสระน้ำคงที่หรือไม่และถ้ามีแล้วการอ้างอิงใหม่จะเริ่มชี้ไปที่วัตถุเดียวกันใน SCP
String a = "Naresh";
String b = "Naresh";
String c = "Naresh";
ในตัวอย่างข้างต้นวัตถุสตริงที่มีค่าNareshจะได้รับการสร้างขึ้นใน SCP เพียงครั้งเดียวและการอ้างอิงทั้งหมดa, b, cจะชี้ไปที่วัตถุเดียวกัน แต่ถ้าเราพยายามที่จะทำให้เกิดการเปลี่ยนแปลงในเช่นaa.replace("a", "")
จะเป็นการดีที่aควรจะมีค่าNreshแต่b, cควรจะยังคงไม่เปลี่ยนแปลงเพราะเป็นผู้ใช้สิ้นเราจะทำให้การเปลี่ยนแปลงaเท่านั้น และเรารู้ว่าa, b, cทั้งหมดจะถูกชี้วัตถุเดียวกันดังนั้นหากเราทำการเปลี่ยนแปลงในaคนอื่น ๆ นอกจากนี้ยังควรสะท้อนให้เห็นถึงการเปลี่ยนแปลง
แต่สตริงที่ไม่เปลี่ยนรูปจะช่วยให้เราประหยัดจากสถานการณ์นี้และเนื่องจากความไม่สามารถเปลี่ยนแปลงได้ของสตริงวัตถุวัตถุสตริงNareshจะไม่เปลี่ยนแปลง ดังนั้นเมื่อเราทำการเปลี่ยนแปลงใด ๆaแทนการเปลี่ยนแปลงในวัตถุสตริงNareshJVM สร้างวัตถุใหม่กำหนดให้aแล้วทำการเปลี่ยนแปลงในวัตถุนั้น
ดังนั้น String pool จึงมีความเป็นไปได้เพียงอย่างเดียวเนื่องจากความไม่สามารถเปลี่ยนได้ของ String และหาก String นั้นไม่สามารถเปลี่ยนรูปแบบได้ดังนั้นการแคชวัตถุสตริงและการนำกลับมาใช้ใหม่จะไม่มีความเป็นไปได้เพราะตัวแปรใด ๆ
และนั่นคือสาเหตุที่ JVM จัดการเป็นพิเศษและได้รับพื้นที่หน่วยความจำพิเศษ
2. ความปลอดภัยด้าย
วัตถุถูกเรียกว่า thread-safe เมื่อมีหลายเธรดกำลังทำงานอยู่ แต่ไม่มีวัตถุใดที่สามารถทำให้สถานะของมันเสียหายและวัตถุนั้นจะคงสถานะเดิมไว้สำหรับทุกเธรดในเวลาใดก็ได้
ในฐานะที่เราเป็นวัตถุที่ไม่เปลี่ยนรูปไม่สามารถแก้ไขได้โดยทุกคนหลังจากการสร้างซึ่งทำให้ทุกวัตถุที่ไม่เปลี่ยนรูปเป็นด้ายปลอดภัยโดยค่าเริ่มต้น เราไม่จำเป็นต้องใช้มาตรการความปลอดภัยของเธรดใด ๆ กับมันเช่นการสร้างวิธีการซิงโครไนซ์
ดังนั้นเนื่องจากวัตถุสตริงธรรมชาติที่ไม่เปลี่ยนรูปแบบของมันสามารถใช้ร่วมกันโดยหลายกระทู้และแม้ว่ามันจะได้รับการจัดการโดยหลายกระทู้มันจะไม่เปลี่ยนค่าของมัน
3. ความปลอดภัย
ในทุกแอปพลิเคชันเราต้องส่งความลับหลายอย่างเช่นชื่อผู้ใช้ \ รหัสผ่านของผู้ใช้ URL การเชื่อมต่อและโดยทั่วไปข้อมูลทั้งหมดนี้จะถูกส่งผ่านเป็นวัตถุสตริง
ตอนนี้สมมติว่า String จะไม่เปลี่ยนแปลงไม่ได้ในลักษณะนั้นมันจะก่อให้เกิดภัยคุกคามความปลอดภัยอย่างร้ายแรงต่อแอปพลิเคชันเนื่องจากค่าเหล่านี้ได้รับอนุญาตให้เปลี่ยนและหากได้รับอนุญาตแล้วสิ่งเหล่านี้อาจเปลี่ยนเนื่องจากรหัสที่เขียนผิดหรือบุคคลอื่น ๆ สามารถเข้าถึงการอ้างอิงตัวแปรของเรา
4. Class Loading
ตามที่กล่าวไว้ในการสร้างวัตถุผ่าน Reflection ใน Java ด้วยตัวอย่างเราสามารถใช้Class.forName("class_name")วิธีการโหลดคลาสในหน่วยความจำซึ่งเรียกวิธีการอื่น ๆ อีกครั้งเพื่อทำเช่นนั้น และแม้แต่ JVM ก็ใช้วิธีการเหล่านี้ในการโหลดคลาส
ClassLoaderแต่ถ้าคุณเห็นได้อย่างชัดเจนทุกวิธีการเหล่านี้ยอมรับชื่อชั้นเป็นวัตถุสตริงเพื่อให้สายที่ใช้ในการโหลดคลาสจาวาและเปลี่ยนไม่ได้ให้การรักษาความปลอดภัยที่ระดับที่ถูกต้องจะได้รับการโหลดโดย
สมมติว่า String จะไม่เปลี่ยนแปลงไม่ได้และเราพยายามโหลดjava.lang.Objectซึ่งเปลี่ยนเป็นorg.theft.OurObjectระหว่างและตอนนี้วัตถุทั้งหมดของเรามีพฤติกรรมที่ใครบางคนสามารถใช้กับสิ่งที่ไม่ต้องการ
5. การแคช HashCode
หากเรากำลังจะทำการดำเนินการที่เกี่ยวข้องกับการแปลงแป้นพิมพ์บนวัตถุใด ๆ เราจะต้องแทนที่hashCode()วิธีการและพยายามที่จะสร้าง hashcode ที่ถูกต้องโดยใช้สถานะของวัตถุ หากสถานะของวัตถุมีการเปลี่ยนแปลงซึ่งหมายความว่าแฮชโค้ดควรเปลี่ยนเช่นกัน
เนื่องจาก String ไม่สามารถเปลี่ยนแปลงได้ดังนั้นค่าหนึ่งในวัตถุสตริงจะไม่ถูกเปลี่ยนแปลงซึ่งหมายความว่าแฮชโค้ดของมันจะไม่เปลี่ยนแปลงซึ่งทำให้คลาส String มีโอกาสแคชแฮชโค้ดในระหว่างการสร้างวัตถุ
ใช่วัตถุ String เก็บรหัสแฮชในเวลาที่สร้างวัตถุซึ่งเป็นตัวเลือกที่ยอดเยี่ยมสำหรับการดำเนินการที่เกี่ยวข้องกับการแฮชเนื่องจาก hashcode ไม่จำเป็นต้องคำนวณอีกครั้งซึ่งช่วยให้เราประหยัดเวลา นี่คือเหตุผลที่ String ส่วนใหญ่ถูกใช้เป็นHashMapกุญแจ
อ่านข้อมูลเพิ่มเติมเกี่ยวกับทำไม String จะไม่เปลี่ยนรูปและรอบชิงชนะเลิศในชวา