Android内存管理(15)SparseArray系列代替HashMap系列
参考:
https://liuzhichao.com/p/832.html
http://www.2cto.com/kf/201311/255640.html
1,简介:
SparseArray是android里为<Interger,Object>
这样的Hashmap而专门写的类,目的是提高效率,其核心是折半查找函数(binarySearch)。
SparseBooleanArray 用来取代 HashMap<Integer, Boolean>。
SparseIntArray 用来取代 HashMap<Integer, Integer>。
在Android中,当我们需要定义
HashMap <Integer, E> hashMap = new HashMap <Integer, E> ();
时,我们可以使用如下的方式来取得更好的性能.
SparseArray <E> sparseArray = new SparseArray <E> ();
2,增删改查api
增:
1 public void put(int key, E value) {} 2 public void append(int key, E value){}
删:
1 public void delete(int key) {} 2 public void remove(int key) {} //直接调用的delete(int key) 3 public void removeAt(int index){} 4 public void clear(){}
改:
1 public void put(int key, E value) 2 public void setValueAt(int index, E value)
查:
public E get(int key) public E get(int key, E valueIfKeyNotFound) public int keyAt(int index) //查看第几个位置的键 public E valueAt(int index) //查看第几个位置的值 public int indexOfValue(E value) //查看值所在位置,没有的话返回-1
3,示例:
1 void testSparseArray() { 2 SparseArray<String> sparseArray = new SparseArray<>(); 3 4 //增加的两种方式 5 sparseArray.append(0, "This is 0"); 6 sparseArray.append(1, "This is 1"); 7 sparseArray.append(2, "This is 2"); 8 9 sparseArray.put(3, "This is 3"); 10 sparseArray.put(4, "This is 4"); 11 12 //遍历 13 for (int i = 0; i < sparseArray.size(); i++) { 14 System.out.println("遍历得到位置" + i + "的值为:" + sparseArray.get(i)); 15 } 16 17 //查找某个位置的键 18 int key = sparseArray.keyAt(1); 19 System.out.println("查找位置1处的键 key=" + key); 20 21 //查找某个位置的值 22 String value = sparseArray.valueAt(1); 23 System.out.println("查找位置1处的值 value=" + value); 24 25 //修改的两种方式 26 sparseArray.put(0, "This is new 0"); 27 sparseArray.put(1, "This is new 1"); 28 sparseArray.setValueAt(2, "This is new 2"); 29 sparseArray.setValueAt(3, "This is new 3"); 30 for (int i = 0; i < sparseArray.size(); i++) { 31 System.out.println("修改后遍历得到位置" + i + "的值为:" + sparseArray.get(i)); 32 } 33 34 //删除 35 sparseArray.delete(0); 36 System.out.println("删除操作后sparseArray大小 size=" + sparseArray.size()); 37 //注意: 38 //在执行删除后sparseArray的size()减小了1 39 //为了遍历完,应该将循环条件修改为i < sparseArray.size()+1 40 //HashMap也有类似的情况.参见分割线以下的例子 41 //如果关于SparseArray的遍历有什么好的方法或者建议,多谢 42 for (int i = 0; i < sparseArray.size() + 1; i++) { 43 System.out.println("删除后遍历得到位置" + i + "的值为:" + sparseArray.get(i)); 44 } 45 46 System.out.println("//////////////这是分割线////////////////"); 47 48 HashMap<Integer, String> hashMap = new HashMap<>(); 49 hashMap.put(0, "000"); 50 hashMap.put(1, "111"); 51 hashMap.put(2, "222"); 52 hashMap.put(3, "333"); 53 hashMap.put(4, "444"); 54 for (int i = 0; i < hashMap.size(); i++) { 55 System.out.println("HashMap遍历得到位置" + i + "的值为:" + hashMap.get(i)); 56 } 57 58 hashMap.remove(Integer.valueOf(0)); 59 System.out.println("删除操作后hashMap大小 size=" + hashMap.size()); 60 //注意: 61 //在执行删除后hashMap的size()减小了1 62 //为了遍历完,应该将循环条件修改为i < hashMap.size()+1 63 for (int i = 0; i < hashMap.size() + 1; i++) { 64 System.out.println("HashMap遍历得到位置" + i + "的值为:" + hashMap.get(i)); 65 } 66 67 //但是这样做是意义不大的,我们常用的是利用keySet来遍历,如下: 68 Set<Integer> set = hashMap.keySet(); 69 for (Integer keyTemp : set) { 70 String valueTemp = hashMap.get(keyTemp); 71 System.out.println("利用keySet遍历:" + keyTemp + "的值是" + valueTemp); 72 } 73 }