将对象添加到ArrayList的正确方法

时间:2010-08-19 23:40:12

标签: java android android-activity performance arraylist

我正在尝试将一个对象添加到一个arraylist但是当我查看数组列表的结果时,它会一直向arraylist添加相同的对象。我想知道实现这个的正确方法是什么。

    public static ArrayList<Person> parsePeople(String responseData) {
    ArrayList<Person> People = new ArrayList<Person>();
    try {

        JSONArray jsonPeople = new JSONArray(responseData);
        if (!jsonPeople.isNull(0)) {
            for (int i = 0; i < jsonPeople.length(); i++) {
                People.add(new Person(jsonPeople.getJSONObject(i)));
            }

        }

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {

    }

    return People;
}

我仔细检查了我的JSONArray数据,并确保它们不是重复数据。它似乎一遍又一遍地添加第一个对象。

3 个答案:

答案 0 :(得分:3)

一些快速提示:

  • 请考虑关注naming convention。变量名以小写字母开头。
  • Effective Java 2nd Edition,Item 65:不要忽略异常
  • Effective Java 2nd Edition,Item 52:通过接口引用对象

话虽如此,您可以add ArrayList addList ANY List相同:您可以{{3单个元素或add(E)整个addAll到列表的末尾。如果要将元素添加到更具体的位置,还有一些带有索引的重载。


关于别名

始终记住对象是引用类型,引用可以是别名。除非你理解这意味着什么,否则一些行为可能会让你感到惊讶。

此代码段显示了一个示例:

  • 创建AtomicReferenceAtomicInteger个实例,这些实例都引用相同的AtomicInteger
  • AtomicReference递增时,所有AtomicReference都会看到此效果
  • 然后将一个AtomicInteger设置为引用第二个 import java.util.concurrent.atomic.*; //... List<AtomicReference<AtomicInteger>> refs = new ArrayList<AtomicReference<AtomicInteger>>(); AtomicInteger counter = new AtomicInteger(); for (int i = 0; i < 3; i++) { refs.add(new AtomicReference<AtomicInteger>(counter)); } // we now have 3 AtomicReference, // but only 1 AtomicInteger System.out.println(refs); // [0, 0, 0] counter.incrementAndGet(); System.out.println(refs); // [1, 1, 1] refs.get(1).set(new AtomicInteger(9)); System.out.println(refs); // [1, 9, 1] // we still have only 3 AtomicReference, // but we've also created a second AtomicInteger counter.incrementAndGet(); System.out.println(refs); // [2, 9, 2]

(在这个例子中没有关于并发的具体内容)

new AtomicReference

请注意,即使List.add每次都用于AtomicReference(意味着总共创建了3个不同的AtomicInteger个对象),它们仍然指的是同一个{{1}} 。这种别名可能是您问题的根源。

答案 1 :(得分:2)

responseData字符串或构造函数有问题。

如果类接收到类似于以下

的响应Data对象
String responseData = 
"[{ 
\"first_name\" : \"fred\" , 
\"last_name\" : \"Nobody\"  
}, 
{ 
\"first_name\" : \"John\" , 
\"last_name\" : \"Somebody\"  
}]";

然后你的Contact类看起来像

public class Contact {
    String fname;
    String lname;

    public Contact(JSONObject obj){
        System.out.println(obj);
        try {
            fname = (String)obj.get("first_name");
            lname = (String)obj.get("last_name");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
//get and set methods
}

根据你的逻辑,没有理由让同一记录出现两次。确保您的JSON字符串具有正确的格式。我建议在应用程序中添加更多System.out或Log4j调用以确定每个步骤。最糟糕的情况是通过调试会话逐步执行应用程序。

PS - 我通过添加上面的代码构建了你的app,它运行正常。因此,您可以正确地将元素添加到ArrayList中。你能说明你如何打印阵列吗?也许问题就在那里。

答案 2 :(得分:1)

你不觉得

Person.add(new Person(jsonPeople.getJSONObject(i)));

应该像

People.add(new Person(jsonPeople.getJSONObject(i)));

我首先编译文件,除非你有一个名为add(Person p)的静态方法和一个在Person类中接受Person(JSONObject j)的构造函数。