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     }

 

posted @ 2016-04-05 16:07  f9q  阅读(217)  评论(0编辑  收藏  举报