簡體   English   中英

LinkedList:getFirst() 和 getLast() 指向同一個元素是否有原因?

[英]LinkedList : Is there a reason that getFirst() and getLast() are pointing to the same element?

在使用 Collections 提供的 LinkedList 時,是否存在 getFirst() 和 getLast() 顯示相同元素的情況?

我正在將數據解析為要保存的暫存變量; 然后我將這些變量存儲在一個新的 object 中,以使用 add() 方法存儲在我的 LinkedList 中。 但是,當我打印語句時,每次將 object 添加到我的 LinkedList 之后,通過使用 getFirst() 和 getLast(),它們指向同一個 object?

請看下面的代碼(請不要過多批評代碼,我只是一個初學者,所以我知道它不漂亮,但它重現了我的問題)

public class Main {

    public static void main(String[] args) {
        Parse parse = new Parse();
        parse.main();
    }
}

import java.lang.reflect.Array;

public class Parse {
    String[] input = {"1", "a",
        "2", "b",
        "3","c",
        "4", "d"};

    Object tempObject = new Object();

    String tempLength;
    String tempFilename;
    int arrayIndex = 0;
    public static ObjectList objectList = new ObjectList();

    Parse(){
    }

    public void main() {

        for (int i = 0; i != input.length; i++) {
            String stringInput = iterateInputArray(input, i);
            addToTempObject(stringInput);

            Object finalObject = new Object();
            finalObject = tempObject;
            Object tempObject = new Object();

            objectList.addToList(finalObject);

            System.out.println("First:" + ObjectList.listOfObjects.getFirst());
            System.out.println("Last:" + ObjectList.listOfObjects.getLast());
        }
    }

    public String iterateInputArray(String[] input, int arrayIndex){
        String string = input[arrayIndex];
        return string;
    }

    private void addToTempObject(String inputString){
        if (tempLength == null){
            tempLength = inputString;
            tempObject.setLength(inputString);
        }
        else {
            tempObject.setFilename(inputString);
            tempFilename = inputString;
            resetTempVariables();
        }
    }

    private void resetTempVariables() {
        tempLength = null;
        tempFilename = null;
    }
}

public class Object {

    private String length;
    private String filename;

    public Object( String length, String filename) {

        this.length = length;
        this.filename = filename;
    }

    public Object(){
        this.length = null;
        this.filename = null;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    public void setLength(String length) {
        this.length = length;
    }


    public String getLength() {
        return this.length;
    }

    public String getFilename() {
        return this.filename;
    }

}

import java.util.LinkedList;

public class ObjectList extends Object {
    public static LinkedList<java.lang.Object> listOfObjects = new
        LinkedList<java.lang.Object>();

    public ObjectList() {
    }

    public void addToList(Object object){
        listOfObjects.add(object);
    }
}

我減少了代碼。 對於問題的討論,簡化的代碼與提供的代碼相同:

import java.util.LinkedList;

class Scratch {

    public static final Object tempObject = new Object();

    public static void main(String[] args) {
        LinkedList<Object> list = new LinkedList<>();
        for (int i = 0; i != 10; i++) {

            list.add(tempObject);

            System.out.printf("First: %s, Last: %s, Size: %d%n",
                list.getFirst(),
                list.getLast(),
                list.size());
        }
    }
}

Ideone 演示

代碼不斷將一個相同的 object ( tempObject ) 添加到列表中。 請注意引入的final關鍵字以突出顯示變量tempObject在其整個生命周期內引用相同的 object。 因此,列表的大小會增加,但列表會一遍又一遍地包含相同的 object。 這就是getFirst()getLast()返回相同 object 的原因。

該問題可以通過例如在循環中移動tempObject的聲明來解決:

import java.util.LinkedList;

class Scratch {

    public static void main(String[] args) {
        LinkedList<Object> list = new LinkedList<>();
        for (int i = 0; i != 10; i++) {
            final Object tempObject = new Object();
            list.add(tempObject);

            System.out.printf("First: %s, Last: %s, Size: %d%n",
                list.getFirst(),
                list.getLast(),
                list.size());
        }
    }
}

Ideone 演示

是的,只有一個元素的鏈表。 像下面的測試

import static org.assertj.core.api.Assertions.assertThat

class ListSpec extends Specification{

    def "linked list with one elem"(){
        given: "a linked list with one element"
        LinkedList<String> list = new LinkedList<>()
        list.add("test")
        expect:"last and first element are same"
        assertThat(list.getFirst()).isEqualTo(list.getLast())
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM