Java 向ArrayList添加对象的正确方法

Java 向ArrayList添加对象的正确方法,java,android,android-activity,performance,arraylist,Java,Android,Android Activity,Performance,Arraylist,我试图将一个对象添加到arraylist中,但当我查看数组列表的结果时,它会不断地将同一个对象添加到arraylist中。我想知道实现这一点的正确方法是什么 public static ArrayList<Person> parsePeople(String responseData) { ArrayList<Person> People = new ArrayList<Person>(); try { JSONArr

我试图将一个对象添加到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;
}
publicstaticarraylistparsepeople(字符串响应数据){
ArrayList People=新建ArrayList();
试一试{
JSONArray jsonPeople=新的JSONArray(responseData);
如果(!jsonPeople.isNull(0)){
for(int i=0;i
我已经仔细检查了我的JSONArray数据,并确保它们不是重复的。它似乎不断地添加第一个对象。

一些快速提示:

  • 考虑以下内容。变量名以小写字母开头
  • 有效Java第二版,第65项:不要忽略异常
  • 有效Java第二版,第52项:通过对象接口引用对象
话虽如此,您可以将
添加到
数组列表中,方法与将
添加到任何
列表中的方法相同:您可以将单个元素或整个元素添加到列表末尾。如果您想将元素添加到更具体的位置,也会有采用索引的重载


关于别名 请始终记住,对象是引用类型,并且引用可以使用别名。除非你明白这意味着什么,否则有些行为可能会让你大吃一惊

此代码段显示了以下示例:

  • 创建一个
    列表
    共3个
    原子引用
    实例,所有实例都引用相同的
    原子整数
  • AtomicInteger
    递增时,所有
    AtomicReference
    都会看到这种效果
  • 然后将一个
    AtomicReference
    设置为引用第二个
    AtomicInteger
(本例中没有关于并发的具体内容)

import java.util.concurrent.atomic.*;
//...
列表参考=
新的ArrayList();
AtomicInteger计数器=新的AtomicInteger();
对于(int i=0;i<3;i++){
参考添加(新原子参考(计数器));
}
//我们现在有3个原子参考,
//但只有1个原子整数
系统输出打印项次(参考文献);//[0, 0, 0]
counter.incrementAndGet();
系统输出打印项次(参考文献);//[1, 1, 1]
参考文献get(1).set(新的原子整数(9));
系统输出打印项次(参考文献);//[1, 9, 1]
//我们仍然只有3个原子参考,
//但我们还创建了第二个原子整数
counter.incrementAndGet();
系统输出打印项次(参考文献);//[2, 9, 2]
请注意,即使每次都为
列表使用
新的原子引用
。添加
(意味着总共创建了3个不同的
原子引用
对象),它们仍然引用相同的
原子整数
。这种类型的别名可能是问题的根源。

一些快速提示:

  • 考虑以下内容。变量名以小写字母开头
  • 有效Java第二版,第65项:不要忽略异常
  • 有效Java第二版,第52项:通过对象接口引用对象
话虽如此,您可以将
添加到
数组列表中,方法与将
添加到任何
列表中的方法相同:您可以将单个元素或整个元素添加到列表末尾。如果您想将元素添加到更具体的位置,也会有采用索引的重载


关于别名 请始终记住,对象是引用类型,并且引用可以使用别名。除非你明白这意味着什么,否则有些行为可能会让你大吃一惊

此代码段显示了以下示例:

  • 创建一个
    列表
    共3个
    原子引用
    实例,所有实例都引用相同的
    原子整数
  • AtomicInteger
    递增时,所有
    AtomicReference
    都会看到这种效果
  • 然后将一个
    AtomicReference
    设置为引用第二个
    AtomicInteger
(本例中没有关于并发的具体内容)

import java.util.concurrent.atomic.*;
//...
列表参考=
新的ArrayList();
AtomicInteger计数器=新的AtomicInteger();
对于(int i=0;i<3;i++){
参考添加(新原子参考(计数器));
}
//我们现在有3个原子参考,
//但只有1个原子整数
系统输出打印项次(参考文献);//[0, 0, 0]
counter.incrementAndGet();
系统输出打印项次(参考文献);//[1, 1, 1]
参考文献get(1).set(新的原子整数(9));
系统输出打印项次(参考文献);//[1, 9, 1]
//我们仍然只有3个原子参考,
//但我们还创建了第二个原子整数
counter.incrementAndGet();
系统输出打印项次(参考文献);//[2, 9, 2]

请注意,即使每次都为
列表使用
新的原子引用
。添加
(意味着总共创建了3个不同的
原子引用
对象),它们仍然引用相同的
原子整数
。这种类型的别名可能是问题的根源。

responseData字符串或构造函数存在问题

如果类接收到如下所示的响应数据对象

String responseData = 
"[{ 
\"first_name\" : \"fred\" , 
\"last_name\" : \"Nobody\"  
}, 
{ 
\"first_name\" : \"John\" , 
\"last_name\" : \"Somebody\"  
}]";
那么你的联系人类应该是这样的

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-我通过添加上面的代码构建了你的应用程序,它运行正常
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
}
Person.add(new Person(jsonPeople.getJSONObject(i)));
People.add(new Person(jsonPeople.getJSONObject(i)));