arrayList我只显示最后一个元素

时间:2015-05-25 20:25:38

标签: arraylist

我有以下问题。我正在尝试显示display arrayList的所有元素,但我只能看到最后一项重复次数与ArrayList中的元素数量一样多。

import java.util.ArrayList;
import java.util.Iterator;
public class PurebaArrayList {
public static void main(String[] args) {

    ArrayList<PuntoDouble> puntos = new ArrayList<>();

    PuntoDouble p = new PuntoDouble();

    for(int cont = 0; cont< 100; cont++){
        p.setX(cont);
        p.setY(cont);
        puntos.add(p);            
    }
    System.out.println(puntos.toString());
}
}



public class PuntoDouble{

private double x;
private double y;

public PuntoDouble(double x, double y) {
    this.x = x;
    this.y = y;
}

public PuntoDouble(){

}

public double getX() {
    return x;
}

public void setX(double x) {
    this.x = x;
}

public double getY() {
    return y;
}

public void setY(double y) {
    this.y = y;
}

@Override
public String toString() {
    return "PuntoDouble{" + "x=" + x + ", y=" + y + '}';
}   
}

由于

3 个答案:

答案 0 :(得分:0)

您需要为添加到列表中的每个条目创建一个新的PuntoDouble。目前,您只需添加一个您修改的PuntoDouble个实例。 因此,请将代码更改为:

for(int cont = 0; cont< 100; cont++){
    PuntoDouble p = new PuntoDouble();
    p.setX(cont);
    p.setY(cont);
    puntos.add(p);            
}

答案 1 :(得分:0)

你是字面上,在数组的100个元素中添加相同的PuntoDouble。如果您希望它们彼此不同,则需要为每个创建一个new

答案 2 :(得分:0)

对于调试,稍微更改100到3并为每次迭代添加以打印puntos中的元素。

    // adds to ArrayList
    for(int cont = 0; cont< 10; cont++){
        p.setX(cont);
        p.setY(cont);
        System.out.println("[add]" + p);
        puntos.add(p);
    }

    // iterates ArrayList puntos' elements
    for(PuntoDouble pd : puntos){
        System.out.println("[contain]" + pd);
    }


debug output lines:
[add]PuntoDouble{x=0.0, y=0.0}
[add]PuntoDouble{x=1.0, y=1.0}
[add]PuntoDouble{x=2.0, y=2.0}
[add]PuntoDouble{x=3.0, y= 3.0}
[contain]PuntoDouble{x=9.0, y=9.0}
[contain]PuntoDouble{x=9.0, y=9.0}
[contain]PuntoDouble{x=9.0, y=9.0} 

您所做的是创建PuntoDouble对象p并通过调用默认构造函数来启动它。在for循环中,p的值会修改,但p的引用从未更改,因此您将相同的对象添加到ArrayList中100次,所有这些添加的对象都引用相同的地址内存(new一个对象,在for循环之前),其中值x为99.0,y为99.0(最后添加的值)

你应该做的是每次迭代创建一个新对象。

for(int cont = 0; cont< 100; cont++){
        puntos.add(new PuntoDouble(cont, cont));
}