Java中两种链表创建方法差异及push()与add()方法失效问题解析
Java中两种创建链表的方法区别
Java里创建链表主要有两种常见方式,核心差异如下:
- 自定义链表实现:自己编写节点类、链表操作逻辑,完全掌控底层细节。可以根据需求定制节点结构(比如添加额外业务字段)、增删改查规则,适合学习链表原理或者有特殊业务需求的场景,但需要自行处理空链表、边界判断等所有细节,开发成本较高。
- 使用JDK自带的
java.util.LinkedList:JDK封装好的双向链表实现,提供了现成的add()、remove()、get()等API,无需关心底层节点操作,开发效率高。但它是线程不安全的,且只能使用标准链表结构,灵活性不如自定义实现。
自定义LinkedList中push()与add()方法的差异分析
执行代码的main方法后,输出结果是7 、6 、5 ,调用add()添加的节点3并未出现在链表中,问题根源在于Java的参数传递规则:
push()方法直接操作类的成员变量head:将新节点的next指向当前成员变量head,再把成员变量head更新为新节点,这个修改直接作用于链表的头部引用,因此能成功添加元素。add()和addNode()方法操作的是局部变量:调用list.add(new Node(3), list.head)时,传递的是list.head的引用副本,addNode()里的head参数是方法内部的局部变量。修改这个局部变量的指向(head = newnode)只会改变临时变量的值,完全不会影响类实例的成员变量list.head。就像复制了一把家门钥匙,修改复制的钥匙,原钥匙不会有任何变化,自然没法打开原来的家门。
简单来说,add()方法看似在修改链表头部,实则只是在方法内部操作临时引用,根本没触碰到底层链表的真正头部,所以元素无法成功添加。
内容的提问来源于stack exchange,提问作者demsee
相关产品推荐
相关产品推荐

