Java 向ArrayList添加对象的正确方法
我试图将一个对象添加到arraylist中,但当我查看数组列表的结果时,它会不断地将同一个对象添加到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
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)));