Trong bài này, chúng ta sẽ so sánh hiệu suất giữa hai kiểu dữ liệu List và ArrayList trong C#.
Lớp List
List dùng thể hiện một danh sách các đối tượng có kiểu mạnh và có thể được truy xuất theo chỉ mục (index). List chứa các phương thức như tìm kiếm, sắp xếp và xử lý danh sách. List có namespace là System.Collections.Generic và nằm trong thư viện mscorlib (in mscorlib.dll).
Cú pháp
[SerializableAttribute] public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>
List kế thừa các interface như IList, ICollection và IEnumerable. Trong đó, người dùng thường dùng List theo kiểu List<T> với T là dạng kiểu dữ liệu phần tử trong danh sách.
Ví dụ
Ví dụ tạo danh sách List gồm 3 phần tử, với mỗi phần tử kiểu string (chuỗi) và dùng vòng foreach để xuất ra màn hình.
List<string> list1 = new List<string>(); list1.Add("a"); list1.Add("dammio"); list1.Add("b"); foreach (var item in list1) { Console.WriteLine(item); } Console.ReadLine(); /* Kết quả a dammio b */
Lớp ArrayList
Lớp này kế thừa giao diện IList, sử dụng một mạng với kích thước tăng tự động. ArrayList thuộc namespace System.Collections và nằm trong thư viện mscorlib (ở mscorlib.dll).
Cú pháp
[SerializableAttribute] [ComVisibleAttribute(true)] public class ArrayList : IList, ICollection, IEnumerable, ICloneable
Điểm đặc biệt là các phần tử trong ArrayList có thể là bất kể kiểu dữ liệu gì (object), không cần định nghĩa trước và cũng không cần các phần tử có cùng kiểu dữ liệu.
Ví dụ
Ví dụ tạo danh sách ArrayList với phần tử chuỗi và phần tử số; sau đó xuất danh sách ra màn hình.
ArrayList arrayList1 = new ArrayList(); arrayList1.Add("a"); arrayList1.Add("dammio"); arrayList1.Add(1); foreach (var item in arrayList1) { Console.WriteLine(item); } Console.ReadLine();
So sánh List và ArrayList
List<T> là lớp chung (generic class), hỗ trợ việc lưu trữ dữ liệu của dạng đặc biệt nào đó mà không cần chuyển đổi sang/từ đối tượng. Vì là một tập chung, List<T> kế thừa giao diện chung IEnumerable<T> và có thể sử dụng dễ dàng trong LINQ mà không cần gọi Cast hay OfType. Trong khi đó, ArrayList đơn giản chỉ lưu trữ tham chiếu của đối tượng. Do đó, khi sử dụng List, bạn có thể tránh được lỗi chuyển đổi dữ liệu trong thời gian thực thi (runtime casting error). Ngược lại, khi dùng ArrayList, lúc biên dịch thì không báo lỗi về chuyển đổi dữ liệu, nhưng khi thực thi mã nguồn thì sẽ dính lỗi này.
Bạn có thể xét 2 ví dụ sau để thấy rõ điều trên.
ArrayList array2 = new ArrayList(); array2.Add(123); array2.Add("dammio"); // không có lỗi xảy ra int total = 0; foreach (int num in array2) { total += num; // lỗi xảy ra nếu thực hiện phép cộng với phần tử "dammio" trong lúc thực thi }
Nếu bạn dùng List, bạn có thể tránh lỗi chuyển đổi dữ liệu lúc thực thi.
List<int> list2 = new List<int>(); list2.Add(123); //list2.Add("dammio") //xảy ra lỗi ngay trong quá trình thêm dữ liệu, vì kiểu phần tử đã cố định là int int total = 0; foreach (int num in list2) { total += num; }
Tiếp theo, chúng ta hay so sánh hiệu suất tổng việc thực thi thêm và xóa phần tử với các danh sách từ 1 đến 100 phần tử. Điểm nhận xét thấy rõ, ArrayList có hiệu suất hơn hẳn List với danh sách từ 25 phần tử trở đi. Bạn có thể sử dụng đoạn mã so sánh như sau:
using System; using System.Collections.Generic; using System.Collections; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LINQ { class Program { static void Main(string[] args) { int times = 10000000; for (int listSize = 1; listSize < 100; listSize++) { List<string> list = new List<string>(); ArrayList array = new ArrayList(); for (int i = 0; i < listSize; i++) { list.Add("string" + i.ToString()); array.Add("string" + i.ToString()); } Stopwatch timer = new Stopwatch(); timer.Start(); for (int i = 0; i < times; i++) { list.Remove("string0"); list.Add("string0"); } timer.Stop(); Console.WriteLine(listSize.ToString() + " phan tu LIST, thoi gian thuc thi: " + timer.ElapsedMilliseconds.ToString() + "ms"); timer = new Stopwatch(); timer.Start(); for (int i = 0; i < times; i++) { array.Remove("string0"); array.Add("string0"); } timer.Stop(); Console.WriteLine(listSize.ToString() + " phan tu ARRAY, thoi gian thuc thi: " + timer.ElapsedMilliseconds.ToString() + "ms"); Console.WriteLine(); } Console.ReadLine(); } } }
Sau đây là dữ liệu kết quả đầu ra việc so sánh. Với số lượng phần tử càng lớn, thời gian thêm/xóa phần tử của ArrayList vẫn nhanh hơn so với List.
1 phan tu LIST, thoi gian thuc thi: 382ms 1 phan tu ARRAY, thoi gian thuc thi: 469ms 2 phan tu LIST, thoi gian thuc thi: 442ms 2 phan tu ARRAY, thoi gian thuc thi: 552ms 3 phan tu LIST, thoi gian thuc thi: 515ms 3 phan tu ARRAY, thoi gian thuc thi: 631ms 4 phan tu LIST, thoi gian thuc thi: 583ms 4 phan tu ARRAY, thoi gian thuc thi: 713ms 5 phan tu LIST, thoi gian thuc thi: 657ms 5 phan tu ARRAY, thoi gian thuc thi: 789ms 6 phan tu LIST, thoi gian thuc thi: 737ms 6 phan tu ARRAY, thoi gian thuc thi: 863ms 7 phan tu LIST, thoi gian thuc thi: 812ms 7 phan tu ARRAY, thoi gian thuc thi: 933ms 8 phan tu LIST, thoi gian thuc thi: 886ms 8 phan tu ARRAY, thoi gian thuc thi: 1010ms 9 phan tu LIST, thoi gian thuc thi: 1078ms 9 phan tu ARRAY, thoi gian thuc thi: 1082ms 10 phan tu LIST, thoi gian thuc thi: 1180ms 10 phan tu ARRAY, thoi gian thuc thi: 1275ms 11 phan tu LIST, thoi gian thuc thi: 1187ms 11 phan tu ARRAY, thoi gian thuc thi: 1338ms 12 phan tu LIST, thoi gian thuc thi: 1217ms 12 phan tu ARRAY, thoi gian thuc thi: 1372ms 13 phan tu LIST, thoi gian thuc thi: 1256ms 13 phan tu ARRAY, thoi gian thuc thi: 1414ms 14 phan tu LIST, thoi gian thuc thi: 1319ms 14 phan tu ARRAY, thoi gian thuc thi: 1435ms 15 phan tu LIST, thoi gian thuc thi: 1334ms 15 phan tu ARRAY, thoi gian thuc thi: 1450ms 16 phan tu LIST, thoi gian thuc thi: 1373ms 16 phan tu ARRAY, thoi gian thuc thi: 1466ms 17 phan tu LIST, thoi gian thuc thi: 1416ms 17 phan tu ARRAY, thoi gian thuc thi: 1497ms 18 phan tu LIST, thoi gian thuc thi: 1446ms 18 phan tu ARRAY, thoi gian thuc thi: 1525ms 19 phan tu LIST, thoi gian thuc thi: 1483ms 19 phan tu ARRAY, thoi gian thuc thi: 1547ms 20 phan tu LIST, thoi gian thuc thi: 1520ms 20 phan tu ARRAY, thoi gian thuc thi: 1582ms 21 phan tu LIST, thoi gian thuc thi: 1552ms 21 phan tu ARRAY, thoi gian thuc thi: 1605ms 22 phan tu LIST, thoi gian thuc thi: 1629ms 22 phan tu ARRAY, thoi gian thuc thi: 1676ms 23 phan tu LIST, thoi gian thuc thi: 1702ms 23 phan tu ARRAY, thoi gian thuc thi: 1719ms 24 phan tu LIST, thoi gian thuc thi: 1687ms 24 phan tu ARRAY, thoi gian thuc thi: 1686ms 25 phan tu LIST, thoi gian thuc thi: 1705ms 25 phan tu ARRAY, thoi gian thuc thi: 1702ms 26 phan tu LIST, thoi gian thuc thi: 1743ms 26 phan tu ARRAY, thoi gian thuc thi: 1781ms 27 phan tu LIST, thoi gian thuc thi: 1845ms 27 phan tu ARRAY, thoi gian thuc thi: 1863ms 28 phan tu LIST, thoi gian thuc thi: 1915ms 28 phan tu ARRAY, thoi gian thuc thi: 1808ms 29 phan tu LIST, thoi gian thuc thi: 1942ms 29 phan tu ARRAY, thoi gian thuc thi: 1821ms 30 phan tu LIST, thoi gian thuc thi: 2002ms 30 phan tu ARRAY, thoi gian thuc thi: 1838ms 31 phan tu LIST, thoi gian thuc thi: 2021ms 31 phan tu ARRAY, thoi gian thuc thi: 1872ms 32 phan tu LIST, thoi gian thuc thi: 2073ms 32 phan tu ARRAY, thoi gian thuc thi: 1897ms 33 phan tu LIST, thoi gian thuc thi: 2076ms 33 phan tu ARRAY, thoi gian thuc thi: 1925ms 34 phan tu LIST, thoi gian thuc thi: 2120ms 34 phan tu ARRAY, thoi gian thuc thi: 2266ms 35 phan tu LIST, thoi gian thuc thi: 2222ms 35 phan tu ARRAY, thoi gian thuc thi: 2091ms 36 phan tu LIST, thoi gian thuc thi: 2192ms 36 phan tu ARRAY, thoi gian thuc thi: 2107ms 37 phan tu LIST, thoi gian thuc thi: 2261ms 37 phan tu ARRAY, thoi gian thuc thi: 2303ms 38 phan tu LIST, thoi gian thuc thi: 2420ms 38 phan tu ARRAY, thoi gian thuc thi: 2244ms 39 phan tu LIST, thoi gian thuc thi: 2485ms 39 phan tu ARRAY, thoi gian thuc thi: 2456ms 40 phan tu LIST, thoi gian thuc thi: 2559ms 40 phan tu ARRAY, thoi gian thuc thi: 2339ms 41 phan tu LIST, thoi gian thuc thi: 2528ms 41 phan tu ARRAY, thoi gian thuc thi: 2245ms 42 phan tu LIST, thoi gian thuc thi: 2505ms 42 phan tu ARRAY, thoi gian thuc thi: 2283ms 43 phan tu LIST, thoi gian thuc thi: 2521ms 43 phan tu ARRAY, thoi gian thuc thi: 2350ms 44 phan tu LIST, thoi gian thuc thi: 2558ms 44 phan tu ARRAY, thoi gian thuc thi: 2313ms 45 phan tu LIST, thoi gian thuc thi: 2601ms 45 phan tu ARRAY, thoi gian thuc thi: 2357ms 46 phan tu LIST, thoi gian thuc thi: 2565ms 46 phan tu ARRAY, thoi gian thuc thi: 2417ms 47 phan tu LIST, thoi gian thuc thi: 2627ms 47 phan tu ARRAY, thoi gian thuc thi: 2448ms 48 phan tu LIST, thoi gian thuc thi: 2679ms 48 phan tu ARRAY, thoi gian thuc thi: 2520ms 49 phan tu LIST, thoi gian thuc thi: 2752ms 49 phan tu ARRAY, thoi gian thuc thi: 2455ms 50 phan tu LIST, thoi gian thuc thi: 2731ms 50 phan tu ARRAY, thoi gian thuc thi: 2488ms 51 phan tu LIST, thoi gian thuc thi: 2802ms 51 phan tu ARRAY, thoi gian thuc thi: 2500ms 52 phan tu LIST, thoi gian thuc thi: 2818ms 52 phan tu ARRAY, thoi gian thuc thi: 2591ms 53 phan tu LIST, thoi gian thuc thi: 2898ms 53 phan tu ARRAY, thoi gian thuc thi: 2534ms 54 phan tu LIST, thoi gian thuc thi: 2856ms 54 phan tu ARRAY, thoi gian thuc thi: 2550ms 55 phan tu LIST, thoi gian thuc thi: 2893ms 55 phan tu ARRAY, thoi gian thuc thi: 2569ms 56 phan tu LIST, thoi gian thuc thi: 2920ms 56 phan tu ARRAY, thoi gian thuc thi: 2595ms 57 phan tu LIST, thoi gian thuc thi: 3026ms 57 phan tu ARRAY, thoi gian thuc thi: 2768ms 58 phan tu LIST, thoi gian thuc thi: 3152ms 58 phan tu ARRAY, thoi gian thuc thi: 2725ms 59 phan tu LIST, thoi gian thuc thi: 3118ms 59 phan tu ARRAY, thoi gian thuc thi: 2702ms ...
Kết luận
Theo các ví dụ so sánh trong bài, có thể thấy, bạn nên dùng ArrayList nếu bạn muốn xử lý danh sách có lượng lớn phần tử, List chỉ xử lý tốt với danh sách nhỏ. Tuy nhiên, thời gian xử lý khác biệt giữa List và ArrayList vẫn không lớn đối với trực quan của người dùng, do đó nếu không có áp lực về tối ưu hóa thời gian thì bạn dùng List vẫn được.
- APA:
Dammio. (2018). So sánh hai kiểu cấu trúc dữ liệu List và ArrayList trong .NET bằng C#. https://www.dammio.com/2018/06/28/so-sanh-hai-kieu-cau-truc-du-lieu-list-va-arraylist-trong-net-bang-c.
- BibTeX:
@misc{dammio,
author = {Dammio},
title = {So sánh hai kiểu cấu trúc dữ liệu List và ArrayList trong .NET bằng C#},
year = {2018},
url = {https://www.dammio.com/2018/06/28/so-sanh-hai-kieu-cau-truc-du-lieu-list-va-arraylist-trong-net-bang-c},
urldate = {2024-10-09}
}