Java 初始化数组列表的编码实践

Java 初始化数组列表的编码实践,java,arraylist,Java,Arraylist,我希望改进我的Java编码 是否有人可以提供一个链接或解释,说明是否有初始化ArrayList的实践守则,并避免以下问题: -我在一个类中有6个ArrayList,有些是其他类的子集。因为有些是其他方法的子集,我知道它们通过“addAll()”和“add()”方法共享相同的引用。 因此,通过尝试更改子集中的元素,我也在更改原始集合,因为它们共享相同的引用。我的代码非常混乱,几个“get”调用会导致我的两个ArrayList被重置 我已经研究过这个论坛和谷歌,但似乎找不到我想要的相关信息。我只找到

我希望改进我的Java编码

是否有人可以提供一个链接或解释,说明是否有初始化ArrayList的实践守则,并避免以下问题:

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

因此,通过尝试更改子集中的元素,我也在更改原始集合,因为它们共享相同的引用。我的代码非常混乱,几个“get”调用会导致我的两个ArrayList被重置

我已经研究过这个论坛和谷歌,但似乎找不到我想要的相关信息。我只找到ArrayList的简单示例。我注意到在这个论坛上有一些与ArrayList参考文献相关的问题,所以我认为这个问题的答案将来会对其他人有益

是否有人可以提供一个链接或解释,说明是否有初始化ArrayList的实践守则,并避免以下问题:

在初始化ArrayList方面没有这样的实践规范,也没有最佳实践或其他什么

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

(在这个主题上询问“最佳实践”就像在您是否应该使用
+
-
运算符时询问“最佳实践”…)

与其在谷歌上搜索“最佳实践”,我建议您返回Java教科书/教程/课堂讲稿,阅读以下内容:

  • 什么是Java对象引用
  • 对象赋值的含义,以及
  • 新的
    操作员所做的操作
确保你真正理解他们。当您理解它们时,您将能够理解在您的程序中使用哪一个来执行您正试图执行的操作

是否有人可以提供一个链接或解释,说明是否有初始化ArrayList的实践守则,并避免以下问题:

在初始化ArrayList方面没有这样的实践规范,也没有最佳实践或其他什么

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

(在这个主题上询问“最佳实践”就像在您是否应该使用
+
-
运算符时询问“最佳实践”…)

与其在谷歌上搜索“最佳实践”,我建议您返回Java教科书/教程/课堂讲稿,阅读以下内容:

  • 什么是Java对象引用
  • 对象赋值的含义,以及
  • 新的
    操作员所做的操作

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

addAll将引用添加到ArrayList中的对象,而不是对象的副本。如果要复制,必须遍历第一个ArrayList,对于每个对象,调用“clone”函数创建对象的副本,并将其添加到新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;
    }
}

如果处理创建的类的ArrayList,请确保它们都覆盖了“clone”函数。对于包含您还创建的类的类,请使用您为父类“clone”中的内部类创建的“clone”函数。依此类推。

addAll将引用添加到ArrayList中的对象,而不是对象的副本。如果要复制,必须遍历第一个ArrayList,对于每个对象,调用“clone”函数创建对象的副本,并将其添加到新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;
    }
}

如果处理创建的类的ArrayList,请确保它们都覆盖了“clone”函数。对于包含您还创建的类的类,请使用您为父类“clone”中的内部类创建的“clone”函数。诸如此类。

你应该展示你的代码-听起来有些重构是有益的…我的代码太长了,但如果你愿意的话,我会把它包括进去。@cworner1:要问一些有用的问题,请创建一个简单的、自成体系的例子来说明你所说的内容。贴出来,然后问你关于它的问题。也许是数组。asList(T…a)@T.J.Crowder。好的,但是我需要一些时间来重新编辑。我知道我有参考问题,我对课堂上的参考分享数量并不感到惊讶。但我正在努力找出一个小的例子。让我看看我是否可以用最少的代码进行编辑。你应该展示你的代码-听起来有些重构是有益的…我的代码太长了,但如果你愿意的话,我会把它包括进去。@cworner1:要问一些有用的问题,请创建一个最小的、自包含的示例来说明你所说的内容。贴出来,然后问你关于它的问题。也许是数组。asList(T…a)@T.J.Crowder。好的,但是我需要一些时间来重新编辑。我知道我有参考问题,我对课堂上的参考分享数量并不感到惊讶。但我正在努力找出一个小的例子。让我看看是否可以用最少的代码进行编辑。