JAVA队列每次添加需要新实例才能独立更新
- 队列里面的实例
- 多次添加同一个实例
- 实例
- 结果
- 每次添加一个新实例
- 实例
- 结果
- 队列中添加包装类型
- 实例
- 结果
队列里面的实例
由于JAVA对于Object类型参数传参传递的是地址,实例更新,队列里面的实例也会被更新。关于JAVA参数传递与值的变化关系可以查看这里。
多次添加同一个实例
如果多次添加的是同一个实例,实例值的更新会影响到队列里全部该实例的值。
实例
ArrayList<LinkedList<Integer>> resultList = new ArrayList<>();
LinkedList<Integer> tempList = new LinkedList<>();
tempList.add(1);
resultList.add(tempList);
tempList.add(3);
resultList.add(tempList);
System.out.println(resultList);
结果
[[1, 3], [1, 3]]
可以看到队列中全部对象发生了值的变化。
每次添加一个新实例
如果每次添加一个新实例,受影响的就只是单个实例。
实例
ArrayList<LinkedList<Integer>> resultList = new ArrayList<>();
LinkedList<Integer> tempList1 = new LinkedList<>();
LinkedList<Integer> tempList2 = new LinkedList<>();
tempList1.add(1);
resultList.add(tempList1);
tempList2.add(3);
resultList.add(tempList2);
tempList2.add(4);
System.out.println(resultList);
结果
[[1], [3, 4]]
可以看到队列中只有第二个对象发生了值的变化。
队列中添加包装类型
实例
ArrayList<LinkedList<Integer>> resultList = new ArrayList<>();
LinkedList<Integer> tempList = new LinkedList<>();
resultList.add(tempList);
Integer value = Integer.valueOf(10);
tempList.add(value);
tempList.add(value);
value = 20;
System.out.println(resultList);
value = 20这里是新创建了一个Integer实例,详情可查看,然后赋值给value,value的值改变了。
结果
[[10, 10]]
可以看到队列中没有一个对象发生值的变化。这是由于队列中存储的包装类的地址跟value = 20新创建的实例地址不一致,大家互不影响。由于包装类每次值的更新都是新创建一个实例,这里可以参考String, StringBuilder, StringBuffer, StringJoiner区别中对String的描述以及JAVA包装类变量赋值是会新创建对象实例。而队列类中不能添加基本类型,这里可以忽略基本类型不作讨论。如果想要队列中的对象发生值的变化则要将更新队列中的对象地址。可以参考下面的实例。
ArrayList<LinkedList<Integer>> resultList = new ArrayList<>();
LinkedList<Integer> tempList = new LinkedList<>();
resultList.add(tempList);
Integer value = Integer.valueOf(10);
tempList.add(value);
tempList.add(value);
value = 20;
tempList.set(1, value);
System.out.println(resultList);
通过队列的set()方法直接更新队列中第二个对象的地址。结果如下:
[[10, 20]]
可以看到,队列中第二个对象的值发生了变化。