ArrayList และ Vector แตกต่างกันอย่างไร?


352

อะไรคือความแตกต่างระหว่างโครงสร้างข้อมูลทั้งสองArrayListและVectorและคุณควรใช้แต่ละโครงสร้างในที่ใด


5
ฉันไม่เห็นความซ้ำซ้อนแน่นอนที่นี่
Jeff Atwood

2
คุณสามารถสร้างเวกเตอร์ในภาษาจาวาได้เช่นกัน Vector v = new Vector(3, 2);
sgsi

ไม่เคยใช้Vectorใช้ArrayListหรือLinkedListหรือArrayDeque

คำตอบ:


365

ความแตกต่าง

  • เวกเตอร์ถูกซิงโครไนซ์ ArrayLists ไม่ใช่
  • วิธีการเติบโตของข้อมูล

ใช้ ArrayLists หากไม่มีข้อกำหนดเฉพาะในการใช้เวกเตอร์

การประสานข้อมูล

หากหลายเธรดเข้าถึง ArrayList พร้อมกันเราจะต้องซิงโครไนซ์บล็อกของโค้ดภายนอกซึ่งแก้ไขรายการทั้งแบบโครงสร้างหรือเพียงแค่ปรับเปลี่ยนองค์ประกอบ การดัดแปลงโครงสร้างหมายถึงการเพิ่มหรือลบองค์ประกอบจากรายการ การตั้งค่าขององค์ประกอบที่มีอยู่ไม่ใช่การดัดแปลงโครงสร้าง

Collections.synchronizedList โดยปกติจะใช้ในเวลาที่สร้างรายการเพื่อหลีกเลี่ยงการเข้าถึงรายการที่ไม่ตรงกันโดยไม่ได้ตั้งใจ

การอ้างอิง

การเติบโตของข้อมูล

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

การอ้างอิง


7
@Rei สิ่งที่เขาพูด: หลาย ๆ หัวข้อ ( docs.oracle.com/javase/tutorial/essential/concurrency/ ...... )
RecursiveExceptionException

แล้วการอ่านจาก ArrayList แบบมัลติเธรดล่ะ? ปลอดภัยไหม?
Xunie

@Xunie Reading จาก ArrayList หรือคลาสการรวบรวมอื่น ๆ จะไม่เป็นปัญหา ปัญหาเกิดขึ้นเมื่อคุณเพิ่มหรือลบหรือแก้ไขค่าที่มีอยู่ใน ArrayList หรือคอลเลกชัน
สายเลือดแดง

85

ดังที่เอกสารระบุว่า a Vectorและa ArrayListเกือบเทียบเท่า ความแตกต่างคือการเข้าถึง a Vectorถูกซิงโครไนซ์ในขณะที่การเข้าถึง a ArrayListไม่ใช่ สิ่งนี้หมายความว่ามีเพียงหนึ่งเธรดเท่านั้นที่สามารถเรียกใช้เมธอดในVectorแต่ละครั้งและมีค่าใช้จ่ายเล็กน้อยในการรับการล็อก หากคุณใช้สิ่งArrayListนี้จะไม่เกิดขึ้น โดยทั่วไปแล้วคุณจะต้องการที่จะใช้ArrayList; ในกรณีแบบเธรดเดียวเป็นตัวเลือกที่ดีกว่าและในกรณีแบบมัลติเธรดคุณจะสามารถควบคุมการล็อกได้ดียิ่งขึ้น ต้องการอนุญาตให้อ่านพร้อมกันหรือไม่ ละเอียด. ต้องการทำการซิงโครไนซ์หนึ่งครั้งสำหรับชุดการเขียนสิบชุดหรือไม่ ยังดี มันต้องใช้ความระมัดระวังมากขึ้นในตอนท้ายของคุณ แต่เป็นไปได้ว่าสิ่งที่คุณต้องการ โปรดทราบว่าหากคุณมี ArrayList คุณสามารถใช้Collections.synchronizedListVectorฟังก์ชั่นเพื่อสร้างรายการที่ตรงกันจึงได้รับคุณเทียบเท่าของ


53

Vectorเป็นเสียระดับที่เป็นไม่ด้ายแม้ว่ามันจะเป็น "ตรงกัน" และเพียงใช้โดยนักเรียนและโปรแกรมเมอร์ที่ไม่มีประสบการณ์อื่น ๆ

ArrayList เป็นการใช้งานแบบรายชื่อไปที่ใช้โดยผู้เชี่ยวชาญและโปรแกรมเมอร์ที่มีประสบการณ์

CopyOnWriteArrayListผู้เชี่ยวชาญด้านที่ต้องการรายการด้ายการใช้งานการดำเนินงาน


10
ทำข้อมูลให้ตรงกัน แต่ไม่ใช่ threadsafe หรือไม่ มันหมายความว่าอะไร? [ฉันเป็นผู้เริ่มต้น]
Dineshkumar

13
@Dineshkumar Vectorถูกตั้งใจที่จะเป็นด้าย แต่มีข้อบกพร่องการออกแบบที่ทำให้มัน * ไม่ได้อยู่ในความเป็นจริงด้าย, มันเป็นพื้นชั้นเลิก ด้วยเหตุผลบางอย่างมหาวิทยาลัยอื่น ๆ ยังไม่เคยได้ยินเกี่ยวกับข่าวนี้และยังสนับสนุนการใช้งาน
ภาษาโบฮีเมียน

1
@Dineshkumar ดูคำถามนี้
Bohemian

3
@Dineshkumar ขอโทษ - นั่นไม่ใช่ลิงค์ที่ดี นี่คือคำตอบที่ชัดเจน กล่าวโดยย่อการซิงโครไนซ์มันก็ไร้ประโยชน์
ภาษาโบฮีเมียน

7
ความจริงแล้วสนุก: Stack of Java1.7 ใช้คลาส Vector
Tobi

26

ArrayList ใหม่กว่าและเร็วกว่า 20-30%

หากคุณไม่ต้องการสิ่งที่ชัดเจนVectorให้ใช้ArrayList


32
คุณสามารถสนับสนุนข้อเรียกร้องด้วยการให้หลักฐาน20-30% fasterหรือไม่?
ผู้ใช้

5
@user ในขณะนั้นมันเป็นเพียงประสบการณ์ส่วนตัวจาก clunking aroun อาร์เรย์ขนาดใหญ่ กว่าสามปีต่อมาฉันไม่สามารถชี้ให้คุณเห็นอย่างชัดเจนถึงสิ่งที่ฉันพูดถึง แต่มีเกณฑ์มาตรฐานมากมาย มันไม่ได้จนกว่าเกลียวที่คุณเห็นการกระโดดที่ใหญ่ที่สุด แต่นี่คือหนึ่ง: javacodegeeks.com/2010/08/ …
Oli

การจับคู่ 20-30% เท่านั้นถ้าคุณอ่านและเขียนไปยัง Vector / Arraylist เนื่องจากฟังก์ชั่นการเติบโตจะสร้างผลกระทบที่ยิ่งใหญ่ที่สุด หากคุณมีเกณฑ์มาตรฐานที่เขียนเพียงครั้งเดียวจากนั้นทำการอ่านเพียงอย่างเดียวจะให้ผลลัพธ์ที่แตกต่าง
Tobi

2
โปรดแสดงหลักฐานต่อข้อมูลของคุณ
wiredmark

เนื่องจาก vector ถูกซิงโครไนซ์และ arraylist ไม่ถูกซิงโครไนซ์นั่นอาจเป็นเหตุผลทำให้ arraylist นั้นเร็วกว่า vector
ASK

23

มีความแตกต่างที่สำคัญ 2 อย่างระหว่าง Vector และ ArrayList

  1. Vector ถูกซิงโครไนซ์โดยค่าเริ่มต้นและ ArrayList ไม่ใช่ หมายเหตุ: คุณสามารถทำให้ ArrayList ตรงกันได้โดยการส่งวัตถุ arraylist ไปที่ Collections.synchronizedList () วิธีการ วิธีการซิงโครไนซ์: มันสามารถใช้กับหลายกระทู้โดยไม่มีผลข้างเคียงใด ๆ

  2. ArrayLists เพิ่มขึ้น 50% จากขนาดก่อนหน้านี้เมื่อพื้นที่ไม่เพียงพอสำหรับองค์ประกอบใหม่โดยที่ Vector จะเติบโต 100% จากขนาดก่อนหน้านี้เมื่อไม่มีที่ว่างสำหรับองค์ประกอบขาเข้าใหม่

นอกเหนือจากนี้มีความแตกต่างในทางปฏิบัติระหว่างพวกเขาในแง่ของความพยายามในการเขียนโปรแกรม:

  1. เพื่อให้ได้องค์ประกอบในตำแหน่งเฉพาะจาก Vector เราใช้ฟังก์ชัน elementAt (ดัชนี int) ชื่อฟังก์ชั่นนี้มีความยาวมาก ในสถานที่นี้ใน ArrayList เราได้รับ (ดัชนี int) ซึ่งง่ายต่อการจดจำและใช้
  2. ในทำนองเดียวกันเพื่อแทนที่องค์ประกอบที่มีอยู่ด้วยองค์ประกอบใหม่ใน Vector เราใช้เมธอด setElementAt () ซึ่งยาวมากและอาจทำให้โปรแกรมเมอร์ใช้งานซ้ำ ๆ ในสถานที่ของ ArrayList นี้มีวิธีการเพิ่ม (ดัชนี int วัตถุ) ซึ่งใช้งานง่ายและจำได้ เช่นนี้พวกเขามีโปรแกรมเมอร์ที่เป็นมิตรและใช้งานชื่อฟังก์ชั่นได้ง่ายขึ้นใน ArrayList

ควรใช้อันไหนดี?

  1. พยายามหลีกเลี่ยงการใช้เวกเตอร์อย่างสมบูรณ์ ArrayLists สามารถทำทุกสิ่งที่ Vector สามารถทำได้ มากกว่า ArrayLists โดยค่าเริ่มต้นจะไม่ถูกซิงโครไนซ์ หากคุณต้องการคุณสามารถซิงโครไนซ์มันเมื่อใดก็ตามที่คุณต้องการโดยใช้คลาส Collections util
  2. ArrayList ง่ายต่อการจดจำและใช้ชื่อฟังก์ชัน

หมายเหตุ : แม้ว่า arraylist จะเพิ่มขึ้น 100% แต่คุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยวิธี surecapacity () เพื่อให้แน่ใจว่าคุณได้จัดสรรหน่วยความจำเพียงพอในระยะเริ่มต้น

หวังว่ามันจะช่วย


5
ข้อมูลผิด (เปลี่ยน) ขนาดที่เพิ่มขึ้นสำหรับ ArrayLIst และ Vector เป็นคำตอบที่ค่อนข้างดี
Nenad Bulatovic

Grow of Vector เพิ่มขึ้นเป็นสองเท่าด้วยdocs.oracle.com/javase/7/docs/api/java/util/Vector.html ที่จำเป็นในขณะที่ ArrayList "ArrayList" รายละเอียดของนโยบายการเติบโตนั้นไม่ได้ระบุนอกเหนือจากข้อเท็จจริงที่ว่าการเพิ่มองค์ประกอบนั้นมี ต้นทุนเวลาตัดจำหน่ายอย่างต่อเนื่อง " docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib

ฉันไม่เข้าใจว่าชื่อวิธีสามารถใช้เป็นเกณฑ์ในการใช้หรือไม่ใช้วิธีนั้นได้
Surender Kherwa

14

ArrayListและVectorดำเนินการทั้งสองรายการอินเตอร์เฟสและรักษาลำดับการแทรก แต่มีความแตกต่างมากมายระหว่างArrayListและVectorคลาส ...

ArrayList -

  1. ArrayList ไม่ได้ทำข้อมูลให้ตรงกัน
  2. ArrayList เพิ่มขึ้น 50% ของขนาดอาร์เรย์ปัจจุบันถ้าจำนวนองค์ประกอบเกินจากความจุ
  3. ArrayList ไม่ใช่คลาสดั้งเดิมมันถูกนำมาใช้ใน JDK 1.2
  4. ArrayList รวดเร็วเพราะไม่ซิงโครไนซ์
  5. ArrayList ใช้ส่วนต่อประสาน Iterator เพื่อสำรวจองค์ประกอบ

เวกเตอร์ -

  1. Vector ถูกทำข้อมูลให้ตรงกัน
  2. Vector การเพิ่มขึ้น 100% หมายถึงการเพิ่มขนาดอาร์เรย์เป็นสองเท่าหากจำนวนองค์ประกอบทั้งหมดเกินความจุ
  3. Vector เป็นคลาสดั้งเดิม

  4. Vector ช้าเนื่องจากมีการซิงโครไนซ์เช่นในสภาพแวดล้อมมัลติเธรดเธรดจะเก็บเธรดอื่นในสถานะที่รันได้หรือไม่สามารถรันได้จนกว่าเธรดปัจจุบันจะปลดล็อกวัตถุ

  5. Vectorใช้อินเตอร์เฟสการแจงนับเพื่อสำรวจองค์ประกอบ แต่มันสามารถใช้ Iterator ได้เช่นกัน

ดูเพิ่มเติมที่: https://www.javatpoint.com/difference-between-arraylist-and-vector


10

โดยพื้นฐานแล้วทั้ง ArrayList และ Vector นั้นจะใช้ Object Array ภายใน

ArrayList:คลาส ArrayList ขยาย AbstractList และใช้รายการอินเตอร์เฟสและ RandomAccess (อินเทอร์เฟซตัวทำเครื่องหมาย) ArrayList รองรับอาร์เรย์แบบไดนามิกที่สามารถเติบโตได้ตามต้องการ มันทำให้เราวนซ้ำองค์ประกอบแรก ArrayList ใช้ Object Array ภายใน มันถูกสร้างขึ้นด้วยขนาดเริ่มต้นเริ่มต้นที่ 10 เมื่อเกินขนาดนี้การรวบรวมจะเพิ่มขึ้นโดยอัตโนมัติเป็นครึ่งหนึ่งของขนาดเริ่มต้นที่ 15

เวกเตอร์:เวกเตอร์คล้ายกับ ArrayList แต่ความแตกต่างมันถูกซิงโครไนซ์และขนาดเริ่มต้นเริ่มต้นคือ 10 และเมื่อขนาดเกินขนาดเพิ่มขึ้นเป็นสองเท่าของขนาดดั้งเดิมซึ่งหมายความว่าขนาดใหม่จะเป็น 20 เวกเตอร์เป็นคลาสเดียว นอกเหนือจาก ArrayList เพื่อใช้งาน RandomAccess เวกเตอร์มีตัวสร้างสี่ตัวจากนั้นใช้สองพารามิเตอร์เวกเตอร์ (int initialCapacity, int capacityIncrement)ความจุเป็นจำนวนที่เพิ่มความจุเมื่อเวกเตอร์ล้นดังนั้นจึงมีการควบคุมปัจจัยการโหลดมากขึ้น

ความแตกต่างอื่น ๆ ได้แก่ : ป้อนคำอธิบายรูปภาพที่นี่


1
ทำไมการเพิ่มวัตถุในตอนแรกและตอนท้ายใน LinkedList นั้นช้า ไม่ควรจะเร็วกว่าทั้ง arrayList และ vector ใช่ไหม
CHANist

@CHANist ฉันเห็นด้วย การเพิ่มวัตถุที่จุดเริ่มต้นและจุดสิ้นสุดควรเร็วกว่าการเพิ่มวัตถุที่อยู่ตรงกลาง
ราหุล Rastogi

1
ภาษาที่ใช้ในคอลัมน์ LinkedList ของตารางนี้มีความขัดแย้ง ทั้งการเพิ่มและต่อท้ายไปยัง LinkedList นั้นเร็วกว่าการเพิ่มองค์ประกอบที่อยู่ตรงกลาง แต่ช้ากว่าการเพิ่มหรือต่อท้ายกับ ArrayLists หรือเวกเตอร์ นี่เป็นเพราะทุกการแทรกต้องการการจัดสรรหน่วยความจำที่มีการอ้างอิงที่ไม่ใช่ในท้องถิ่นเพิ่มโอกาสในการพลาดแคช แม้ว่าการค้นหาใน LinkedList จะเป็นแบบเส้นตรงพร้อมด้วยจำนวนองค์ประกอบและตัวชี้ไปยังจุดสิ้นสุดไม่ได้ถูกจัดเก็บการผนวกจะยังเร็วกว่าการเตรียมการเนื่องจากหน่วยความจำจะถูกจัดสรรใหม่สำหรับองค์ประกอบเดียวเท่านั้น
Sophia Gold
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.