เราไม่สามารถแน่ใจได้ว่านักออกแบบ 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
จะชี้ไปที่วัตถุเดียวกัน แต่ถ้าเราพยายามที่จะทำให้เกิดการเปลี่ยนแปลงในเช่นa
a.replace("a", "")
จะเป็นการดีที่a
ควรจะมีค่าNresh
แต่b
, c
ควรจะยังคงไม่เปลี่ยนแปลงเพราะเป็นผู้ใช้สิ้นเราจะทำให้การเปลี่ยนแปลงa
เท่านั้น และเรารู้ว่าa
, b
, c
ทั้งหมดจะถูกชี้วัตถุเดียวกันดังนั้นหากเราทำการเปลี่ยนแปลงในa
คนอื่น ๆ นอกจากนี้ยังควรสะท้อนให้เห็นถึงการเปลี่ยนแปลง
แต่สตริงที่ไม่เปลี่ยนรูปจะช่วยให้เราประหยัดจากสถานการณ์นี้และเนื่องจากความไม่สามารถเปลี่ยนแปลงได้ของสตริงวัตถุวัตถุสตริงNaresh
จะไม่เปลี่ยนแปลง ดังนั้นเมื่อเราทำการเปลี่ยนแปลงใด ๆa
แทนการเปลี่ยนแปลงในวัตถุสตริงNaresh
JVM สร้างวัตถุใหม่กำหนดให้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 จะไม่เปลี่ยนรูปและรอบชิงชนะเลิศในชวา