LinkedList实现中current与head引用为何不被视为别名?
为什么修改
curr的指向不会影响head? 先掰明白Java里引用的本质:引用变量是存储对象地址的容器,多个引用指向同一个对象时,它们是对象的别名,但引用变量本身是独立的。
拆解你的代码逻辑
看这段关键代码:
Node curr = head; // 把head里的对象地址复制给curr while (curr.next != null) { curr = curr.next; // 修改curr的指向,和head无关 } curr.next = newNode; // 修改curr指向的对象的属性,会影响链表结构
分情况解释核心问题:
复制引用地址:
执行Node curr = head时,head里存的是某个Node对象的内存地址,这个地址被复制到了curr变量里。此时curr和head都指向同一个Node对象,但curr和head是两个完全独立的变量——就像你和朋友都拿着写着同一个餐厅地址的纸条,你们俩的纸条是分开的。修改引用变量的指向:
执行curr = curr.next时,你是把curr这个变量里的地址换成了curr.next的地址(也就是下一个Node的地址)。这就相当于你把自己手里的纸条换成了餐厅隔壁咖啡馆的地址,但你朋友手里的纸条还是原来餐厅的地址——head变量里的地址根本没动,自然不会受影响。修改引用指向的对象内容:
最后执行curr.next = newNode时,你是在修改curr当前指向的那个Node对象的next属性。这时候因为这个Node是链表的一部分,head指向的整个链表结构会跟着更新——就像你和朋友都去了那个餐厅,你在餐厅里加了个新包间,你朋友回来也能看到这个新包间。
纠正你的误解点
你混淆了修改引用变量的指向和修改引用指向的对象的内容:
- 多个引用指向同一个对象时,修改对象的内容会让所有引用都看到变化;
- 但修改引用变量本身的指向(把它赋值成另一个对象的地址),只会改变这个引用自己的指向,和其他引用无关。
内容的提问来源于stack exchange,提问作者Jiya varma
相关产品推荐
相关产品推荐

