http://kohlerm.blogspot.co.uk/2009/01/is-javalangstringintern-really-evil.html
ยืนยันที่String.equals()
ใช้"=="
ในการเปรียบเทียบString
วัตถุก่อนตาม
http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
มันเปรียบเทียบความยาวของสตริงแล้วเนื้อหา
(โดยวิธีการสตริงรหัสผลิตภัณฑ์ในแคตตาล็อกการขายจะต้องมีความยาวเท่ากัน - BIC0417 เป็นหมวกนิรภัยของนักปั่นจักรยาน TIG0003 เป็นเสือเพศผู้ผู้ใหญ่ที่มีชีวิต - คุณอาจต้องใช้ใบอนุญาตทุกประเภทเพื่อสั่งซื้อหนึ่งใบและ บางทีคุณควรสั่งหมวกนิรภัยพร้อมกัน)
ดังนั้นดูเหมือนว่าคุณจะได้รับประโยชน์จากการแทนที่สตริงของคุณด้วยintern()
เวอร์ชันของพวกเขาแต่คุณจะได้รับความปลอดภัย - และความสามารถในการอ่านและการปฏิบัติตามมาตรฐาน - โดยไม่ต้องใช้ "==" สำหรับequals()
การเขียนโปรแกรมของคุณ และสิ่งที่ฉันจะพูดส่วนใหญ่ขึ้นอยู่กับความเป็นจริงถ้าเป็นจริง
แต่String.equals()
ทดสอบว่าคุณส่งผ่านสตริงไม่ใช่วัตถุอื่นก่อนใช้งาน"=="
หรือไม่ ฉันไม่มีคุณสมบัติที่จะพูด แต่ฉันคาดเดาไม่ได้เพราะequals()
การดำเนินการดังกล่าวส่วนใหญ่จะเป็น String to String ดังนั้นการทดสอบจึงเกือบจะผ่าน แท้จริงแล้วการจัดลำดับความสำคัญ "==" ภายในString.equals()
บ่งบอกถึงความมั่นใจว่าคุณมักจะเปรียบเทียบสตริงกับวัตถุจริงเดียวกัน
ฉันหวังว่าจะไม่มีใครประหลาดใจที่บรรทัดต่อไปนี้ให้ผลลัพธ์ของ "false":
Integer i = 1;
System.out.println("1".equals(i));
แต่ถ้าคุณเปลี่ยนi
ไปในบรรทัดที่สองของหลักสูตรมันi.toString()
true
สถานที่ที่คุณอาจหวังว่าจะได้รับประโยชน์จากการฝึกงานรวมถึงSet
และMap
แน่นอน ฉันหวังว่าสตริงภายในจะมีแฮชโค้ดของพวกเขา ... ฉันคิดว่ามันจะเป็นข้อกำหนด และฉันหวังว่าฉันจะไม่ได้ให้ความคิดที่จะทำให้ฉันได้รับเงินหนึ่งล้านเหรียญ :-)
สำหรับหน่วยความจำก็เป็นที่ชัดเจนว่าเป็นข้อ จำกัด ที่สำคัญหากปริมาณ Strings ของคุณมีขนาดใหญ่หรือถ้าคุณต้องการให้หน่วยความจำที่ใช้โดยรหัสโปรแกรมของคุณมีขนาดเล็กมาก หากวอลุ่ม -distinct- ของคุณมีขนาดใหญ่มากอาจถึงเวลาที่คุณต้องพิจารณาใช้รหัสโปรแกรมฐานข้อมูลเฉพาะเพื่อจัดการกับมันและเซิร์ฟเวอร์ฐานข้อมูลแยกต่างหาก ในทำนองเดียวกันหากคุณสามารถปรับปรุงโปรแกรมขนาดเล็ก (ที่ต้องทำงานใน 10,000 อินสแตนซ์พร้อมกัน) โดยไม่ให้มีการจัดเก็บสตริงของตัวเองเลย
มันรู้สึกสิ้นเปลืองที่จะสร้างสตริงใหม่แล้วละทิ้งมันไปintern()
แทนตัวเองทันที แต่ไม่มีทางเลือกอื่นที่ชัดเจนยกเว้นการรักษาสตริงที่ซ้ำกัน ดังนั้นค่าใช้จ่ายในการดำเนินการก็คือการค้นหาสตริงของคุณในพูลฝึกหัดแล้วอนุญาตให้ผู้รวบรวมขยะสามารถกำจัดต้นฉบับได้ และถ้ามันเป็นตัวอักษรสตริงแล้วมันก็มาฝึกงาน -ed อยู่แล้ว
ฉันสงสัยว่าintern()
สามารถถูกใช้งานโดยรหัสโปรแกรมที่เป็นอันตรายเพื่อตรวจสอบว่ามีบางสายอักขระและการอ้างอิงวัตถุของพวกเขามีอยู่แล้วในกลุ่มintern()
และดังนั้นจึงมีอยู่ที่อื่นในเซสชั่น Java เมื่อไม่ควรที่จะรู้ แต่นั่นจะเป็นไปได้ก็ต่อเมื่อมีการใช้รหัสโปรแกรมในลักษณะที่ไว้วางใจได้เท่านั้นฉันเดา ถึงกระนั้นก็เป็นเรื่องที่ควรพิจารณาเกี่ยวกับห้องสมุดบุคคลที่สามที่คุณรวมไว้ในโปรแกรมของคุณเพื่อจัดเก็บและจดจำหมายเลข PIN ATM ของคุณ!