หากคุณพบว่ามีวิธีการนิยามในอินเทอร์เฟซ:
สตริงสาธารณะ [] getParameters ();
จากนั้นคุณควรไตร่ตรองอย่างจริงจัง อาร์เรย์ไม่เพียง แต่ล้าสมัยเท่านั้น แต่เรามีเหตุผลที่สมเหตุสมผลในการหลีกเลี่ยงการสัมผัส ในบทความนี้ฉันจะพยายามสรุปข้อบกพร่องของอาร์เรย์ใน Java API เริ่มต้นด้วยหนึ่งในตัวอย่างที่ไม่คาดคิดที่สุด
อาร์เรย์นำไปสู่ประสิทธิภาพที่ไม่ดี
คุณอาจคิดว่าการใช้อาร์เรย์นั้นเร็วที่สุดเนื่องจากอาร์เรย์เป็นโครงสร้างข้อมูลพื้นฐานที่ดำเนินการโดยคอลเลกชันส่วนใหญ่ การใช้กลุ่มตัวเลขบริสุทธิ์ต่ำกว่าการใช้วัตถุอาร์เรย์ได้อย่างไร
เริ่มต้นด้วยการใช้นิสัยทั่วไปที่ดูคุ้นเคย:
สตริงสาธารณะ [] getNames () {return nameslist.toarray (สตริงใหม่ [nameslist.size ()]);} วิธีนี้สร้างข้อมูลจากการรวบรวมตัวแปรที่ใช้ข้อมูลการเก็บรักษาภายใน ช้าลง (โปรดดูแถบสีเขียวกับส้มในแผนภูมิ):
สตริงสาธารณะ [] getNames () {return nameslist.toarray (สตริงใหม่ [0]);} อย่างไรก็ตามหากวิธีการส่งคืนรายการการสร้างสำเนาป้องกันจะเร็วขึ้น (แถบสีแดง):
รายการสาธารณะ <String> getNames () {ส่งคืน arrayList ใหม่ (nameslist);} ความแตกต่างคือ ArrayList วางรายการข้อมูลในอาร์เรย์ [] อาร์เรย์และใช้วิธี Toarray ประเภทหนึ่งซึ่งเร็วกว่าประเภทของวิธี (BLUE BAR) ไม่มีประเภทของอาร์เรย์การห่อหุ้มจะถูกห่อหุ้มในประเภททั่วไปของคอมไพเลอร์
ไอคอนนี้แสดงมาตรฐานการอ้างอิงสำหรับ n = 5 บน Java 7 อย่างไรก็ตามรายการข้อมูลเพิ่มเติมหรือระบบ VM อื่น ๆ ภาพนี้จะไม่เปลี่ยนแปลงมากเกินไป แปลงเป็นคอลเลกชันเพื่อใช้เพื่อทำอะไรแล้วแปลงผลลัพธ์กลับไปเป็นอาร์เรย์เพื่อส่งไปยังวิธีการอินเทอร์เฟซอื่น
มันใช้อาร์เรย์ที่เรียบง่ายแทนที่จะเป็นอาร์เรย์เพื่อปรับปรุงประสิทธิภาพ ไบต์
การใช้คอลเลกชันคุณอาจตัดสินใจที่จะส่งคืนรายการภายในที่ไม่ได้แก้ไข:
รายการสาธารณะ <String> getNames () {return collections.unmodifiableList (nameslist);}การดำเนินการนี้จะดำเนินการในราคาตลาดคงที่ดังนั้นเขาจึงเร็วกว่าวิธีอื่น ๆ (แถบสีเหลือง) ไม่สามารถแก้ไขการเปลี่ยนแปลงจะเปลี่ยนแปลงเมื่อข้อมูลภายในของคุณเปลี่ยนแปลง หากการเปลี่ยนแปลงเกิดขึ้นลูกค้าจะทำงานไปยังรายการข้อมูลซ้ำ ๆ มันจะเป็นตัวเลือกที่มีประสิทธิภาพสูงซึ่งไม่สามารถนำไปใช้ได้โดยอาร์เรย์
อาร์เรย์กำหนดโครงสร้างไม่ใช่อินเทอร์เฟซ
Java เป็นภาษาที่มุ่งเน้นวัตถุ แนวคิดหลักของวัตถุที่มุ่งเน้นคือการจัดหาวิธีการบางอย่างในการเข้าถึงและใช้งานข้อมูลแทนการใช้งานโดเมนข้อมูลโดยตรง
เนื่องจาก Java ได้ออกแบบประสิทธิภาพการทำงานและอาร์เรย์ได้ถูกรวมเข้ากับระบบประเภท จากการเข้าถึงโดยตรงคุณไม่มีสิ่งอื่น ๆ ที่ต้องทำในอาร์เรย์
String [] array = {"foo", "bar"}; println (อาร์เรย์); "," bar "}) // -> falseที่แตกต่างจากอาร์เรย์คอลเลกชัน API มีวิธีการที่มีประโยชน์มากมายในการเข้าถึงองค์ประกอบ และรักษาหลักการของการดำเนินการในเวลาเดียวกัน
ด้วยการใช้ข้อมูลคุณจะกำหนดตำแหน่งที่เก็บรักษาไว้ในหน่วยความจำ
อาร์เรย์ไม่ใช่ประเภทที่ปลอดภัย
หากคุณพึ่งพาประเภทของการตรวจสอบคอมไพเลอร์ระวังอาร์เรย์วัตถุ
number [] numbers = new Integer [10];
เหตุผลก็คืออาร์เรย์คือ "การทำงานร่วมกัน" ครอบคลุมทฤษฎีทั้งหมดและทฤษฎีทั้งหมดนักพัฒนา Java ทุกคนจะต้องอ่าน
เนื่องจากพฤติกรรมนี้อินเทอร์เฟซของประเภทอาร์เรย์ที่เปิดเผยจะช่วยให้ประเภทย่อยของการประกาศประเภทอาร์เรย์ซึ่งทำให้เกิดความผิดปกติของรันไทม์แปลก ๆ
Bloch ยังอธิบายว่าอาร์เรย์ไม่สามารถใช้งานได้กับประเภททั่วไป
-Joshua Block, Java ที่มีประสิทธิภาพ (ฉบับที่ 2), มาตรา 29
สรุป
โครงสร้างภาษาของชั้นล่างของอาร์เรย์และพวกเขาจะใช้ในการใช้งาน แต่พวกเขาไม่ควรคิดถึงการเปิดรับคลาสอื่น ๆ .