我一直在尝试填写LinkedList
.我编写了以下代码:
List<Item> lst = new LinkedList<Item>();
Item item = new Item();
for(ListItem it : getAllItems()){
item.setDate(it.getDate);
//Setting up it's property to item
lst.add(item);
}
但是在执行上面的代码后,我们lst
包含相同元素的List
,该元素已在上次执行 foreach 主体时添加。我预计我们有一个List
元素,这些元素已经在foreach
机构的任何执行中建立起来。
您将在每次循环迭代中添加相同的Item
对象。由于您每次都会更改其日期,因此它最终会设置最后一个日期。
for(ListItem it : getAllItems()){
Item item = new Item();
item.setDate(it.getDate);
//Setting up it's property to item
lst.add(item);
}
请注意,调用 add
不会将item
的副本添加到列表中(您可能一直假设(,而是将对此item
的另一个引用添加到列表中。
在循环中都需要创建一个新的Item
对象:
for(ListItem it : getAllItems()){
//create a *new* object on each iteration
Item item = new Item();
item.setDate(it.getDate);
lst.add(item);
}
在您的代码中,您有一个始终setDate
Item
对象。
我只是为了改进之前的答案,提供LinkedList的来源。由内部类表示的 LinkedList 元素
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
add(E e)
具有以下实现:
public boolean add(E e) {
linkLast(e);
return true;
}
和linkLast(E e)
方法:
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
也就是说,每次我们将item
添加到列表中时,我们只是设置了 last.next = item
,因此我们有一个 相同item
的列表 .