SparseArray
có thể được sử dụng để thay thế HashMap
khi khóa là loại nguyên thủy. Có một số biến thể cho các loại khóa / giá trị khác nhau, mặc dù không phải tất cả chúng đều có sẵn công khai.
Lợi ích là:
- Phân bổ miễn phí
- Không có quyền anh
Hạn chế:
- Nói chung là chậm hơn, không được chỉ định cho các bộ sưu tập lớn
- Họ sẽ không làm việc trong một dự án không phải Android
HashMap
có thể được thay thế bằng cách sau:
SparseArray <Integer, Object>
SparseBooleanArray <Integer, Boolean>
SparseIntArray <Integer, Integer>
SparseLongArray <Integer, Long>
LongSparseArray <Long, Object>
LongSparseLongArray <Long, Long> //this is not a public class
//but can be copied from Android source code
Về bộ nhớ, đây là một ví dụ về SparseIntArray
vs HashMap<Integer, Integer>
cho 1000 phần tử:
SparseIntArray
:
class SparseIntArray {
int[] keys;
int[] values;
int size;
}
Class = 12 + 3 * 4 = 24 byte
Mảng = 20 + 1000 * 4 = 4024 byte
Tổng cộng = 8,072 byte
HashMap
:
class HashMap<K, V> {
Entry<K, V>[] table;
Entry<K, V> forNull;
int size;
int modCount;
int threshold;
Set<K> keys
Set<Entry<K, V>> entries;
Collection<V> values;
}
Class = 12 + 8 * 4 = 48 byte
Entry = 32 + 16 + 16 = 64 byte
Array = 20 + 1000 * 64 = 64024 byte
Tổng cộng = 64.136 byte
Nguồn: Ký ức Android của Romain Guy từ slide 90.
Các số ở trên là dung lượng bộ nhớ (tính bằng byte) được phân bổ trên heap bởi JVM. Chúng có thể thay đổi tùy thuộc vào JVM cụ thể được sử dụng.
Các java.lang.instrument
gói chứa một số phương pháp hữu ích cho các hoạt động tiên tiến như kiểm tra kích thước của một đối tượng với getObjectSize(Object objectToSize)
.
Thông tin thêm có sẵn từ tài liệu chính thức của Oracle .
Class = 12 byte + (n biến thể hiện) * 4 byte
Array = 20 byte + (n phần tử) * (kích thước phần tử)
Entry = 32 byte + (kích thước phần tử thứ 1) + (kích thước phần tử thứ 2)