java - 在静态方法中调用ArrayList的实例

标签 java arrays arraylist static-methods

编辑:我正在重写这个问题,希望使代码更加明确。

我有一个类 Pred,有 2 个变量。

public class Pred {

    private String str;
    private ArrayList<Keys> keysArr;

    public Pred(String s) {
        this.str = s;
        keysArr = new ArrayList<Keys>;
    }

    public void setKeysArr(ArrayList<Keys> kArr) {
        this.keysArr.addAll(kArr);
    }
}

在 extract() 方法中,我循环另一个数组,获取一些变量,并使用它们来创建新的 Preds

public static Collection<Pred> extractPause(Keys[] kseArr) {

    Collection<Pred> predArray = new ArrayList<Pred>(); 

    // create method variables
    ArrayList<Keys> keysArray ka = new ArrayList<Keys>();
    String s = "";

    // loop through an array
    for (int i; i < someArray.size(); i++) {
        s = "Sam"+i;
        ka.add(key1+i);
        ka.add(key2+i);

        // create new instance of Pred
        Pred p = new Pred(s);
        p.setKeysArr(ka);
        predArray.add(p);

        // reset variables (not sure if that's necessary)
        s = "";
        ka.clear();

    }
    return predArray;
}

当我去打印Preds的数组时,我遇到了一个奇怪的情况,我只得到最后一个 Pred 的数组值。在 predArray

public void print() {
    for (Pred p : predArry)
        System.out.println(p.str+" "+p.get(p.keysArr.size()-1).getKeys());
}

输出:

Sam1 key12 key2  
Sam2 key12 key22  

应该是:

Sam1 key11 key21  
Sam2 key12 key22  

最佳答案

可能是因为当您创建 Foo 实例列表时,您会这样做

Foo foo = new Foo();
for (int i = 0; i < 10; i++) {
    foo.setBarStr("hello " + i);
    foo.setKeyArray(...);
    list.add(foo);
}

而不是做

for (int i = 0; i < 10; i++) {
    Foo foo = new Foo();
    foo.setBarStr("hello " + i);
    foo.setKeyArray(...);
    list.add(foo);
}

请记住,列表包含对对象的引用,而不是对象的副本。因此,如果您将同一个 Foo 实例添加到列表中 10 次,则列表将包含对此唯一实例的 10 个引用,其中当然会包含其最后修改的状态。

关于java - 在静态方法中调用ArrayList的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13894019/

相关文章:

java - 获取nativeQuery with table join result list into JSONObject

java - #define 在 java/android studio 中使用

python - numpy 数组,即 (n,1) 和 (n,)

java - 我需要一个文件阅读器来逐行读取文本文件并用 Java 格式化它们

javascript - 检查 arraylist 属性是否对所有对象都为 true

grails - Grails:ArrayList-检索速度

java - 编译此OCR库代码

java - 以最安全的方式使用准备好的语句

c - 需要用数组计算级数

javascript - 如何仅返回数组中匹配/过滤的字符串?