将对象存储到列表中并不适用于Java?

时间:2013-10-11 03:50:49

标签: java

我无法从列表中检索数据。这些值似乎永远不会被存储,或者对象被初始化了? 我创建了一个存储一些变量的类:

public class storage{
     public int a = 0;
     public int b = 0;
}

然后我创建了另一个填充a的类,并且b创建了一些值并将该对象存储在列表中

public class anotherclass{
      public List<storage> alldata = new ArrayList<storage>();

      public void filldata(){
            storage tmp = new storage();
            for (int i = 1; i <= 10; i++){
                 tmp.a = i;
                 tmp.b = i;
                 alldata.add(tmp);
            }
      }
}

但是当我在我的主类中运行filldata()时,尝试从列表a中获取对象,而b仍然设置为0。

public static void main(String[] args){
    anotherclass obj = new anotherclass();
    obj.filldata()

    for (int i = 0; i <= obj.alldata.size() - 1; i++){
          System.out.println(obj.alldata.get(i).a)
          System.out.println(obj.alldata.get(i).b)
          //Outputs as all zeroes
    }

}

怎么会这样?

5 个答案:

答案 0 :(得分:7)

每次尝试创建对象。否则它使用相同的对象。所以只有它不会添加到你的列表中。

            storage tmp = null;
            for (int i = 1; i <= 10; i++)
            {
                 tmp = new storage();
                 tmp.a = i;
                 tmp.b = i;
                 alldata.add(tmp);
            }

而不是

            storage tmp = new storage();
            for (int i = 1; i <= 10; i++)
            {
                 tmp.a = i;
                 tmp.b = i;
                 alldata.add(tmp);
            }

答案 1 :(得分:2)

以下行应位于for方法的filldata()循环中。

storage tmp = new storage();

因为每次你需要创建一个新对象来添加到列表中。在您的情况下,相同的对象将被新值覆盖。

此外,main方法的语法错误。它应该是

public static void main(String[] args)

旁注:复制粘贴IDE中的错误代码。请不要在这里输入。你的代码有很多编译问题(语法错误,缺少分号等)。我说这个的原因是因为我提到的解决方案是你得到所有* 10 * s作为输出而不是* 0 * s的情况。如果你得到* 0 * s,那么你发布的代码就不是那个问题。

答案 2 :(得分:1)

filldata()方法中存在指针缺陷。您只创建了一个对象tmp,并将相同的对象添加到整个列表中。列表中的所有条目都指向同一个对象。要解决您的问题,您应该首先为每个条目创建一个新对象。

将filldata()替换为:

public void filldata(){
        storage tmp;
        for (int i = 1; i <= 10; i++){
             tmp = new storage();
             tmp.a = i;
             tmp.b = i;
             alldata.add(tmp);
        }
  }

答案 3 :(得分:0)

这是你的程序打印所有10个(而不是你说的0),这是错误的。根据@newuser

的答案进行修改
import java.util.*;

class storage{
     public int a = 0;
     public int b = 0;
}

public class anotherclass{
      public List<storage> alldata = new ArrayList<storage>();

      public void filldata(){
            storage tmp = new storage();
            for (int i = 1; i <= 10; i++){
                 tmp.a = i;
                 tmp.b = i;
                 alldata.add(tmp);
            }
      }

public static void main(String[] args){
    anotherclass obj = new anotherclass();
    obj.filldata();

    for (int i = 0; i <= obj.alldata.size() - 1; i++){
          System.out.println(obj.alldata.get(i).a);
          System.out.println(obj.alldata.get(i).b);

    }

}

}

答案 4 :(得分:0)

希望这可以帮到你,即使上面的代码也有内部类静态引用错误。 下面的示例包含new storage(); for循环,它会创建一个新对象,并在每次迭代时获取新的 a和b 值。

import java.util.ArrayList;
import java.util.List;

public class StackClass {

class Storage {

    public int a = 0;
    public int b = 0;
}

public class AnotherClass {

    public List<Storage> allData = new ArrayList<Storage>();

    public void fillData() {

        for (int i = 1; i <= 10; i++) {
            Storage tmp = new Storage();
            tmp.a = i;
            tmp.b = i;
            allData.add(tmp);
        }
    }
}

public static void main(String[] args) {

    StackClass stack = new StackClass();
    AnotherClass obj = stack.new AnotherClass();        

    obj.fillData();

    for (int i = 0; i <= obj.allData.size() - 1; i++) {
        System.out.println("Objec[" + i + "].a-" + obj.allData.get(i).a);
        System.out.println("Objec[" + i + "].b-" + obj.allData.get(i).b);

    }
}
}