与 ArrayList 的另一个 ArrayList 相比,创建一个 ArrayList 的 ArrayList 具有一个附加元素
Creating an ArrayList of ArrayList having one additional element compared to another ArrayList of ArrayList
我有一个 ArrayList (alal) 的 ArrayList 和一个 ArrayList(al)。我想将 al 插入到 alal,但我希望 alal.get(0) 包含 al 的所有内容以及添加的元素 100。我认为最简单的方法是先做
alal.add(al);
然后访问它的第 0 个元素,并添加一个 100,例如
alal.get(0).add(100);
然而,问题是 al 的内容也会发生变化,因为它是一个对象,所以 alal 持有它的引用而不是值。
下面我试过了。请告诉我这样做是否正确,或提出改进建议。
import java.util.ArrayList;
public class additionalal {
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> alal = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> al = new ArrayList<Integer>();
al.add(1);al.add(2);al.add(3);
//WRONG
// alal.add(al);
// alal.get(0).add(100);
//CORRECT
ArrayList<Integer> alextra = new ArrayList<Integer>();
alextra.addAll(al);
alextra.add(100);
alal.add(alextra);
System.out.println(alal);
System.out.println(al);
}
}
添加时将您的列表包装到一个新的 ArrayList
中,从而克隆它:
alal.add(new ArrayList<>(al));
alal.get(0).add(100);
但请注意,列表中的元素并未与其一起克隆。当您有 Integer
列表时这没问题,但在存储具有动态属性的类型的元素时可能会导致意外行为。例如,假设您要存储 List
of List
s of Person
s:
class Person {
String name = "";
public String getName() {
return this.name;
}
public void setName(String otherName) {
this.name = otherName;
}
public String toString() {
return "Person[name=" + this.name + ']';
}
}
现在,我创建一个 Person
,将其放入 List
persons
,然后我将 persons
的副本放入 personGroups
]:
Person user = new Person();
user.setName("saltandwater");
List<Person> persons = new ArrayList<>();
persons.add(user);
List<List<Person>> personGroups = new ArrayList<>();
personGroups.add(new ArrayList<>(persons));
同时打印这两个列表会产生类似于
的结果
persons: [Person[name=saltandwater]]
personGroups: [[Person[name=saltandwater]]]
现在,将新的 Person
添加到 persons
中不会修改 personGroups
。但是,由于未克隆 user
(仅克隆了 persons
列表),因此 user.name
中的更改将反映在两个列表中:
user.setName("Mr. Yetti");
将导致
persons: [Person[name=Mr. Yetti]]
personGroups: [[Person[name=Mr. Yetti]]]
我有一个 ArrayList (alal) 的 ArrayList 和一个 ArrayList(al)。我想将 al 插入到 alal,但我希望 alal.get(0) 包含 al 的所有内容以及添加的元素 100。我认为最简单的方法是先做
alal.add(al);
然后访问它的第 0 个元素,并添加一个 100,例如
alal.get(0).add(100);
然而,问题是 al 的内容也会发生变化,因为它是一个对象,所以 alal 持有它的引用而不是值。
下面我试过了。请告诉我这样做是否正确,或提出改进建议。
import java.util.ArrayList;
public class additionalal {
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> alal = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> al = new ArrayList<Integer>();
al.add(1);al.add(2);al.add(3);
//WRONG
// alal.add(al);
// alal.get(0).add(100);
//CORRECT
ArrayList<Integer> alextra = new ArrayList<Integer>();
alextra.addAll(al);
alextra.add(100);
alal.add(alextra);
System.out.println(alal);
System.out.println(al);
}
}
添加时将您的列表包装到一个新的 ArrayList
中,从而克隆它:
alal.add(new ArrayList<>(al));
alal.get(0).add(100);
但请注意,列表中的元素并未与其一起克隆。当您有 Integer
列表时这没问题,但在存储具有动态属性的类型的元素时可能会导致意外行为。例如,假设您要存储 List
of List
s of Person
s:
class Person {
String name = "";
public String getName() {
return this.name;
}
public void setName(String otherName) {
this.name = otherName;
}
public String toString() {
return "Person[name=" + this.name + ']';
}
}
现在,我创建一个 Person
,将其放入 List
persons
,然后我将 persons
的副本放入 personGroups
]:
Person user = new Person();
user.setName("saltandwater");
List<Person> persons = new ArrayList<>();
persons.add(user);
List<List<Person>> personGroups = new ArrayList<>();
personGroups.add(new ArrayList<>(persons));
同时打印这两个列表会产生类似于
的结果persons: [Person[name=saltandwater]]
personGroups: [[Person[name=saltandwater]]]
现在,将新的 Person
添加到 persons
中不会修改 personGroups
。但是,由于未克隆 user
(仅克隆了 persons
列表),因此 user.name
中的更改将反映在两个列表中:
user.setName("Mr. Yetti");
将导致
persons: [Person[name=Mr. Yetti]]
personGroups: [[Person[name=Mr. Yetti]]]