ที่จริงฉันเขียนโพสต์บล็อกในหัวข้อ 2 เดือนที่ผ่านมา บทความนี้ใช้สำหรับ C # List<T>แต่ Java ArrayListมีการใช้งานที่คล้ายกันมาก เนื่องจากArrayListมีการใช้งานโดยใช้อาร์เรย์แบบไดนามิกจึงเพิ่มขนาดตามความต้องการ ดังนั้นเหตุผลสำหรับตัวสร้างกำลังการผลิตเพื่อวัตถุประสงค์ในการเพิ่มประสิทธิภาพ
เมื่อหนึ่งในการดำเนินการปรับขนาดเหล่านี้เกิดขึ้น ArrayList จะคัดลอกเนื้อหาของอาร์เรย์ลงในอาร์เรย์ใหม่ที่มีความจุเป็นสองเท่าของอาร์เรย์เก่า การดำเนินการนี้วิ่งในO (n)เวลา
ตัวอย่าง
นี่คือตัวอย่างของการArrayListเพิ่มขนาด:
10
16
25
38
58
... 17 resizes ...
198578
297868
446803
670205
1005308
ดังนั้นรายการเริ่มต้นที่มีความจุ10เมื่อรายการที่ 11 จะมีการเพิ่มมันคือการเพิ่มขึ้นโดยการ50% + 1 16ในรายการที่ 17 ArrayListจะเพิ่มขึ้นอีกครั้งเพื่อ25ๆ 1000000ตอนนี้พิจารณาตัวอย่างที่เรากำลังสร้างรายการที่มีความจุที่ต้องการเป็นที่รู้จักกันอยู่แล้วเป็น การสร้างตัวสร้างแบบArrayListไม่มีขนาดจะเรียกArrayList.add 1000000เวลาที่ใช้O (1)ตามปกติหรือO (n)ในการปรับขนาด
1000000 + 16 + 25 + ... + 670205 + 1005308 = 4015851
เปรียบเทียบนี้ใช้สร้างแล้วโทรArrayList.addซึ่งรับประกันได้ว่าจะทำงานในO (1)
1000000 + 1000000 = 2000000 การดำเนินการ
Java เทียบกับ C #
Java เป็นข้างต้นเริ่มต้นที่ 1050% + 1และเพิ่มขึ้นในแต่ละที่ปรับขนาด C # เริ่มต้น4และเพิ่มขึ้นอย่างก้าวร้าวมากขึ้นเป็นสองเท่าในการปรับขนาดแต่ละครั้ง 1000000เพิ่มตัวอย่างจากข้างต้นสำหรับ C # ใช้3097084การดำเนินงาน
อ้างอิง