เหตุผลหนึ่งที่ชั้นเรียนการเขียนโปรแกรมในปีแรกที่ใช้อาร์เรย์นั้นเป็นแบบดั้งเดิมนั่นคือวิธีการที่อาจารย์ได้เรียนรู้มาก่อนที่เราจะเริ่มใช้ไลบรารีมาตรฐานที่มีรายการแบบไดนามิกที่ถูกอบเข้าด้วยกันการใช้ชนิดข้อมูลดั้งเดิม ภาษาภายใต้ดวงอาทิตย์ (และสามารถนำไปใช้ในคำแนะนำการประกอบจำนวนหนึ่ง) เมื่อฉันเรียนรู้การเขียนโปรแกรมครั้งแรกการใช้รายการที่เชื่อมโยงเป็นหนึ่งในการมอบหมาย
มันง่ายกว่ามากที่จะเริ่มจากหลักการแรกแล้วพูดว่า "นั่นคือโครงสร้างพื้นฐานภาษานี้ (หรือไลบรารี) ให้โครงสร้างข้อมูลระดับสูงนี้ซึ่งทำทุกอย่าง แต่ให้ x, y และ z" มากกว่า มันคือการพูดว่า "นั่นคือโครงสร้างข้อมูลระดับสูงตอนนี้นี่คือสิ่งที่อยู่ภายใต้ประทุน" การเรียนรู้ที่จะให้เหตุผลเกี่ยวกับว่าจะใช้ LinkedList กับ ArrayList (หรือ HashSet vs. TreeSet) เป็นหลักสูตรขั้นตอนวิธีที่สองหรือสามปี รายการและแผนที่มีอินเทอร์เฟซเดียวกันและให้ผลลัพธ์เดียวกัน แต่อาจมีพฤติกรรมที่แตกต่างกันอย่างมากในแอปพลิเคชันทุกขนาด และเมื่อคุณออกจากการเขียนโปรแกรม 101 ไม่รับประกันว่าการเขียนโปรแกรม 102 จะใช้ภาษาเดียวกัน ถ้าคุณเริ่มจากแนวคิดของอาเรย์คุณสามารถพูดว่า "
อีกเหตุผลหนึ่งที่ชอบ "อาร์เรย์" เหนือ "รายการ" ในหลักสูตรเบื้องต้นคืออาร์เรย์นั้นเข้าใจง่ายโดยทั่วไป: อาร์เรย์ 20 bytes
ใช้ 20 ไบต์ (บวกอีกสองคู่เพื่อระบุจุดสิ้นสุดของอาร์เรย์หรือความยาวขึ้นอยู่กับการนำไปใช้) )
"รายการ" เป็นกาต้มน้ำที่แตกต่างไปจากเดิมอย่างสิ้นเชิงและสามารถนำไปใช้ได้หลายวิธี (ArrayList, LinkedList และอาจเป็นคู่ที่ฉันลืมไปแล้ว) โดยมีลักษณะการทำงานที่แตกต่างกันโดยพื้นฐาน โดยไม่เข้าใจความกล้าของสิ่งที่เรียนรายการที่แตกต่างกันกำลังทำคุณไม่สามารถมีการอภิปรายที่มีความหมายเมื่อคุณควรใช้กับList foo = new ArrayList()
List foo = new LinkedList()
หากคุณพยายามให้นักเรียนใช้การใช้งานรายการใครบางคนจะถามว่าทำไมคุณถึงใช้ ArrayList แทนการใช้งานอย่างใดอย่างหนึ่ง และ "ArrayList" รวมถึงคำว่า "Array" และได้รับการสนับสนุนจากคำสั่งเดียวดังนั้นจริงๆแล้วมันไม่ได้เป็นตรรกะขนาดใหญ่ที่กระโดดจาก "อาร์เรย์" ถึง "ArrayList"
ตรงกันข้ามกับความเชื่อที่นิยมมีสถานการณ์ที่เหมาะสมที่จะใช้อาร์เรย์เหนือรายการโดยเฉพาะเมื่อคุณจัดการกับรายการขนาดคงที่ นี่คือคู่:
- ค้นหาและซ้ำได้เร็วขึ้นเล็กน้อยเพราะคุณไม่ได้จัดการกับวิธีการอุทธรณ์ค่าใช้จ่าย:
foo[n]
dereferences และไม่บางเบื้องหลังฉากคำนวณตัวชี้ในขณะที่foo.get(n)
มีการ dereference ทำวิธีการภาวนาทำ dereference สองและจากนั้นอาจจะทำเลขคณิตชี้ (ถ้าคุณใช้ ArrayList; LinkedLists อาจต้องวนซ้ำทุกองค์ประกอบของรายการ)
- การกำหนดค่าเริ่มต้นนั้นสะอาดกว่ามาก:
int[] foo = new int[]{1, 2, 3, 4, 5}
เทียบกับข้อเสนอแนะในคำถาม StackOverflow อื่น