为什么我的链表充满了相同的对象

  • 本文关键字:对象 链表 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机构的任何执行中建立起来。

您将在每次循环迭代中添加相同的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的列表 .

相关内容

  • 没有找到相关文章

最新更新