ArrayList มี property Count คืนค่าจำนวนสมาชิกที่มีอยู่จริง (ต่างจาก Capacity ที่เป็นความจุภายใน) ทำงานใน O(1) นอกจากนี้ยังมี Clear() ลบทั้งหมด และ TrimToSize() ลด capacity ให้เท่ากับ count
ตัวอย่างโค้ดที่ 1: หลาย ArrayList และ Capacity
using System;
using System.Collections;
public class Demo
{
public static void Main(string[] args)
{
ArrayList list1 = new ArrayList();
list1.Add("A");
list1.Add("B");
list1.Add("C");
list1.Add("D");
list1.Add("E");
list1.Add("F");
list1.Add("G");
list1.Add("H");
list1.Add("I");
Console.WriteLine("Elements in ArrayList1...");
foreach (string res in list1)
{
Console.WriteLine(res);
}
ArrayList list2 = new ArrayList();
list2.Add("A");
list2.Add("B");
list2.Add("C");
list2.Add("D");
list2.Add("E");
list2.Add("F");
list2.Add("G");
list2.Add("H");
list2.Add("I");
Console.WriteLine("Elements in ArrayList2...");
foreach (string res in list2)
{
Console.WriteLine(res);
}
ArrayList list3 = new ArrayList();
Console.WriteLine("Current capacity of ArrayList3: " + list3.Capacity);
list3 = list2; // Reference assignment
Console.WriteLine("Current capacity of ArrayList3 (Updated) " + list3.Capacity);
Console.WriteLine("Is ArrayList3 equal to ArrayList2? = " + list3.Equals(list2));
Console.WriteLine("Count of elements in ArrayList2 = " + list2.Count);
list2.Clear();
Console.WriteLine("Count of elements in ArrayList2 (Updated) = " + list2.Count);
}
}
ผลลัพธ์
Elements in ArrayList1...
A
B
C
D
E
F
G
H
I
Elements in ArrayList2...
A
B
C
D
E
F
G
H
I
Current capacity of ArrayList3: 0
Current capacity of ArrayList3: 16
Is ArrayList3 equal to ArrayList2? = True
Count of elements in ArrayList2 = 9
Count of elements in ArrayList2 (Updated) = 0
ตัวอย่างโค้ดที่ 2: Capacity และ Equals
using System;
using System.Collections;
public class Demo
{
public static void Main(string[] args)
{
ArrayList list1 = new ArrayList();
list1.Add("A");
list1.Add("B");
list1.Add("C");
list1.Add("D");
list1.Add("E");
list1.Add("F");
list1.Add("G");
list1.Add("H");
list1.Add("I");
Console.WriteLine("Current capacity of ArrayList1: " + list1.Capacity);
Console.WriteLine("Elements in ArrayList1...");
foreach (string res in list1)
{
Console.WriteLine(res);
}
ArrayList list2 = new ArrayList();
list2.Add("A");
list2.Add("B");
list2.Add("C");
list2.Add("D");
list2.Add("E");
list2.Add("F");
list2.Add("G");
list2.Add("H");
list2.Add("I");
Console.WriteLine("Elements in ArrayList2...");
foreach (string res in list2)
{
Console.WriteLine(res);
}
ArrayList list3 = new ArrayList();
list3 = list2; // Reference assignment
Console.WriteLine("Is ArrayList3 equal to ArrayList2? = " + list3.Equals(list2));
}
}
ผลลัพธ์
Current capacity of ArrayList1: 16
Elements in ArrayList1...
A
B
C
D
E
F
G
H
I
Elements in ArrayList2...
A
B
C
D
E
F
G
H
I
Is ArrayList3 equal to ArrayList2? = True
Count vs Capacity
| Property | คำอธิบาย |
|---|---|
Count | จำนวนสมาชิกที่มีอยู่จริง (logical size) |
Capacity | ขนาด array ภายใน (physical size) - ขยายอัตโนมัติ: 0→4→8→16→32→64... |
Count <= Capacityเสมอ- เมื่อ Add จน Count > Capacity จะ allocate array ใหญ่ขึ้น (ปกติคูณ 2) และ copy ข้อมูล
TrimToSize()ลด Capacity ให้เท่ากับ Count (ประหยัด memory)- Constructor
new ArrayList(capacity)กำหนด capacity เริ่มต้นได้
Equals() ของ ArrayList
- เป็น Reference Equality - true ก็ต่อเมื่อชี้อ็อบเจ็กต์เดียวกัน
list3 = list2; list3.Equals(list2)→ true- สอง ArrayList ที่มีเนื้อหาเหมือนกันแต่คนละ instance → false
- ใช้
list1.Cast<object>().SequenceEqual(list2.Cast<object>())(LINQ) สำหรับ value equality
แนวทางปฏิบัติ: ใช้ List<T> แทน
// แทน ArrayList
var list = new List { "A", "B", "C" };
Console.WriteLine(list.Count); // 3
Console.WriteLine(list.Capacity); // 4 (หรือมากกว่า)
list.TrimExcess(); // ลด capacity