Java 初始化数组列表的编码实践
我希望改进我的Java编码 是否有人可以提供一个链接或解释,说明是否有初始化ArrayList的实践守则,并避免以下问题: -我在一个类中有6个ArrayList,有些是其他类的子集。因为有些是其他方法的子集,我知道它们通过“addAll()”和“add()”方法共享相同的引用。Java 初始化数组列表的编码实践,java,arraylist,Java,Arraylist,我希望改进我的Java编码 是否有人可以提供一个链接或解释,说明是否有初始化ArrayList的实践守则,并避免以下问题: -我在一个类中有6个ArrayList,有些是其他类的子集。因为有些是其他方法的子集,我知道它们通过“addAll()”和“add()”方法共享相同的引用。 因此,通过尝试更改子集中的元素,我也在更改原始集合,因为它们共享相同的引用。我的代码非常混乱,几个“get”调用会导致我的两个ArrayList被重置 我已经研究过这个论坛和谷歌,但似乎找不到我想要的相关信息。我只找到
因此,通过尝试更改子集中的元素,我也在更改原始集合,因为它们共享相同的引用。我的代码非常混乱,几个“get”调用会导致我的两个ArrayList被重置 我已经研究过这个论坛和谷歌,但似乎找不到我想要的相关信息。我只找到ArrayList的简单示例。我注意到在这个论坛上有一些与ArrayList参考文献相关的问题,所以我认为这个问题的答案将来会对其他人有益 是否有人可以提供一个链接或解释,说明是否有初始化ArrayList的实践守则,并避免以下问题: 在初始化ArrayList方面没有这样的实践规范,也没有最佳实践或其他什么 问题基本上是,您需要理解Java中使用对现有对象的引用和创建新对象之间的区别。然后你需要选择一个合适的。。。取决于你想做什么 (在这个主题上询问“最佳实践”就像在您是否应该使用
+
或-
运算符时询问“最佳实践”…)
与其在谷歌上搜索“最佳实践”,我建议您返回Java教科书/教程/课堂讲稿,阅读以下内容:
- 什么是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。好的,但是我需要一些时间来重新编辑。我知道我有参考问题,我对课堂上的参考分享数量并不感到惊讶。但我正在努力找出一个小的例子。让我看看是否可以用最少的代码进行编辑。