陈斌彬的技术博客

Stay foolish,stay hungry

Android利用SparseArray替换使用HashMap

package cc.testsparsearray;  

import java.util.HashMap;  
import java.util.Iterator;  
import java.util.Set;  
import android.os.Bundle;  
import android.util.SparseArray;  
import android.app.Activity;  
/** 
 * Demo描述: 
 * SparseArray使用示例 
 * 利用SparseArray替换使用HashMap<Integer,E> 
 * 类似的还有SparseIntArray,SparseBooleanArray,LongSparseArray  
 *  
 * 参考资料: 
 * 1 http://liuzhichao.com/p/832.html 
 * 2 http://blog.csdn.net/xyz_fly/article/details/7931943 
 * 3 http://my.eoe.cn/appadventure/archive/2824.html 
 *   Thank you very much 
 */ 
public class MainActivity extends Activity {  

    @Override 
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        init();  
    }  
    private void init(){  

        SparseArray sparseArray=new SparseArray<String>();  

        //增加的两种方式  
        sparseArray.append(0, "This is 0");  
        sparseArray.append(1, "This is 1");  
        sparseArray.append(2, "This is 2");  

        sparseArray.put(3, "This is 3");  
        sparseArray.put(4, "This is 4");  

        //遍历  
        for (int i = 0; i < sparseArray.size(); i++) {  
            System.out.println("遍历得到位置"+i+"的值为:"+sparseArray.get(i));  
        }  

        //查找某个位置的键  
        int key =sparseArray.keyAt(1);  
        System.out.println("查找位置1处的键 key="+key);  

        //查找某个位置的值  
        String value=(String) sparseArray.valueAt(1);  
        System.out.println("查找位置1处的值 value="+value);  

        //修改的两种方式  
        sparseArray.put(0, "This is new 0");  
        sparseArray.put(1, "This is new 1");  
        sparseArray.setValueAt(2, "This is new 2");  
        sparseArray.setValueAt(3, "This is new 3");  
        for (int i = 0; i < sparseArray.size(); i++) {  
            System.out.println("修改后遍历得到位置"+i+"的值为:"+sparseArray.get(i));  
        }  

        //删除  
        sparseArray.delete(0);  
        System.out.println("删除操作后sparseArray大小 size="+sparseArray.size());  
        //注意:  
        //在执行删除后sparseArray的size()减小了1  
        //为了遍历完,应该将循环条件修改为i < sparseArray.size()+1  
        //HashMap也有类似的情况.参见分割线以下的例子  
        //如果关于SparseArray的遍历有什么好的方法或者建议,多谢  
        for (int i = 0; i < sparseArray.size()+1; i++) {  
            System.out.println("删除后遍历得到位置"+i+"的值为:"+sparseArray.get(i));  
        }  







        System.out.println("//////////////这是分割线////////////////");  





        HashMap<Integer, String> hashMap=new HashMap<Integer, String>();  
        hashMap.put(0, "000");  
        hashMap.put(1, "111");  
        hashMap.put(2, "222");  
        hashMap.put(3, "333");  
        hashMap.put(4, "444");  
        for (int i = 0; i < hashMap.size(); i++) {  
            System.out.println("HashMap遍历得到位置"+i+"的值为:"+hashMap.get(i));  
        }  

        hashMap.remove(Integer.valueOf(0));  
        System.out.println("删除操作后hashMap大小 size="+hashMap.size());  
        //注意:  
        //在执行删除后hashMap的size()减小了1  
        //为了遍历完,应该将循环条件修改为i < hashMap.size()+1  
        for (int i = 0; i < hashMap.size()+1; i++) {  
            System.out.println("HashMap遍历得到位置"+i+"的值为:"+hashMap.get(i));  
        }  



        //但是这样做是意义不大的,我们常用的是利用keySet来遍历,如下:  
        Set<Integer> set = hashMap.keySet();  
        for (Iterator<Integer> iter = set.iterator(); iter.hasNext();) {  
            Integer keyTemp = iter.next();  
            String valueTemp = hashMap.get(keyTemp);  
            System.out.println("利用keySet遍历:"+keyTemp + "的值是" + valueTemp);  
        }  

    }  
}  

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" >  

    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="SparseArray使用示例" 
        android:layout_centerInParent="true" />  

</RelativeLayout>