1. ArrayListมีโครงสร้าง อย่างไร
ArrayListเป็นคลาส Java ที่ใช้บ่อยที่สุดสำหรับการจัดเก็บองค์ประกอบ ทำงาน อย่างไรArrayListและทำไมทุกคนถึงชอบมันมาก?
โครงสร้างของArrayListง่ายและแยบยล แต่ละArrayListวัตถุมีสองฟิลด์:
- อาร์เรย์ขององค์ประกอบ
- ตัวแปร
sizeที่เก็บจำนวนองค์ประกอบในรายการ
ภายในArrayListวัตถุประกอบด้วยอาร์เรย์ธรรมดาที่สุด! แต่นั่นไม่ใช่ทั้งหมด นอกจากนี้ยังมี ตัวแปร ขนาดที่เก็บความยาวของรายการ นี่คือวิธีการทำงาน:
ในขั้นต้น ความยาวของอาร์เรย์ภายในรายการคือ 10 และsizeตัวแปรคือ 0
หากคุณเพิ่มองค์ประกอบในรายการ องค์ประกอบนั้นจะถูกจัดเก็บไว้ในเซลล์ที่ 0 ของอาร์เรย์ และsizeจะเพิ่มเป็น 1
หากคุณเพิ่มอีกหนึ่งองค์ประกอบ องค์ประกอบนั้นจะถูกเก็บไว้ในเซลล์ที่ 1 และsizeจะเพิ่มขึ้นอีก 1 และกลายเป็นเท่ากับสอง
หากคุณเพิ่มองค์ประกอบอื่นเมื่อไม่มีที่ว่างในอาร์เรย์แล้ว สิ่งต่อไปนี้จะเกิดขึ้นในเมธอดadd():
- อาร์เรย์ใหม่ถูกสร้างขึ้นโดยมีความยาวหนึ่งเท่าครึ่งของอาร์เรย์ก่อนหน้า
- องค์ประกอบทั้งหมด ของอาร์เรย์เก่าจะถูกคัดลอก ไปยังอาร์เรย์ใหม่
- ใน
ArrayListวัตถุ การอ้างอิงไปยังอาร์เรย์ ใหม่จะแทนที่การอ้างอิงไปยังอาร์เรย์เก่า - องค์ประกอบที่ผ่านจะถูกบันทึกไว้ในเซลล์ที่ 10 ของอาร์เรย์ใหม่
- ตัวแปรขนาดเพิ่มขึ้น 1และจะเท่ากับ 11
สิ่งที่คล้ายกันเกิดขึ้นเมื่อเพิ่ม (แทรก) องค์ประกอบตรงกลางรายการ องค์ประกอบที่มีอยู่จะถูกเลื่อนไปทางขวา 1 และองค์ประกอบที่ผ่านจะถูกเขียนลงในเซลล์ที่เพิ่งว่างของอาร์เรย์
ตอนนี้เราจะพิจารณาสถานการณ์พื้นฐานที่เกี่ยวข้องกับรายการ:
2. การเพิ่มองค์ประกอบให้กับArrayList
มาดูกันว่าเกิดอะไรขึ้นในรายการเมื่อมีการเพิ่มองค์ประกอบเข้าไป ทันทีหลังจากสร้าง ArrayList object เราจะมีสิ่งต่อไปนี้ในหน่วยความจำ:

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

ตอนนี้อาร์เรย์เก็บองค์ประกอบ 5 และsize == 1.
ถ้ามีคนเรียกใช้size()เมธอดบนArrayListออบเจกต์ของเราตอนนี้ ค่าที่ส่งคืนจะเป็นจำนวนองค์ประกอบที่จัดเก็บไว้ในรายการ: 1. จำนวนองค์ประกอบในรายการไม่เหมือนกับความจุของหน่วยเก็บข้อมูลของอาร์เรย์
ทั้งความจุปัจจุบันและตัวอาร์เรย์จะไม่สามารถเข้าถึงได้ (มองเห็นได้) ภายนอกArrayListวัตถุ นี่คือและจะเป็นArrayListข้อมูลภายในของ
เพิ่มตัวเลขอีก 7 รายการในรายการ: 10, 20, 30, 40, 50, 60, 70
ตอนนี้หน่วยความจำจะมีลักษณะดังนี้:

หากคุณเรียกsize()เมธอดตอนนี้ มันจะส่งคืนหมายเลข 8 ซึ่งเป็นจำนวนองค์ประกอบใหม่ในรายการ ค่านี้ไม่เกี่ยวข้องกับขนาดของอาร์เรย์ภายใน
มีหนึ่งการทำให้เข้าใจง่ายเกินไปในภาพนี้
คลาส ไม่สามารถจัด เก็บArrayListประเภทดั้งเดิมได้ ดังนั้นจึงใช้Integerประเภทแทน intคอนเทนเนอร์ไม่ได้จัดเก็บค่า {5, 10, 20, 30, 40, 50, 60, 70} โดยตรง แต่อ้างอิงถึงIntegerวัตถุ เซลล์ว่างทั้งหมดในที่เก็บnullคอนเทนเนอร์
3. เพิ่มความยาวของรายการ
มาดูกันว่าเกิดอะไรขึ้นในรายการเมื่อไม่มีเซลล์ว่างในอาร์เรย์ภายใน
สมมติว่าเรามีรายการองค์ประกอบ 10 รายการ:

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

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

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

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

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

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

ตอนนี้อาร์เรย์เก็บองค์ประกอบ 5 และsize == 1.
ถ้ามีคนเรียกใช้size()เมธอดบนArrayListออบเจกต์ของเราตอนนี้ ค่าที่ส่งคืนจะเป็นจำนวนองค์ประกอบที่จัดเก็บไว้ในรายการ: 1. จำนวนองค์ประกอบในรายการไม่เหมือนกับความจุของหน่วยเก็บข้อมูลของอาร์เรย์
ทั้งความจุปัจจุบันและตัวอาร์เรย์จะไม่สามารถเข้าถึงได้ (มองเห็นได้) ภายนอกArrayListวัตถุ นี่คือและจะเป็นArrayListข้อมูลภายในของ
เพิ่มตัวเลขอีก 7 รายการในรายการ: 10, 20, 30, 40, 50, 60, 70
ตอนนี้หน่วยความจำจะมีลักษณะดังนี้:

หากคุณเรียกsize()เมธอดตอนนี้ มันจะส่งคืนหมายเลข 8 ซึ่งเป็นจำนวนองค์ประกอบใหม่ในรายการ ค่านี้ไม่เกี่ยวข้องกับขนาดของอาร์เรย์ภายใน
มีหนึ่งการทำให้เข้าใจง่ายเกินไปในภาพนี้
คลาส ไม่สามารถจัด เก็บArrayListประเภทดั้งเดิมได้ ดังนั้นจึงใช้Integerประเภทแทน intคอนเทนเนอร์ไม่ได้จัดเก็บค่า {5, 10, 20, 30, 40, 50, 60, 70} โดยตรง แต่อ้างอิงถึงIntegerวัตถุ เซลล์ว่างทั้งหมดในที่เก็บnullคอนเทนเนอร์
3. เพิ่มความยาวของรายการ
มาดูกันว่าเกิดอะไรขึ้นในรายการเมื่อไม่มีเซลล์ว่างในอาร์เรย์ภายใน
สมมติว่าเรามีรายการองค์ประกอบ 10 รายการ:

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

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

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

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

GO TO FULL VERSION