Trong bài viết này, mình sẽ chỉ cho bạn tại sao và khi nào sử dụng loại dữ liệu ArrayMap để tối ưu hóa hiệu suất ứng dụng Android một cách hiệu quả.
Bất cứ khi nào bạn cần lưu trữ dữ liệu dạng Key => Value
, có lẽ HashMap là kiểu dữ liệu đầu tiên bạn nghĩ tới phải không?
Với cấu trúc dữ liệu kiểu HashMap khá là linh hoạt, sử dụng được ở mọi nơi mà chúng ta lại không cần bận tâm quá nhiều về những “tác dụng phụ” của nó.
Nhưng bạn có để ý là mỗi khi sử dụng HashMap, Android Studio lại đưa ra gợi ý rằng bạn nên sử dụng ArrayMap để thay thế Hashmap. Bạn có biết tại sao không? Mình cũng không biết Vậy thì cùng nhau tìm hiểu nhé!
Phần này, mình sẽ chỉ cho bạn biết khi nào chúng ta nên sử dụng ArrayMap và cách thức hoạt động của hai kiểu cấu trúc dữ liệu này.
ArrayMap là kiểu dữ liệu cấu trúc dạng generic key => value
được thiết kế để tối ưu hóa bộ nhớ hơn so với HashMap truyền thống.
ArrayMap giữ ánh xạ của nó trọng một cấu trúc mảng dữ liệu (là 1 mảng số nguyên là mã băm của mỗi item) và một mảng đối tượng của key -> value
. Điều này tránh yêu cầu phải tạo ra thêm Object mỗi khi thêm một entry vào mảng. ArrayMap cũng kiểm soát kích thước của mảng nhanh gọn hơn. Vì chúng ta chỉ cần sao chép các entry trong mảng mà không phải xây dựng lại bảng mã băm.
Lưu ý: không dùng ArrayMap cho cấu trúc dữ liệu có số lượng phần tử lớn. Nhìn chung, nó chậm hơn HashMap truyền thống. Vì ArrayMap dùng thuật toán binary search để tìm kiếm. Thêm mới và xóa phần tử đều yêu cầu phải chèn và xóa các mảng entry.
Với các mảng lưu trữ lên đến hàng trăm phần tử thì sự chênh lệch về hiệu suất dưới 50%. Theo cá nhân mình thì con số này không đáng kể.
Về cơ bản, Hashmap là một mảng của HashMap.Entry
(Entry là lớp bên trong của Hashmap).
Nếu nhìn tổng quan thì một instance của lớp Entry là:
Vậy điều gì sẽ xảy ra khi key => value
được chèn vào một HashMap?
P/s: Bucket là nơi lưu trữ các key có hash gần như nhau. bucket được lưu trong một array nên chi phí truy xuất chỉ là O(1).
Bây giờ, khi bạn truy xuất HashMap để tìm giá trị của 1 key thì chi phí truy xuất là O(1). Nhưng quan trọng nhất là bộ nhớ càng nhiều, chi phí càng cao.
Tham khảo việc làm Java hấp dẫn trên TopDev
HashMap.Entry
lại có thêm 1 lớp các đối tượng được tạo ra và thu gom rác (Garbage Collection).Hãy nhớ rằng – trình thu gom rác (Garbage Collection – GC) cũng phải tiêu tốn tài nguyên nhất định.
Khi GC hoạt động, ứng dụng của bạn không thể chạy, dẫn đến ứng dụng bị giật, lag…
Vậy để tối ưu hóa ứng dụng android thì ArrayMap có gì khác?
ArrayMap sử dụng 2 mảng. Nó sử dụng Object [] mArray
để lưu trữ các đối tượng , còn int [] mHashes
để lưu trữ mã băm (hashcode).
Khi một cặp key -> value
được chèn vào mảng thì:
key -> value
được autoboxed.mArray[ ].
mArray[ ]
.mHashes[ ]
tại vị trí tiếp theo.Khi cần lấy giá trị theo key, bạn cần:
2*index
trong mArray
và vị trí của value là 2*index+1
.Tại đây, độ phức tạp từ O(1) đã lên tới O(logN).
Một số đề xuất sử dụng cấu trúc dữ liệu thay thế:
Hy vọng qua bài viết trên, bạn có thể áp dụng ngay tối ưu hóa ứng dụng Android một cách thành công. Có điều gì thắc mắc hoặc góp ý thì comment ngay bên dưới nhé!
Xem bài viết gốc tại đây
You need to login in order to like this post: click here
YOU MIGHT ALSO LIKE