在类中,我已经用一个私有的Node
类实现了自己的LinkedList
类,所以我以前从未遇到过这个问题。但现在我正试图使用Java内置的LinkedList库重新解决一个问题,结果遇到了麻烦。(我上次使用Java也有几年了(。
比方说我有一个简单的骨架。如何将head节点传递到函数中?
public static void main(String[] args)
{
LinkedList<Integer> test = new LinkedList<Integer>();
doSomething(test.get(0));
}
private static void doSomething(Node a)
{
//stuff
}
还有人能提醒我这两者之间有什么区别吗?我知道第一次你基本上是把列表选为LinkedList,但为什么要这样做?
List<E> test = new LinkedList<E>();
LinkedList<E> test = new LinkedList<E>();
查看LinkedList的文档,没有公开列表节点的方法。事实上,LinkedList
甚至可能以完全不同的方式实现,根本不使用节点,并且仍然具有链表的所有属性和性能保证。这是一个实现细节。
标准库LinkedList
类使用封装来避免向类的用户(您(公开实现细节(如列表节点的实现方式(。
除了使用高级技术(如破坏封装的反射(之外,您无法获得对内部列表节点的引用。
您可以使用LinkedList类提供的方法来添加和检索列表元素,而不是摆弄列表节点和它们之间的指针。例如:
LinkedList<Integer> test = new LinkedList<Integer>();
test.add(314);
test.add(879);
Integer first = test.getFirst(); // returns 314
Integer first = test.get(1); // returns 879
封装的好处是JVM实现者可以自由地完全更改LinkedList的内部实现,而不用担心破坏您的程序。
如果您使用List
接口而不是LinkedList
类,您可以在自己的程序中获得相同的好处,方法是:
List<E> test = new LinkedList<E>();
如果您这样做,您可以在以后将test
从LinkedList
更改为ArrayList
或任何其他列表实现,而不对代码进行其他更改,例如,如果应用程序需求发生了更改,或者您发现ArrayList为您提供了更好的性能。
Java的原生链接类存在一些问题。迭代器可以用于访问节点,但如下所述受到限制。无法在列表中或在列表之间移动节点,例如C++std::list::splice。
https://en.cppreference.com/w/cpp/container/list/splice
对于Java;移动";节点需要移除和插入节点,这涉及到为移除的任何节点解除分配,以及为插入的任何节点分配。
Java的迭代器不能浅层复制。赋值只是将另一个变量设置为指向同一迭代器对象。(C++迭代器没有这个问题(。
从列表中删除或插入节点将使该列表的所有迭代器无效(用于删除或插入的迭代器除外(。(C++迭代器按预期运行(。