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