ทำไมคอลเลกชัน java ที่แตกต่างกันจึงมีความจุเริ่มต้นแตกต่างกัน


11

เมื่อมองไปที่คอนสตรัคชันการสะสมที่แตกต่างกัน เหตุใด ArrayList () จึงสร้างรายการที่ว่างเปล่าด้วยความจุเริ่มต้นที่สิบและ ArrayDeque () สร้างอาร์เรย์ deque ที่ว่างเปล่าที่มีความจุเริ่มต้นเพียงพอที่จะเก็บองค์ประกอบ 16 องค์ประกอบ


ฉันไม่ได้ใหม่ทีมีขีด จำกัด กำลังการผลิต ฉันเพียงแค่เพิ่มองค์ประกอบใหม่ด้วยการเพิ่ม () มันได้ผลเสมอ
Tulains Córdova

1
ฉันคิดว่าเขากำลังพูดถึงขนาดอาร์เรย์เริ่มต้นของอาร์เรย์ภายในการนำ ArrayList มาใช้ ตามชื่อของมันหมายถึง ArrayList เป็นเพียงอาร์เรย์แบบเก่าภายใต้หน้าปกและมันจะสร้างอาร์เรย์ที่มีขนาดใหญ่ขึ้นโดยอัตโนมัติเมื่อคุณพยายามที่จะเพิ่มองค์ประกอบมากกว่าขนาดอาร์เรย์ที่มีอยู่ในปัจจุบัน
dsw88

1
ฉันคิดว่า StringBuilder เป็นอีกหนึ่งที่มีความจุเริ่มต้นมันเป็น 10 หรือ 16?
Ingo

@Ingo น่าสนใจ ฉันไม่ได้ตระหนักถึงสิ่งต่าง ๆ นอกเหนือจากคอลเลกชันที่เต็มไปด้วยความจุ แต่ฉันคิดว่ามันสมเหตุสมผล ในเวลานั้นไม่มีแท็กสำหรับความจุดังนั้นฉันจึงไม่ได้สนใจสิ่งอื่นมากนัก
Badman เก่า Gray

คำตอบ:


17

คำตอบสั้น ๆ

เนื่องจากความสามารถ ArrayDeque ต้องเป็นพลังของสองและ 16 เป็นพลังที่เล็กที่สุดของสองที่อย่างน้อย 10


ArrayDeque จำเป็นต้องใช้การดำเนินงานจำนวนมาก% ทุกที่เพื่อล้อมรอบอาร์เรย์เชิงเส้นที่อ้างว่าเป็นแบบวงกลม

a % bสามารถแสดงราวกับa & (b - 1) ว่า bเป็นพลังของทั้งสอง ค่าบิตและจะเร็วขึ้นอย่างมากดังนั้นความสามารถของ ArrayDeque จึงถูก จำกัด ให้เป็นกำลังสอง การดำเนินการทั้งหมด% จะดำเนินการด้วย bitmasking แทน% ที่เกิดขึ้นจริงในการใช้งาน

นี่คือเหตุผลที่ HashMap รุ่นใหม่ไม่ได้ใช้ขนาดตารางจำนวนเฉพาะ แต่พลังของสองอีกครั้งเพราะการดำเนินการ% จะต้องดำเนินการบ่อยครั้งและบิตและเร็วกว่า

ดังนั้นถ้าพื้นฐานคือ 10 ดังนั้นโครงสร้างที่มีพลังของข้อ จำกัด สองควรใช้ 16 เพราะมันเป็นพลังที่เล็กที่สุดของสองที่อย่างน้อย 10


3

อย่าแยกความเป็นไปได้ที่ไม่มีเหตุผลเฉพาะ

อาจเป็นได้ว่าคอลเล็กชันทั้งสองนี้เขียนโดยทีมต่าง ๆ ทั้งคู่เลือกจำนวนเล็กน้อยเป็นความจุเริ่มต้น แต่ทีมแรกคิดอย่างเด็ดขาดและเลือก 10 ในขณะที่ทีมที่สองคิดเป็นเลขฐานสองและเลือก 16


1

@ คำตอบของ Esailija นั้นดีสำหรับกรณีนี้โดยเฉพาะ

โดยทั่วไปแล้วมันเป็นการแลกเปลี่ยนที่ขึ้นอยู่กับหลายปัจจัย ฉันจะยกตัวอย่าง:

  • โครงสร้างข้อมูลโดยทั่วไปใช้เป็นอย่างไร โครงสร้างข้อมูลที่ใช้เป็นบัฟเฟอร์ข้อมูลมักจะต้องการความจุสูงกว่าโครงสร้างข้อมูลที่ใช้สำหรับ tuples ขนาดเล็กเช่น
  • ข้อมูลเริ่มต้นขนาดใดที่พอดีกับบรรทัดแคชบนแพลตฟอร์ม CPU เป้าหมายของคุณ มันสามารถสร้างความแตกต่างอย่างมากต่อประสิทธิภาพหากค่าเริ่มต้นเหมาะสมกับแคชไลน์ ตัวเลือก 10 เป็นค่าเริ่มต้นใน Java อาจเป็นเพราะอาเรย์ของ 10 32- บิตคำบวกกับค่าใช้จ่ายของอาเรย์ / วัตถุที่พอดีในบรรทัดแคช 64 ไบต์
  • คุณให้ความสำคัญกับพื้นที่ว่างกับประสิทธิภาพรันไทม์เป็นจำนวนเท่าใด หากคุณต้องการประสิทธิภาพรันไทม์ที่ดีกว่าปกติจะเป็นการดีกว่าที่จะจัดสรรพื้นที่เพิ่มเติมล่วงหน้าเพื่อหลีกเลี่ยงการจัดสรรอีกครั้งในภายหลัง

เป็นผลมาจากการแลกเปลี่ยนเหล่านี้มันค่อนข้างเข้าใจว่าการใช้งานคอลเลกชันที่แตกต่างกันอาจมีความจุเริ่มต้นที่ดีที่สุดที่แตกต่างกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.