有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

参考解释Java中的链表数据结构

我知道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) 个答案

  1. # 1 楼答案

    这是一个涉及范围的问题。在size1()中,您正在创建一个名为head的局部变量。调用size1()时,它会创建一个引用变量,该变量将在调用结束时销毁。这意味着,无论调用size1()多少次,它都会为您提供正确的大小

    但是,当您在size()中使用字段“next”时,它会遍历每个变量,直到结束。然而,一旦它到达那里,它就不会被销毁,因为它的作用域就是对象。这意味着下一次调用size()以及所有后续调用(如果没有更改),它将始终返回1

    Memory Diagram

  2. # 2 楼答案

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