เมื่อมองไปที่คอนสตรัคชันการสะสมที่แตกต่างกัน เหตุใด ArrayList () จึงสร้างรายการที่ว่างเปล่าด้วยความจุเริ่มต้นที่สิบและ ArrayDeque () สร้างอาร์เรย์ deque ที่ว่างเปล่าที่มีความจุเริ่มต้นเพียงพอที่จะเก็บองค์ประกอบ 16 องค์ประกอบ
เมื่อมองไปที่คอนสตรัคชันการสะสมที่แตกต่างกัน เหตุใด ArrayList () จึงสร้างรายการที่ว่างเปล่าด้วยความจุเริ่มต้นที่สิบและ ArrayDeque () สร้างอาร์เรย์ deque ที่ว่างเปล่าที่มีความจุเริ่มต้นเพียงพอที่จะเก็บองค์ประกอบ 16 องค์ประกอบ
คำตอบ:
เนื่องจากความสามารถ ArrayDeque ต้องเป็นพลังของสองและ 16 เป็นพลังที่เล็กที่สุดของสองที่อย่างน้อย 10
ArrayDeque จำเป็นต้องใช้การดำเนินงานจำนวนมาก% ทุกที่เพื่อล้อมรอบอาร์เรย์เชิงเส้นที่อ้างว่าเป็นแบบวงกลม
a % b
สามารถแสดงราวกับa & (b - 1)
ว่า b
เป็นพลังของทั้งสอง ค่าบิตและจะเร็วขึ้นอย่างมากดังนั้นความสามารถของ ArrayDeque จึงถูก จำกัด ให้เป็นกำลังสอง การดำเนินการทั้งหมด% จะดำเนินการด้วย bitmasking แทน% ที่เกิดขึ้นจริงในการใช้งาน
นี่คือเหตุผลที่ HashMap รุ่นใหม่ไม่ได้ใช้ขนาดตารางจำนวนเฉพาะ แต่พลังของสองอีกครั้งเพราะการดำเนินการ% จะต้องดำเนินการบ่อยครั้งและบิตและเร็วกว่า
ดังนั้นถ้าพื้นฐานคือ 10 ดังนั้นโครงสร้างที่มีพลังของข้อ จำกัด สองควรใช้ 16 เพราะมันเป็นพลังที่เล็กที่สุดของสองที่อย่างน้อย 10
อย่าแยกความเป็นไปได้ที่ไม่มีเหตุผลเฉพาะ
อาจเป็นได้ว่าคอลเล็กชันทั้งสองนี้เขียนโดยทีมต่าง ๆ ทั้งคู่เลือกจำนวนเล็กน้อยเป็นความจุเริ่มต้น แต่ทีมแรกคิดอย่างเด็ดขาดและเลือก 10 ในขณะที่ทีมที่สองคิดเป็นเลขฐานสองและเลือก 16
@ คำตอบของ Esailija นั้นดีสำหรับกรณีนี้โดยเฉพาะ
โดยทั่วไปแล้วมันเป็นการแลกเปลี่ยนที่ขึ้นอยู่กับหลายปัจจัย ฉันจะยกตัวอย่าง:
เป็นผลมาจากการแลกเปลี่ยนเหล่านี้มันค่อนข้างเข้าใจว่าการใช้งานคอลเลกชันที่แตกต่างกันอาจมีความจุเริ่มต้นที่ดีที่สุดที่แตกต่างกัน