การเปรียบเทียบเวกเตอร์ Java และ ArrayList
วันนี้ฉันศึกษาซอร์สโค้ดของเวกเตอร์และอาร์เรย์ลิสต์และความเข้าใจของฉันเกี่ยวกับสองชั้นนี้ให้ลึกซึ้งยิ่งขึ้น
มีสามคลาสที่ใช้ในอินเทอร์เฟซรายการ: ArrayList, Vector และ LinkedList ฉันจะไม่พูดมากเกี่ยวกับ LinkedList โดยทั่วไปจะใช้เพื่อรักษาลำดับการแทรกข้อมูล
ArrayList และ Vector มีการใช้งานโดยใช้อาร์เรย์และมีความแตกต่างหลักสามประการ:
1. เวกเตอร์มีหลายเธรดและปลอดภัยในขณะที่ ArrayList ไม่ได้ สามารถเห็นได้จากซอร์สโค้ด วิธีการหลายอย่างในคลาสเวกเตอร์ได้รับการแก้ไขโดยการซิงโครไนซ์ซึ่งนำไปสู่ประสิทธิภาพของเวกเตอร์ที่ไม่สามารถเปรียบเทียบกับ ArrayList ได้
2. ทั้งสองใช้องค์ประกอบการจัดเก็บอวกาศแบบต่อเนื่องเชิงเส้น แต่เมื่อพื้นที่ไม่เพียงพอทั้งสองคลาสจะถูกเพิ่มแตกต่างกัน ชาวเน็ตหลายคนบอกว่าเวกเตอร์เพิ่มพื้นที่เดิมเป็นสองเท่าและ ArrayList เพิ่มพื้นที่เดิม 50% อันที่จริงแล้วนี่เป็นเรื่องเดียวกัน อย่างไรก็ตามยังมีปัญหาบางอย่างที่สามารถเห็นได้จากซอร์สโค้ดและจะวิเคราะห์จากซอร์สโค้ดในภายหลัง
3. เวกเตอร์สามารถตั้งค่าปัจจัยการเจริญเติบโตได้ แต่ ArrayList ไม่สามารถทำได้ เมื่อฉันดูสิ่งนี้ครั้งแรกฉันไม่เข้าใจว่าปัจจัยที่เพิ่มขึ้นคืออะไร อย่างไรก็ตามฉันเข้าใจสิ่งนี้โดยการเปรียบเทียบซอร์สสองซอร์ส ก่อนอื่นให้ดูที่วิธีการก่อสร้างของทั้งสองคลาส:
ArrayList มีวิธีการก่อสร้างสามวิธี:
Public ArrayList (Int InitialCapacity) // สร้างรายการว่างที่มีความจุเริ่มต้นที่ระบุ Public ArrayList () // สร้างรายการว่างที่มีความจุเริ่มต้น 10. ArrayList สาธารณะ (คอลเลกชัน <? ขยาย e> c) // สร้างรายการองค์ประกอบที่มีคอลเลกชันที่ระบุ
เวกเตอร์มีสี่ตัวสร้าง:
เวกเตอร์สาธารณะ () // สร้างเวกเตอร์เปล่าโดยใช้ความจุเริ่มต้นและการเพิ่มความจุที่ระบุไว้เท่ากับศูนย์ เวกเตอร์สาธารณะ (int initialcapacity) // สร้างเวกเตอร์เปล่าเพื่อสร้างขนาดของอาร์เรย์ข้อมูลภายในและการเพิ่มกำลังการผลิตมาตรฐานเป็นศูนย์ เวกเตอร์สาธารณะ (คอลเลกชัน <? ขยาย e> c) // สร้างเวกเตอร์ที่มีองค์ประกอบในคอลเลกชันที่ระบุเวกเตอร์สาธารณะ (int เริ่มต้นความสามารถ
เวกเตอร์มีวิธีการก่อสร้างมากกว่าหนึ่งวิธี ถูกต้องวิธีการก่อสร้างของเวกเตอร์สาธารณะ (int initialcapacity, ความจุ int) กำลังการผลิตคือการเติบโตของกำลังการผลิตซึ่งเป็นปัจจัยการเจริญเติบโตที่กล่าวถึงข้างต้นซึ่งไม่สามารถใช้ได้ใน ArrayList
จากนั้นโพสต์สองคลาสเพื่อเพิ่มการวิเคราะห์ซอร์สโค้ด (เวอร์ชัน JDK1.7):
// arraylist คลาสเพิ่มซอร์สโค้ด: บูลีนสาธารณะเพิ่ม (e e) {ensureCapacityInternal (ขนาด + 1); // เพิ่ม modcount !! ElementData [ขนาด ++] = E; กลับมาจริง; } โมฆะส่วนตัว ensureCapacityInternal (int mincapacity) {modcount ++; // รหัสที่ใส่ใจเกินจริง // หากหลังจากเพิ่มองค์ประกอบขนาดของคอนเทนเนอร์ใหม่จะมากกว่าความจุของคอนเทนเนอร์แล้วค่าจะไม่ถูกบันทึก พื้นที่จะต้องขยายถ้า (mincapacity - elementData.length> 0) เติบโต (mincapacity); } โมฆะส่วนตัว Grow (int mincapacity) {// รหัสผ่านไหลล้น int oldcapacity = elementData.length; int newCapacity = oldCapacity + (oldcapacity >> 1); // พื้นที่ขยายตัวเพิ่มขึ้น 50% (นั่นคือ 1.5 เท่าของต้นฉบับ) ถ้า (newcapacity - mincapacity <0) // ถ้าคอนเทนเนอร์ยังไม่เพียงพอหลังจากการขยายตัวจากนั้นเพียงแค่ตั้งค่า mincapacity เป็นขนาดของคอนเทนเนอร์ newcapacity = mincapacity; ถ้า (newCapacity - max_array_size> 0) // ถ้าคอนเทนเนอร์ที่ขยายใหญ่เกินไปจากนั้นเรียกใช้ hugecapacity newcapacity = hugecapacity (mincapacity); // mincapacity มักจะใกล้เคียงกับขนาดดังนั้นนี่คือการชนะ: elementData = arrays.copyof (ElementData, newCapacity); - เพิ่มซอร์สโค้ดในคลาสเวกเตอร์:
บูลีนที่ซิงโครไนซ์สาธารณะเพิ่ม (e e) {modcount ++; ensurecapacityHelper (ElementCount + 1); ElementData [ElementCount ++] = E; กลับมาจริง; } โมฆะส่วนตัว ensureCapacityHelper (int mincapacity) {// รหัสที่ใส่ใจล้นถ้า (mincapacity - elementData.length> 0) เติบโต (mincapacity); } โมฆะส่วนตัว Grow (int mincapacity) {// รหัสผ่านไหลล้น int oldcapacity = elementData.length; int newCapacity = oldCapacity + ((ความสามารถในการผลิต> 0)? ความสามารถในการผลิต: oldCapacity); /** การขยายกำลังการผลิตนี้ต้องใช้การตัดสิน: หากการเพิ่มกำลังการผลิตไม่ได้เริ่มต้นด้วย 0 นั่นคือการเริ่มต้นของเวกเตอร์สาธารณะ (ความสามารถในการเริ่มต้น int, ความสามารถในการสร้างความจุ int), ความสามารถในการขยายกำลังการผลิต หากไม่ได้ตั้งค่าการเพิ่มกำลังการผลิตความจุหลังจากการขยายตัวคือ (OldCapacity+OldCapacity) ซึ่งเป็นความจุดั้งเดิมสองเท่า **/ ถ้า (newCapacity - mincapacity <0) newCapacity = mincapacity; if (newCapacity - max_array_size> 0) newcapacity = hugecapacity (mincapacity); elementData = arrays.copyof (ElementData, newCapacity); -ผ่านการวิเคราะห์มันควรจะเข้าใจได้ในตอนนี้!
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!