必须一次又一次地定义 Map 吗?

Must the Map be defined again and again?

我打算使用 SimpleAdapter 将数据从数据库加载到 ListView,就像:

private void loadData() {
        // TODO Auto-generated method stub
        Cursor cursor = mHelper.getReadableDatabase().rawQuery(
                "select * from dict", null);
        int wordIndex = cursor.getColumnIndex("word");
        int detailIndex = cursor.getColumnIndex("detail");
        int flagIndex = cursor.getColumnIndex("flag");
        **(1)**//Map<String,String>map = new HashMap<String,String>();
        //map defined here, items are all the last record

        for (cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
            **(2)**Map<String,String>map = new HashMap<String,String>();
            if(cursor.getString(wordIndex)==null) break;
//          Log.d(tag,"word: "+cursor.getString(wordIndex));
            map.put("word", cursor.getString(wordIndex));
//          Log.d(tag,"detail: "+cursor.getString(detailIndex));
            map.put("detail", cursor.getString(detailIndex));   
//          Log.d(tag,"flag: "+cursor.getString(flagIndex));
            map.put("flag", cursor.getString(flagIndex));
            listItems.add(map);
        }
        cursor.close();
    }

listItems 定义为 ArrayList<Map<String, String>> listItems;

当我将 Map 定义为 1 时,其中 map 在 for 循环之外,listItems 保留最后一个的 listItems.length 记录,而 map 被定义作为 2,listItems 保留 listItems.length 记录作为数据库。 有人能说出为什么吗?我将感谢您的回答!

第二种方式的正确方法,即 2 .

原因是在每次迭代中都会创建一个 Map<String,String> 类型的 new 对象,因此在每次迭代中都会将一个新项目添加到您的 ArrayList当你使用 2 方式时。

但是在第一种方式中,即 1 在每次迭代中没有创建新对象,因为它在 for 之前只创建了一次loop.And 因此你得不到你想要的。

listItems.add()添加的是Map<String,String>对象,Map的内容 将在每个循环中更改为方式 1。而 listItems 只需添加 listItems.length 次相同的 Map 对象