为啥这个方法返回一个包含所有相同对象的 ArrayList? JAVA

Posted

技术标签:

【中文标题】为啥这个方法返回一个包含所有相同对象的 ArrayList? JAVA【英文标题】:Why is this method returning an ArrayList with all the same objects? JAVA为什么这个方法返回一个包含所有相同对象的 ArrayList? JAVA 【发布时间】:2015-08-11 17:58:43 【问题描述】:

我有一个名为User 的类和一个名为Users.csv 的文件,如下所示:

用户类别:

public class User

private String name;
private String rg;
private String type;

public String getName()

    return name;


public String getRg()

    return rg;


public String getType()

    return type;


public void setName(String n)

    name = n;


public void setRg(String r)

    rg = r;


public void setType(String t)

    type = t;


Users.csv:

a,b,c
d,e,f
as,d,cf

另外,我有一个名为test 的类,它实现了一个方法:

测试类:

public class test

public ArrayList<User> readUsers(String path) throws IOException //read all users from file and returns an ArrayList
       
    ArrayList<User> list = new ArrayList<User>();
    String[] str;
    User u = new User();
    BufferedReader buffRead = new BufferedReader(new FileReader(path));
    String line = buffRead.readLine(); 
    while(line != null)
    
            str = line.split(",");
            u.setName(str[0]); //sets each field read to "u"
            u.setRg(str[1]);
            u.setType(str[2]);
            list.add(u); //adding user to the list to be returned
            line = buffRead.readLine(); //reading next register
    
buffRead.close();
return list;

  

问题在于方法readUsers()。它返回给我一个 ArrayList,其中每个元素都是相同的,它们是 Users.csv 最后一行的元素。 任何提示为什么会发生?我想不通...

【问题讨论】:

【参考方案1】:

你给new User()打了多少次电话?这就是您创建的用户对象的数量:恰好一个,并且您在循环之前执行一次。

解决方案,在循环的 inside 中调用这个 - 这样您就可以为添加到列表中的每个项目创建一个新用户。

【讨论】:

但是为什么不能为每个循环设置用户名、Rg 和类型,然后将他添加到列表中?每次值更改时,我都会将用户添加到列表中 这就是我正要给出的答案。请确保您将此标记为正确。 @Quik19:您所描述的症状有两个主要原因 - 一遍又一遍地重新填充同一个对象(您正在做什么)或过度使用静态变量(你没有犯的错误)。【参考方案2】:

您只创建了User 的一个实例,并且只是更改了它的属性。您需要为 CSV 文件中的每个条目创建一个 User 的新实例

//User u = new User();
//...
while(line != null)

        str = line.split(",");
        User u = new User();
        u.setName(str[0]); //sets each field read to "u"
        u.setRg(str[1]);
        u.setType(str[2]);
        list.add(u); //adding user to the list to be returned
        line = buffRead.readLine(); //reading next register

【讨论】:

非常感谢您的帮助!答案很简单,但它杀死了我!我太笨了哈哈!谢谢! 欢迎来到我的世界;)【参考方案3】:

Java 集合存储引用。因此,在您的代码中,只有一个 User 对象,并且对它的引用在每次迭代时都被添加到 ArrayList 中(与 C++ 中发生的情况不同,其中向量进行复制)。你需要这样的东西:

while(line != null)

   str = line.split(",");
   User u = new User();
   u.setName(str[0]); //sets each field read to "u"
   u.setRg(str[1]);
   u.setType(str[2]);
   list.add(u); //adding user to the list to be returned
   line = buffRead.readLine(); //reading next register

【讨论】:

以上是关于为啥这个方法返回一个包含所有相同对象的 ArrayList? JAVA的主要内容,如果未能解决你的问题,请参考以下文章

Python大数据为啥一定要用Numpy Array

为啥 JavaScript Math.random() 多次返回相同的数字

为啥带有对象的 typeof 数组返回“object”而不是“array”? [复制]

JS 字符串对象 数组对象 函数对象 函数作用域

为啥我的 Array.prototype.find() 返回未定义?

为啥返回带有箭头函数的对象时,array.map 中需要 return 关键字?