So sánh array và arraylist trong c#

Chào mọi ng ! Mình có đọc qua các cách giải thích từ trang nước ngoài nhưng vẫn chưa hiểu, và đã có thành viên hỏi về chủ đề tương tự nhưng mình thấy vẫn chưa đủ. Cái nào nhanh hơn? Hay sử dụng như thế nào để tối ưu nhất giữa ArrayList và List??

Cám ơn mọi ng

Sự khác nhau giữa LinkedList và ArrayList

Sự khác nhau lớn nhất giữa ArrayList và LinkedList nằm ở chỗ có cấu trúc dữ liệu khác, nếu bạn hiểu được cấu trúc của 2 ArrayList và LinkedList thì những khác biệt dưới đây sẽ rất dễ hiểu

  1. Array là cấu trúc dữ liệu có chỉ mục[index] nên tìm kiếm trên Array nhanh hơn, độ phức tạp khi tìm kiếm một phần tử trong Array là O[1]. Trái lại, với LinkedList chúng ta không thể truy cập phần tử theo chỉ mục hoặc ngẫu nhiên mà phải duyệt qua các phần tử nên độ phức tạp là O[n]

  2. Chèn phần tử mới vào LinkedList dễ dàng và nhanh hơn so với ArrayList vì LinkedList không có rủi ro về thay đổi kích thước và sao chép dữ liệu sang mảng mới nếu mảng đầy chỉ với độ phức tạo O[1], nhưng với ArrayList thì rất hạn chế để thực hiện thêm mới và sao chép dữ liệu khi đầy thì độ phức tạp là O[n]. Bên cạnh đó, ArrayList cần cập nhật lại chỉ mục nếu thêm một phần tử vào giữa mảng.

  3. Xóa phần tử trong mảng giống như thêm mới thì LinkdedList có hiệu suất tốt hơn ArrayList.

  4. LinkedList chiếm nhiều bộ nhớ hơn ArrayList vì trong ArrayList mỗi phần tử chỉ chứa một đối tượng dữ liệu còn LinkedList thì mỗi phần tử[node] lại chứa dữ liệu và địa chỉ của phần tử trước và phần tử sau.

Khi nào dùng LinkedList và ArrayList

LinkedList không được dùng nhiều như ArrayList nhưng có một số trường hợp LinkedList là sự lựa chọn hợp lí hơn ArrayList. Chúng ta nên dùng LinkedList nếu:

  1. Ứng dụng không cần truy cập ngẫu nhiên trong mảng. Vì nếu cần chúng ta sẽ phải duyệt qua mảng để tìm kiếm phần tử phù hợp, độ phức tạp là O[n]

2]Ứng dụng thao tác thêm mới, xóa nhiều hơn truy cập dữ liệu. Khi đó thêm mới và xóa không phải thay đổi kích thước mảng nên nhanh hơn ArrayList.

2 Likes

Bạn còn biết List không? Tại mình cần biết hết để lựa chọn cái nào. Cám ơn b

Không so sánh được vì 2 cái này khác nhau, List là một interface, và ArrayList có thể xem là một implement của List.

Nếu dùng List [List a = new ArrayList[]; ] sẽ có ưu điểm là bạn có thể chuyển đổi ArrayList sang Vector, LinkedList dễ dàng thông qua các method có trong List interface, còn nếu dùng kiểu: ArrayList a = new ArrayList[]; thì bạn sẽ khó làm được điều này, bạn sẽ chỉ dùng được những method trong ArrayList.

Tóm lại là xem kỹ về interface trong OOP để hiểu phần này dễ dàng hơn.

7 Likes

Sơ ý quá, mình hiểu rồi. Cám ơn b nhiều

Minh_Thong_Truong:

Tại mình cần biết hết để lựa chọn cái nào

Trong Java List là interface, là giao diện bên ngoài chứ bản thân nó k có gì vì vậy nó không thể tạo ra đối tượng mới. Muốn sử dụng List bạn phải implement nó qua arraylist và linklist.

Nếu bạn hỏi List trong C# thì List có thể sử dụng và tạo đối tượng như arraylist. Vì nó là 1 Generic class implement từ IList, ICollection, IEnumerable.

Điều đặc biệt quan trọng là nếu bạn dùng List. Bạn không cần ép kiểu trong trường hợp dùng các obj khác nhau như arraylist

1 Like

Home Categories FAQ/Guidelines Terms of Service Privacy Policy

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 : IList, ICollection, IEnumerable, IEnumerable, IList, ICollection, IReadOnlyList, IReadOnlyCollection

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 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 list1 = new List[]; 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 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 kế thừa giao diện chung IEnumerable 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 list2 = new List[]; 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 list = new List[]; 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.

Video liên quan

Chủ Đề