解释Java

时间:2017-06-19 01:25:07

标签: java reference linked-list

我知道java是通过值传递的。对于链表数据结构,方法size()和size1()之间有什么区别?我认为有一点是因为头和下一个参考点指向size1()中的相同内容。但结果是差异

public class IntList {
int item;
IntList next; 

public  IntList(int item, IntList next){
    this.item = item;
    this.next = next;
}

public int size(){
    int size = 1;
    while (next !=null){
        size++;
        next = next.next;
    }
    return size;
}

public int size1(){
    int size = 1;
    IntList head = next;
    while (head != null){
        size++;
        head = head.next;
    }
    return size;
}
public static void main(String[] args) {
    IntList L = new IntList(1,null);
    L = new IntList(2,L); 
    L = new IntList(3,L);
    L = new IntList(10,L);
    L = new IntList(20,L);
    System.out.println(L.size());

}

}

我对java中的引用方法感到困惑。

2 个答案:

答案 0 :(得分:1)

它们在逻辑上是相同的,但size()实际上将next指向最终节点,因此下一个大小检查将返回1. size1()使用局部变量遍历列表,因此对象状态不受影响。

答案 1 :(得分:1)

这是范围问题。在size1()中,您将创建一个名为head的局部变量。当你调用size1()时,它会在调用结束时创建一个将被销毁的引用变量。这意味着无论你调用size1()多少次,它总会给你合适的大小。

但是,当你在size()中使用“next”字段时,它会遍历每个变量直到结束。但是,一旦它到达那里,它就不会被破坏,因为它的范围是对象。这意味着下次调用size()和所有后续调用(没有更改)时,它将始终返回1.

Memory Diagram