1. ArrayListมีโครงสร้าง อย่างไร

ArrayListเป็นคลาส Java ที่ใช้บ่อยที่สุดสำหรับการจัดเก็บองค์ประกอบ ทำงาน อย่างไรArrayListและทำไมทุกคนถึงชอบมันมาก?

โครงสร้างของArrayListง่ายและแยบยล แต่ละArrayListวัตถุมีสองฟิลด์:

  • อาร์เรย์ขององค์ประกอบ
  • ตัวแปรsizeที่เก็บจำนวนองค์ประกอบในรายการ

ภายในArrayListวัตถุประกอบด้วยอาร์เรย์ธรรมดาที่สุด! แต่นั่นไม่ใช่ทั้งหมด นอกจากนี้ยังมี ตัวแปร ขนาดที่เก็บความยาวของรายการ นี่คือวิธีการทำงาน:

ในขั้นต้น ความยาวของอาร์เรย์ภายในรายการคือ 10 และsizeตัวแปรคือ 0

หากคุณเพิ่มองค์ประกอบในรายการ องค์ประกอบนั้นจะถูกจัดเก็บไว้ในเซลล์ที่ 0 ของอาร์เรย์ และsizeจะเพิ่มเป็น 1

หากคุณเพิ่มอีกหนึ่งองค์ประกอบ องค์ประกอบนั้นจะถูกเก็บไว้ในเซลล์ที่ 1 และsizeจะเพิ่มขึ้นอีก 1 และกลายเป็นเท่ากับสอง

หากคุณเพิ่มองค์ประกอบอื่นเมื่อไม่มีที่ว่างในอาร์เรย์แล้ว สิ่งต่อไปนี้จะเกิดขึ้นในเมธอดadd():

  1. อาร์เรย์ใหม่ถูกสร้างขึ้นโดยมีความยาวหนึ่งเท่าครึ่งของอาร์เรย์ก่อนหน้า
  2. องค์ประกอบทั้งหมด ของอาร์เรย์เก่าจะถูกคัดลอก ไปยังอาร์เรย์ใหม่
  3. ในArrayListวัตถุ การอ้างอิงไปยังอาร์เรย์ ใหม่จะแทนที่การอ้างอิงไปยังอาร์เรย์เก่า
  4. องค์ประกอบที่ผ่านจะถูกบันทึกไว้ในเซลล์ที่ 10 ของอาร์เรย์ใหม่
  5. ตัวแปรขนาดเพิ่มขึ้น 1และจะเท่ากับ 11

สิ่งที่คล้ายกันเกิดขึ้นเมื่อเพิ่ม (แทรก) องค์ประกอบตรงกลางรายการ องค์ประกอบที่มีอยู่จะถูกเลื่อนไปทางขวา 1 และองค์ประกอบที่ผ่านจะถูกเขียนลงในเซลล์ที่เพิ่งว่างของอาร์เรย์

ตอนนี้เราจะพิจารณาสถานการณ์พื้นฐานที่เกี่ยวข้องกับรายการ:


2. การเพิ่มองค์ประกอบให้กับArrayList

มาดูกันว่าเกิดอะไรขึ้นในรายการเมื่อมีการเพิ่มองค์ประกอบเข้าไป ทันทีหลังจากสร้าง ArrayList object เราจะมีสิ่งต่อไปนี้ในหน่วยความจำ:

การเพิ่มองค์ประกอบใน ArrayList

เรามีArrayListวัตถุที่มีสองฟิลด์ (สองตัวแปร): คอนเทนเนอร์ ( dataอาร์เรย์) และจำนวนองค์ประกอบที่เก็บไว้ ( size) ตัวแปรdataจัดเก็บการอ้างอิงไปยังคอนเทนเนอร์ (อาร์เรย์) ที่สามารถจัดเก็บองค์ประกอบได้ 10 รายการ

หากเราตัดสินใจเพิ่มหมายเลข 5 ลงในอาร์เรย์ เราจะได้ภาพต่อไปนี้:

การเพิ่มองค์ประกอบใน ArrayList 2

ตอนนี้อาร์เรย์เก็บองค์ประกอบ 5 และsize == 1.

ถ้ามีคนเรียกใช้size()เมธอดบนArrayListออบเจกต์ของเราตอนนี้ ค่าที่ส่งคืนจะเป็นจำนวนองค์ประกอบที่จัดเก็บไว้ในรายการ: 1. จำนวนองค์ประกอบในรายการไม่เหมือนกับความจุของหน่วยเก็บข้อมูลของอาร์เรย์

ทั้งความจุปัจจุบันและตัวอาร์เรย์จะไม่สามารถเข้าถึงได้ (มองเห็นได้) ภายนอกArrayListวัตถุ นี่คือและจะเป็นArrayListข้อมูลภายในของ

เพิ่มตัวเลขอีก 7 รายการในรายการ: 10, 20, 30, 40, 50, 60, 70

ตอนนี้หน่วยความจำจะมีลักษณะดังนี้:

การเพิ่มองค์ประกอบใน ArrayList

หากคุณเรียกsize()เมธอดตอนนี้ มันจะส่งคืนหมายเลข 8 ซึ่งเป็นจำนวนองค์ประกอบใหม่ในรายการ ค่านี้ไม่เกี่ยวข้องกับขนาดของอาร์เรย์ภายใน

สำคัญ:

มีหนึ่งการทำให้เข้าใจง่ายเกินไปในภาพนี้

คลาส ไม่สามารถจัด เก็บArrayListประเภทดั้งเดิมได้ ดังนั้นจึงใช้Integerประเภทแทน intคอนเทนเนอร์ไม่ได้จัดเก็บค่า {5, 10, 20, 30, 40, 50, 60, 70} โดยตรง แต่อ้างอิงถึงIntegerวัตถุ เซลล์ว่างทั้งหมดในที่เก็บnullคอนเทนเนอร์



3. เพิ่มความยาวของรายการ

มาดูกันว่าเกิดอะไรขึ้นในรายการเมื่อไม่มีเซลล์ว่างในอาร์เรย์ภายใน

สมมติว่าเรามีรายการองค์ประกอบ 10 รายการ:

เพิ่มความยาวของรายการ

เราตัดสินใจที่จะเพิ่มหมายเลข100เข้าไป นี่คือสิ่งที่เกิดขึ้นในadd()วิธีการ:

ขั้นตอนที่ 1 — สร้างอาร์เรย์ใหม่:

การเพิ่มความยาวของรายการ 2

ขั้นตอนที่ 2 — คัดลอกองค์ประกอบทั้งหมดจากอาร์เรย์เก่าไปยังองค์ประกอบใหม่:

การเพิ่มความยาวของรายการ 2

ขั้นตอนที่ 3 — แทนที่อาร์เรย์เก่า (เปลี่ยนการอ้างอิงไปยังArrayListอาร์เรย์ภายในของวัตถุ):

การเพิ่มความยาวของรายการ 3

ขั้นตอนที่ 4 — เพิ่มหมายเลขใหม่ซึ่งเป็นสิ่งที่เราทำงานอย่างหนักเพื่อให้สำเร็จ:

การเพิ่มความยาวของรายการ 4


2. การเพิ่มองค์ประกอบให้กับArrayList

มาดูกันว่าเกิดอะไรขึ้นในรายการเมื่อมีการเพิ่มองค์ประกอบเข้าไป ทันทีหลังจากสร้าง ArrayList object เราจะมีสิ่งต่อไปนี้ในหน่วยความจำ:

การเพิ่มองค์ประกอบใน ArrayList

เรามีArrayListวัตถุที่มีสองฟิลด์ (สองตัวแปร): คอนเทนเนอร์ ( dataอาร์เรย์) และจำนวนองค์ประกอบที่เก็บไว้ ( size) ตัวแปรdataจัดเก็บการอ้างอิงไปยังคอนเทนเนอร์ (อาร์เรย์) ที่สามารถจัดเก็บองค์ประกอบได้ 10 รายการ

หากเราตัดสินใจเพิ่มหมายเลข 5 ลงในอาร์เรย์ เราจะได้ภาพต่อไปนี้:

การเพิ่มองค์ประกอบใน ArrayList 2

ตอนนี้อาร์เรย์เก็บองค์ประกอบ 5 และsize == 1.

ถ้ามีคนเรียกใช้size()เมธอดบนArrayListออบเจกต์ของเราตอนนี้ ค่าที่ส่งคืนจะเป็นจำนวนองค์ประกอบที่จัดเก็บไว้ในรายการ: 1. จำนวนองค์ประกอบในรายการไม่เหมือนกับความจุของหน่วยเก็บข้อมูลของอาร์เรย์

ทั้งความจุปัจจุบันและตัวอาร์เรย์จะไม่สามารถเข้าถึงได้ (มองเห็นได้) ภายนอกArrayListวัตถุ นี่คือและจะเป็นArrayListข้อมูลภายในของ

เพิ่มตัวเลขอีก 7 รายการในรายการ: 10, 20, 30, 40, 50, 60, 70

ตอนนี้หน่วยความจำจะมีลักษณะดังนี้:

การเพิ่มองค์ประกอบใน ArrayList

หากคุณเรียกsize()เมธอดตอนนี้ มันจะส่งคืนหมายเลข 8 ซึ่งเป็นจำนวนองค์ประกอบใหม่ในรายการ ค่านี้ไม่เกี่ยวข้องกับขนาดของอาร์เรย์ภายใน

สำคัญ:

มีหนึ่งการทำให้เข้าใจง่ายเกินไปในภาพนี้

คลาส ไม่สามารถจัด เก็บArrayListประเภทดั้งเดิมได้ ดังนั้นจึงใช้Integerประเภทแทน intคอนเทนเนอร์ไม่ได้จัดเก็บค่า {5, 10, 20, 30, 40, 50, 60, 70} โดยตรง แต่อ้างอิงถึงIntegerวัตถุ เซลล์ว่างทั้งหมดในที่เก็บnullคอนเทนเนอร์



3. เพิ่มความยาวของรายการ

มาดูกันว่าเกิดอะไรขึ้นในรายการเมื่อไม่มีเซลล์ว่างในอาร์เรย์ภายใน

สมมติว่าเรามีรายการองค์ประกอบ 10 รายการ:

เพิ่มความยาวของรายการ

เราตัดสินใจที่จะเพิ่มหมายเลข100เข้าไป นี่คือสิ่งที่เกิดขึ้นในadd()วิธีการ:

ขั้นตอนที่ 1 — สร้างอาร์เรย์ใหม่:

การเพิ่มความยาวของรายการ 2

ขั้นตอนที่ 2 — คัดลอกองค์ประกอบทั้งหมดจากอาร์เรย์เก่าไปยังองค์ประกอบใหม่:

การเพิ่มความยาวของรายการ 2

ขั้นตอนที่ 3 — แทนที่อาร์เรย์เก่า (เปลี่ยนการอ้างอิงไปยังArrayListอาร์เรย์ภายในของวัตถุ):

การเพิ่มความยาวของรายการ 3

ขั้นตอนที่ 4 — เพิ่มหมายเลขใหม่ซึ่งเป็นสิ่งที่เราทำงานอย่างหนักเพื่อให้สำเร็จ:

การเพิ่มความยาวของรายการ 4