我一直试图填写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
个元素。
答案 0 :(得分:5)
您在每次循环迭代中添加相同的 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
的副本添加到列表中(您可能已经假设),而是将另一个引用添加到此{ {1}}到列表中。
答案 1 :(得分:4)
每次在循环中时,您需要创建一个新的Item
对象:
for(ListItem it : getAllItems()){
//create a *new* object on each iteration
Item item = new Item();
item.setDate(it.getDate);
lst.add(item);
}
在您的代码中,您有一个 Item
对象,您始终setDate
。
答案 2 :(得分:0)
我只是提供了之前的答案,提供了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
,因此我们会有一个相同{{1}}的列表。