สตริงคือคลาสใน Java ที่เก็บลำดับของอักขระ มันเป็นของ java.lang บรรจุุภัณฑ์. เมื่อคุณสร้างวัตถุสตริงแล้ว คุณจะไม่สามารถแก้ไขได้ (ไม่เปลี่ยนรูปแบบ)
ที่เก็บข้อมูล
ออบเจ็กต์ String ทั้งหมดถูกเก็บไว้ในตำแหน่งหน่วยความจำแยกต่างหากในพื้นที่ฮีปที่เรียกว่า String Constant Pool .
เมื่อใดก็ตามที่คุณกำหนดค่าสตริง JVM จะสร้างวัตถุสตริงด้วยค่าที่กำหนดในพูลค่าคงที่สตริง ดังนั้น หากคุณรันโปรแกรมข้างต้น ค่าสตริงสองค่าจะถูกสร้างขึ้นในพูลค่าคงที่สตริง
วิธีการฝึกงาน ()
เมธอดนี้คืนค่าของสตริงปัจจุบันจากพูลของค่าสตริงที่ไม่ซ้ำ เมื่อใดก็ตามที่คุณเรียกใช้เมธอดนี้ในสตริงเฉพาะ หากพูลค่าคงที่สตริงมีสตริงเท่ากับอยู่แล้ว (ตามเมธอดเท่ากับของคลาส Object) ค่าคงที่ของสตริงจะถูกส่งกลับ หากไม่เป็นเช่นนั้น สตริงปัจจุบันจะถูกเพิ่มไปยังพูลค่าคงที่ของสตริงโดยส่งคืนการอ้างอิงไปยังมัน
กล่าวคือ หากคุณเรียกใช้เมธอดนี้ในสองสตริงที่มีเนื้อหาเหมือนกัน รับประกันได้ว่าพวกเขาใช้หน่วยความจำร่วมกัน
วิธีนี้สะดวกต่อการลดหน่วยความจำที่ใช้ในกรณีที่มีค่าที่ซ้ำกันหลายค่า
ตัวอย่าง
ต่อไปนี้ เรากำลังสร้างสตริงสองสตริง (โดยใช้คีย์เวิร์ดใหม่) ที่มีเนื้อหาเดียวกันและเปรียบเทียบกับการใช้โอเปอเรเตอร์ “==” แม้ว่าวัตถุทั้งสองมีค่าเท่ากัน เนื่องจากไม่ได้อ้างอิงถึงวัตถุเดียวกัน (หน่วยความจำ) ผลลัพธ์จะเป็นเท็จ
public class InternExample { public static void main(String args[]) { String str1 = new String("Hello"); str1 = str1.intern(); String str2 = "Hello"; str2 = str2.intern(); System.out.println(str1.equals(str2)); } }
ผลลัพธ์
false
แต่ถ้าคุณเรียกใช้เมธอด intern กับอ็อบเจ็กต์ทั้งสองก่อนที่จะเปรียบเทียบ เนื่องจากจะทำให้แน่ใจว่าอ็อบเจ็กต์ทั้งสองใช้หน่วยความจำร่วมกันหากมีเนื้อหาเหมือนกัน ผลลัพธ์จะเป็นจริง
public class InternExample { public static void main(String args[]) { String str1 = new String("Hello"); str1 = str1.intern(); String str2 = new String("Hello"); str2 = str2.intern(); System.out.println(str1==str2); } }
ผลลัพธ์
true