So sánh hai kiểu cấu trúc dữ liệu List và ArrayList trong .NET bằng C#

65 lượt xem 
 
Thể loại: C#, Ngôn ngữ lập trình 

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.

Bình luận Facebook

Để lại bình luận

avatar
1000
  Subscribe  
Notify of