ArrayList.add(idx,element) 损坏数组的其他元素
ArrayList.add(idx,element) corrupt other element of array
我是 运行 一个程序:
- 创建
ArrayList
- 在此数组的顶部添加一些元素
- 创建一个 "base" 将减少的元素
- 然后使用 for 循环减少基元素并将其添加到数组的顶部(索引 0)
- 没想到我得到的输出是可怕的
请不要为某些意大利语单词感到难过:
"ora"表示小时,所以
Ora hour = new Ora(6,34) //--> 6:34
"decrementaMinuti" 从小时开始减少分钟数
这是完整代码:
public static void main(String[] args) {
ArrayList<Ora> hours = new ArrayList<>();
hours.add(0, new Ora(01,00));
hours.add(0, new Ora(00,00));
Ora base = hours.get(0);
System.out.println("Base: " + base + "\n");
for (int i = 0; i < 4; i++) {
System.out.println("First: " + base);
// decreasing 60 minutes from hour
base.decrementaMinuti(60);
System.out.println("After: " + base);
hours.add(0, base);
System.out.println("In Array: " + hours.get(0));
System.out.println("[hours]");
for (int j = 0; j < hours.size(); j++) {
System.out.println("[" + hours.get(j) + "]");
}
System.out.println("- - - - - - - -\n");
}
}
这是我得到的输出:
Base: 11:00
First: 11:00
After: 10:00
In Array: 10:00
[hours]
[10:00]
[10:00]
[12:00]
- - - - - - - -
First: 10:00
After: 09:00
In Array: 09:00
[hours]
[09:00]
[09:00]
[09:00]
[12:00]
- - - - - - - -
First: 09:00
After: 08:00
In Array: 08:00
[hours]
[08:00]
[08:00]
[08:00]
[08:00]
[12:00]
- - - - - - - -
First: 08:00
After: 07:00
In Array: 07:00
[hours]
[07:00]
[07:00]
[07:00]
[07:00]
[07:00]
[12:00]
- - - - - - - -
在最后一个输出块中有小时 7:00
5 次,而我从来没有两次添加相同的小时。
我在问:为什么(如您所见)在这个数组的顶部添加一个元素会导致后面的元素也被破坏?
我的java版本:
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
非常感谢您提供的任何帮助。
您将同一实例多次添加到列表中:
Ora base = hours.get(0); // this is the instance added multiple times
System.out.println("Base: " + base + "\n");
for (int i = 0; i < 4; i++) {
System.out.println("First: " + base);
// decreasing 60 minutes from hour
base.decrementaMinuti(60);
System.out.println("After: " + base);
hours.add(0, base); // here you add the same instance multiple times
您必须先创建一个新的 Ora
实例,然后才能将其添加到列表中:
Ora base = hours.get(0);
System.out.println("Base: " + base + "\n");
for (int i = 0; i < 4; i++) {
System.out.println("First: " + base);
Ora newOra = new Ora (...); // consider having a copy constructor that
// would accept base and copy its data
// add code to update newOra to contain the same data as base
// decreasing 60 minutes from hour
newOra.decrementaMinuti(60);
System.out.println("After: " + newOra);
hours.add(0, newOra); // add the new instance
您正在添加同一个对象,Ora base = hours.get(0)
而您只是更改了对象的内容。然而是同一个参考。 ArrayList 允许多次添加同一个对象引用,但 ArrayList 中的条目实际上引用的是同一个对象,以及与数据相同的内存区域。这就是为什么所有人都打印相同的结果。
实际上是因为当您这样做时:"Ora base = hours.get(0);"
base 不是变量的副本。 Java 实际上总是指针。
hours.add(0, 基数);将导致添加相同的一次、两次或三次。
我是 运行 一个程序:
- 创建
ArrayList
- 在此数组的顶部添加一些元素
- 创建一个 "base" 将减少的元素
- 然后使用 for 循环减少基元素并将其添加到数组的顶部(索引 0)
- 没想到我得到的输出是可怕的
请不要为某些意大利语单词感到难过:
"ora"表示小时,所以
Ora hour = new Ora(6,34) //--> 6:34
"decrementaMinuti" 从小时开始减少分钟数
这是完整代码:
public static void main(String[] args) {
ArrayList<Ora> hours = new ArrayList<>();
hours.add(0, new Ora(01,00));
hours.add(0, new Ora(00,00));
Ora base = hours.get(0);
System.out.println("Base: " + base + "\n");
for (int i = 0; i < 4; i++) {
System.out.println("First: " + base);
// decreasing 60 minutes from hour
base.decrementaMinuti(60);
System.out.println("After: " + base);
hours.add(0, base);
System.out.println("In Array: " + hours.get(0));
System.out.println("[hours]");
for (int j = 0; j < hours.size(); j++) {
System.out.println("[" + hours.get(j) + "]");
}
System.out.println("- - - - - - - -\n");
}
}
这是我得到的输出:
Base: 11:00
First: 11:00
After: 10:00
In Array: 10:00
[hours]
[10:00]
[10:00]
[12:00]
- - - - - - - -
First: 10:00
After: 09:00
In Array: 09:00
[hours]
[09:00]
[09:00]
[09:00]
[12:00]
- - - - - - - -
First: 09:00
After: 08:00
In Array: 08:00
[hours]
[08:00]
[08:00]
[08:00]
[08:00]
[12:00]
- - - - - - - -
First: 08:00
After: 07:00
In Array: 07:00
[hours]
[07:00]
[07:00]
[07:00]
[07:00]
[07:00]
[12:00]
- - - - - - - -
在最后一个输出块中有小时 7:00
5 次,而我从来没有两次添加相同的小时。
我在问:为什么(如您所见)在这个数组的顶部添加一个元素会导致后面的元素也被破坏?
我的java版本:
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
非常感谢您提供的任何帮助。
您将同一实例多次添加到列表中:
Ora base = hours.get(0); // this is the instance added multiple times
System.out.println("Base: " + base + "\n");
for (int i = 0; i < 4; i++) {
System.out.println("First: " + base);
// decreasing 60 minutes from hour
base.decrementaMinuti(60);
System.out.println("After: " + base);
hours.add(0, base); // here you add the same instance multiple times
您必须先创建一个新的 Ora
实例,然后才能将其添加到列表中:
Ora base = hours.get(0);
System.out.println("Base: " + base + "\n");
for (int i = 0; i < 4; i++) {
System.out.println("First: " + base);
Ora newOra = new Ora (...); // consider having a copy constructor that
// would accept base and copy its data
// add code to update newOra to contain the same data as base
// decreasing 60 minutes from hour
newOra.decrementaMinuti(60);
System.out.println("After: " + newOra);
hours.add(0, newOra); // add the new instance
您正在添加同一个对象,Ora base = hours.get(0)
而您只是更改了对象的内容。然而是同一个参考。 ArrayList 允许多次添加同一个对象引用,但 ArrayList 中的条目实际上引用的是同一个对象,以及与数据相同的内存区域。这就是为什么所有人都打印相同的结果。
实际上是因为当您这样做时:"Ora base = hours.get(0);" base 不是变量的副本。 Java 实际上总是指针。
hours.add(0, 基数);将导致添加相同的一次、两次或三次。