为什么我的LinkedList填充了相同的对象?

时间:2014-08-19 08:03:53

标签: java linked-list

我一直试图填写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个元素。

3 个答案:

答案 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}}的列表。