0

我正在寻求改进我的 Java 编码。

有人可以提供链接或解释是否有初始化 ArrayLists 的实践代码并避免以下问题:

-我在一个类中有 6 个 ArrayList,有些是其他类的子集。因为有些是其他人的子集,我知道它们通过“addAll()”和“add()”方法共享相同的引用。

结果,通过尝试更改子集中的元素,我也在更改原始集合,因为它们再次共享相同的引用。我的代码非常混乱,以至于一些“get”调用导致我的 2 个 ArrayLists 被重置。

我研究了这个论坛和谷歌,我似乎无法找到我想要的相关信息。我只找到 ArrayLists 的简单示例。我注意到这个论坛上有一些与 ArrayList 参考相关的问题,所以我认为这个问题的答案将在未来对其他人有所帮助。

4

2 回答 2

3

有人可以提供链接或解释是否有初始化 ArrayLists 的实践代码并避免以下问题:

没有这样的实践代码,或最佳实践或初始化 ArrayLists 的任何内容。

问题基本上是您需要了解Java 中使用对现有对象的引用和创建新对象之间的区别。然后你需要选择合适的...取决于你想要做什么

(在这个主题上询问“最佳实践”就像询问是否应该使用+-运营商的“最佳实践”......)

我建议您不要在谷歌上搜索“最佳实践”,而是回到您的 Java 教科书/教程/讲义并阅读:

  • 什么是 Java 对象引用
  • 对象分配意味着什么,以及
  • 操作员做什么new

并确保您真正了解它们。当您了解它们时,您将能够理解使用哪个来执行您在程序中尝试执行的操作。

于 2012-11-28T12:50:20.287 回答
1

addAll 添加对 ArrayList 中对象的引用,而不是对象的副本。如果您想要副本,则必须遍历第一个 ArrayList,并且对于每个对象,调用将创建对象副本的“克隆”函数,并将其添加到新的 ArrayList。

例子:

public static void main(String[] args) {
    ArrayList<Foo> A = new ArrayList<Foo>();
    A.add(new Foo("foo1", 1));
    A.add(new Foo("foo2", 2));
    ArrayList<Foo> B = new ArrayList<Foo>();
    System.out.println("Before: ");
    System.out.println("A:");
    for(Foo foo:A){
        System.out.println(foo);
        try {
            B.add((Foo)foo.clone());
        } catch (CloneNotSupportedException ex) {
            //Never Gonna Happen
        }
    }
    System.out.println("B:");
    for(Foo foo:B){
        System.out.println(foo);
    }

    A.remove(0);

    System.out.println("After:");
    System.out.println("A:");
    for(Foo foo:A){
        System.out.println(foo);
    }
    System.out.println("B:");
    for(Foo foo:B){
        System.out.println(foo);
    }
}

public static class Foo{
    private String Name;
    private int Id;

    public Foo(String Name, int Id) {
        this.Name = Name;
        this.Id = Id;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new Foo(Name,Id);
    }

    @Override
    public String toString() {
        return "Name: "+Name+", Id: "+Id;
    }
}

这打印出来:

Before: 
A:
Name: foo1, Id: 1
Name: foo2, Id: 2
B:
Name: foo1, Id: 1
Name: foo2, Id: 2
After:
A:
Name: foo2, Id: 2
B:
Name: foo1, Id: 1
Name: foo2, Id: 2

如果您处理您创建的类的 ArrayLists,请确保它们都覆盖了“克隆”功能。对于包含您还创建的类的类,请使用您为父类“克隆”中的内部类创建的“克隆”函数。等等。

于 2012-11-28T13:02:26.217 回答