Open alwaystest opened 7 years ago
标签(空格分隔): Android
看了好多次,能看懂,但始终不能理解其中设计的精妙。
HashMap是JDK提供的,有一个内部类Node实现了Map.Entry,并且因为要hash的缘故,默认0.75的负载率,让它在内存使用率上是比较低的,优势在于计算一次Hash值,就可以找到数据Index,访问的时候很快。空间换时间。
Android上要考虑的内存效率更高一些,所以HashMap很多时候大材小用了。所以出来一个ArrayMap,使用两个数组保存数据,一个存hash,一个存key和value,查找的时候使用二分法在hash数组查index,找到后使用index去访问数据。因为使用了二分法查找,所以找数据的时候耗时比HashMap多,但是优势是没有Entry包装,内存使用效率更高,因为实现了Map接口,在使用Collection的时候还是需要包装Entry的。
ArrayMap虽然提高了内存的使用效率,但是还有一个问题是使用泛型包装,在操作的时候会有Java的自动拆装箱操作,于是有了SparseArray,针对key是int的情况,避免了自动拆装箱,效率更高,但是适用范围就小了很多。
内存效率是层层递进的,可能是因为这个数据结构使用频率比较高的原因,一直在尝试压榨性能,这样追求极致的态度是值得学习的。
ArrayMap 和 SparseArray
标签(空格分隔): Android
看了好多次,能看懂,但始终不能理解其中设计的精妙。
HashMap是JDK提供的,有一个内部类Node实现了Map.Entry,并且因为要hash的缘故,默认0.75的负载率,让它在内存使用率上是比较低的,优势在于计算一次Hash值,就可以找到数据Index,访问的时候很快。空间换时间。
Android上要考虑的内存效率更高一些,所以HashMap很多时候大材小用了。所以出来一个ArrayMap,使用两个数组保存数据,一个存hash,一个存key和value,查找的时候使用二分法在hash数组查index,找到后使用index去访问数据。因为使用了二分法查找,所以找数据的时候耗时比HashMap多,但是优势是没有Entry包装,内存使用效率更高,因为实现了Map接口,在使用Collection的时候还是需要包装Entry的。
ArrayMap虽然提高了内存的使用效率,但是还有一个问题是使用泛型包装,在操作的时候会有Java的自动拆装箱操作,于是有了SparseArray,针对key是int的情况,避免了自动拆装箱,效率更高,但是适用范围就小了很多。
内存效率是层层递进的,可能是因为这个数据结构使用频率比较高的原因,一直在尝试压榨性能,这样追求极致的态度是值得学习的。