"ฉันอยู่นี่."

“สวัสดี เอลลี่!”

"วันนี้เราจะพูดถึงหัวข้อที่น่าสนใจ ฉันจะบอกคุณเกี่ยวกับ คลาส ArrayList "

"คลาสใหม่ เจ๋ง! ทำอะไรได้บ้าง"

"ผมขอเริ่มด้วยเรื่องราวเบื้องหลัง สิ่งเดียวที่โปรแกรมเมอร์ไม่ชอบเกี่ยวกับอาร์เรย์คือคุณไม่สามารถเปลี่ยนขนาดของมันได้ คุณจะทำอย่างไรถ้าคุณต้องการเพิ่มองค์ประกอบอีกสามองค์ประกอบในอาร์เรย์ที่มีสล็อตว่างเพียงช่องเดียว "

"ทางออกเดียวสำหรับปัญหานี้คือการสร้างอาร์เรย์ขนาดใหญ่มาก เพื่อรับประกันว่าคุณมีพื้นที่เพียงพอสำหรับองค์ประกอบทั้งหมด อย่างไรก็ตาม นี่มักจะหมายถึงหน่วยความจำที่สูญเปล่า หากอาร์เรย์มักมีองค์ประกอบสามองค์ประกอบ แต่มีโอกาสน้อยที่สุด ที่อาจต้องรองรับองค์ประกอบ 100 รายการ คุณต้องสร้างอาร์เรย์ 100 องค์ประกอบ"

"แล้วโปรแกรมเมอร์คิดอย่างไร"

"พวกเขาเขียน คลาส ArrayListซึ่งทำสิ่งเดียวกับ Array แต่สามารถเปลี่ยนขนาดของมันได้"

"น่าสนใจ พวกเขาทำอย่างนั้นได้อย่างไร"

"ออบเจกต์ ArrayListทุกรายการเก็บอาร์เรย์ขององค์ประกอบปกติ เมื่อคุณอ่านองค์ประกอบจาก ArrayList มันจะอ่านจากอาร์เรย์ด้านใน เมื่อคุณเขียนองค์ประกอบเหล่านี้ไปยังArrayListมันจะเขียนองค์ประกอบเหล่านี้ไปยังอาร์เรย์ด้านใน เปรียบเทียบคอลัมน์เหล่านี้ที่นี่:"

อาร์เรย์ รายการอาร์เรย์
สร้างคอนเทนเนอร์สำหรับองค์ประกอบ
String[] list = new String[10];
ArrayList<String> list = new ArrayList<String>();
รับจำนวนองค์ประกอบ
int n = list.length;
int n = list.size();
รับองค์ประกอบจากอาร์เรย์/คอลเลกชัน
String s = list[3];
String s = list.get(3);
เขียนองค์ประกอบลงในอาร์เรย์
list[3] = s;
list.set(3, s);

"ทำไม ArrayList ถึงดีกว่า เท่าที่ฉันสามารถบอกได้ว่าตอนนี้โค้ดยาวขึ้น"

"ประการแรกArrayListรองรับการดำเนินการเพิ่มเติมหลายอย่างที่โปรแกรมเมอร์ต้องดำเนินการตลอดเวลา อาร์เรย์ธรรมดาไม่สนับสนุนการดำเนินการเหล่านี้ ตัวอย่างเช่นการแทรกหรือลบองค์ประกอบจากตรงกลางของอาร์เรย์โดยไม่เว้นช่องว่าง "

"อย่างที่สองความสามารถในการเปลี่ยนขนาดของอาร์เรย์เมื่อคุณต้องการเพิ่มอีกหนึ่งองค์ประกอบ แต่อาร์เรย์ภายในไม่มีช่องว่างเลย นี่คือสิ่งที่เกิดขึ้นภายในArrayList :

ก) มีการสร้างอาร์เรย์อื่นที่ใหญ่กว่าอาร์เรย์ภายในปัจจุบัน 50% บวกหนึ่งองค์ประกอบ

b) องค์ประกอบทั้งหมดจากอาร์เรย์เก่าจะถูกคัดลอกไปยังอาร์เรย์ใหม่

c) อาร์เรย์ใหม่จะถูกบันทึกเป็นอาร์เรย์ภายในของวัตถุ ArrayList อาร์เรย์เก่าถูกประกาศเป็นขยะ (เราเพียงหยุดการจัดเก็บการอ้างอิงถึงอาร์เรย์นั้น)"

อาร์เรย์ รายการอาร์เรย์
เพิ่มองค์ประกอบที่ส่วนท้ายของอาร์เรย์
ไม่สนับสนุนการดำเนินการนี้
list.add(s);
เพิ่มองค์ประกอบที่อยู่ตรงกลางของอาร์เรย์
ไม่สนับสนุนการดำเนินการนี้
list.add(15, s);
เพิ่มองค์ประกอบที่จุดเริ่มต้นของอาร์เรย์
ไม่สนับสนุนการดำเนินการนี้
list.add(0, s);
ลบองค์ประกอบออกจากอาร์เรย์
เราสามารถลบองค์ประกอบด้วยlist[3] = null. แต่สิ่งนี้จะทำให้ 'รู' อยู่ในอาร์เรย์
list.remove(3);

"เราจะทำงานกับ ArrayList นี้ได้อย่างไร"

"อันที่จริง เหมือนกับที่เราทำกับอาร์เรย์ทั่วไป ดูสิ ลองเปรียบเทียบการทำงานกับ ArrayList กับการทำงานกับอาร์เรย์ สมมติว่าเราต้อง ' อ่านใน 10 สตริงและแสดงบนหน้าจอตามลำดับที่กลับกัน '"

"ดูนี่สิ:

ด้วยอาร์เรย์
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
  String s = reader.readLine();
  list[i] = s;
}

// Display the contents of the array
for (int i = 0; i < list.length; i++)
{
  int j = list.length - i - 1;
  System.out.println( list[j] );
}
}
ด้วย ArrayList
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++)
{
  String s = reader.readLine();
  list.add(s);
}

// Display the contents of the collection
for (int i = 0; i < list.size(); i++)
{
  int j = list.size() - i - 1;
  System.out.println( list.get(j) );
}
}

ฉันใช้สีเดียวกันเพื่อเน้นการทำงานที่คล้ายกันในแต่ละคอลัมน์"

"ในด้านหนึ่ง ทุกสิ่งทุกอย่างแตกต่างออกไป อีกด้านหนึ่ง ก็ยังคงเหมือนเดิม"

"ถูกต้อง ยกเว้นว่าเราจะไม่ใช้วงเล็บเหลี่ยมเมื่อทำงานกับArrayListแต่เราใช้ วิธี get , setและเพิ่ม "

“ใช่ ฉันเก็บมาเยอะขนาดนั้น แต่ก็ยังดูเหมือนเดิมมาก”