Lists

ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

Jim White

Java Developer

อินเทอร์เฟซ List

  • อินเทอร์เฟซ List เป็น sub-interface ของ Collection
    • กำหนดกลุ่มของอ็อบเจกต์ที่มีลำดับ
    • รองรับอ็อบเจกต์ที่ซ้ำกันได้
  • มีการ implement List หลายแบบ
    • พฤติกรรมคล้ายกันทุกแบบ
    • การ implement เป็นตัวกำหนดวิธีจัดการอ็อบเจกต์ภายใน
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

การ implement List

  • ArrayList — รายการอ็อบเจกต์แบบมีลำดับ ปรับขนาดได้ และเข้าถึงด้วย index (คล้าย array)

ArrayList คล้ายกับ array ของ Java ที่มี index สำหรับแต่ละสมาชิก

  • LinkedList — อ็อบเจกต์ที่เชื่อมต่อกันด้วย link ไปยังอ็อบเจกต์ถัดไปและก่อนหน้า

LinkedList คือรายการอ็อบเจกต์ที่เชื่อมต่อกันด้วย pointer

  • ไม่ว่าจะ implement แบบใด การเพิ่ม ลบ และแก้ไขอ็อบเจกต์ใช้วิธีเดียวกัน
1 See https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html for List types and details
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

ArrayList

  • สร้าง instance ด้วย new และใช้ generics ระบุชนิดของข้อมูล
  • เพิ่มอ็อบเจกต์ที่ท้ายรายการด้วย .add(object)
  • เข้าถึงอ็อบเจกต์ด้วย .get(index)
    • ArrayList ใช้ index เริ่มต้นที่ศูนย์
  • แทนที่/แก้ไขอ็อบเจกต์ด้วย .set(index, object)
  • ลบอ็อบเจกต์ด้วย .remove(index)
  • ล้างอ็อบเจกต์ทั้งหมดด้วย .clear()
  • นับจำนวนอ็อบเจกต์ด้วย .size()
import java.util.ArrayList;
...
ArrayList<String> animals
  = new ArrayList<String>();

animals.add("horse"); animals.add("cow"); animals.add("horse"); // Duplicates allowed
String c = animals.get(1); // c="cow" animals.set(1, "chicken");
// Removes the first horse animals.remove(0); // Removes all objects animals.clear();
animals.size();
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

อ็อบเจกต์และ primitive

  • ใช้ wrapper เพื่อเพิ่ม primitive เข้าไปใน Collections Framework
  • primitive ที่เพิ่มเข้าไปจะถูก "autobox"
    • Autobox: กระบวนการห่อ primitive ด้วย wrapper โดยอัตโนมัติ
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(5));
list.add(6);  // 6 is automatically wrapped by Integer then added
  • Autoboxing ใช้ได้กับ Collections Framework ทุกประเภท
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

Collection แบบ Heterogeneous

  • โครงสร้างข้อมูลใน Collections Framework สามารถเป็น heterogenous ได้
    • Heterogenous = เก็บอ็อบเจกต์ต่างชนิดกัน
    • ใช้ Object เป็น parameterized type
ArrayList<Object> list = new ArrayList<Object>(); // Allow any object
list.add(new Integer(5)); // Add an Integer
list.add(6); // Add an Integer using autoboxing
list.add("Hello"); // Add a String
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

การวนลูปใน List

  • ใช้ syntax "for each" เพื่อวนลูปผ่านอ็อบเจกต์ใน List
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");

for (String animal : animals) { // fore-each to loop through all in the ArrayList
    System.out.println(animal);
}
horse
cow
chicken
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

การใช้ println กับ List

  • แสดงเนื้อหาของ List (เช่น ArrayList) ด้วย println ได้โดยตรง
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");
System.out.println(animals);  // Display all the elements in the ArrayList

ArrayList<Object> list = new ArrayList<Object>();
list.add(5);
list.add("Hello");
System.out.println(list);  // Display all the elements in the ArrayList
[horse, cow, chicken]
[5, Hello]
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

LinkedList

  • สร้าง LinkedList ในลักษณะเดียวกับ ArrayList
  • LinkedList มีเมธอดเหมือนกับ ArrayList
import java.util.LinkedList;
...
LinkedList<String> cars // Create a new ...
  = new LinkedList<String>(); // ... LinkedList
cars.add("Ford"); // Add an object to the list
cars.add("Mercedes");
String c = cars.get(1);
cars.set(1, "Toyota"); // Replace an object
System.out.println(cars); // Display the list
cars.remove(0); // Remove an object
cars.clear();  // Remove all objects
cars.size(); // Get the list length
[Ford, Toyota]
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

เมธอดเพิ่มเติมของ LinkedList

  • เมธอดเพิ่มเติม
    • addFirst() เพิ่มที่ต้นรายการ
    • addLast() เพิ่มที่ท้ายรายการ
    • removeFirst() ลบจากต้นรายการ
    • removeLast() ลบจากท้ายรายการ
cars.addFirst("Fiat"); // Add to the beginning
cars.addLast("BMW"); // Add the the end
cars.removeFirst(); // Remove the first object
cars.removeLast(); // Remove the last object
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

ความคล้ายคลึงของประเภทใน Collection

  • ArrayList และ LinkedList มีรูปแบบการใช้งานคล้ายกัน
    • ประเภทอื่นใน Collections Framework ก็มีความคล้ายคลึงกันเช่นนี้
    • ซึ่งเป็นการออกแบบที่ตั้งใจไว้
  • ทั้งสองใช้อินเทอร์เฟซเดียวกัน: List
    • เป็นตัวอย่างของ polymorphism ("many-forms")
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

ArrayList vs LinkedList

  • การดำเนินการกับ ArrayList และ LinkedList (หรือ List ใดก็ตาม) เหมือนกัน
    • การเลือกประเภท List ขึ้นอยู่กับการใช้งาน
  • ข้อพิจารณาสำหรับ ArrayList:
    • เข้าถึงแบบสุ่มได้เร็ว (เช่น list.get(11))
    • ช้ากว่าเมื่อเพิ่มหรือลบสมาชิกตรงกลาง
    • เพราะต้องเลื่อนอ็อบเจกต์จริง ๆ เมื่อแทรกหรือลบ

การเพิ่มอ็อบเจกต์ตรงกลาง ArrayList ต้องเลื่อนสมาชิกจำนวนมาก

ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

ArrayList vs LinkedList

  • ข้อพิจารณาสำหรับ LinkedList:
    • เข้าถึงแบบสุ่มช้ากว่า (เช่น list.get(11))
    • เพิ่มและลบสมาชิกตรงกลางได้เร็วกว่า
    • เพราะไม่ต้องเลื่อนอ็อบเจกต์ เพียงเปลี่ยน reference สองสามจุด

การเพิ่มอ็อบเจกต์ตรงกลาง LinkedList ต้องเปลี่ยนแค่ pointer บางตัว

ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

มาฝึกกันเถอะ!

ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

Preparing Video For Download...