java是节点列表、数组、列表还是其他什么?
我正在写一篇关于java性能的演讲,我试图确定这是否是一个糟糕的做法。我是C++的人,所以我还不知道java的一切。我没有item()的源代码,我需要一个快速的答案
这对性能是否有害:
NodeList elems; // public abstract interface org.w3c.dom.NodeList
for (int i = 0; i < elems.getLength(); i++) {
elem = elems.item(i);
if (elem.getNodeType() == Node.ELEMENT_NODE) {
// do something with a node
}
}
我首先关心的是NodeList可能会使用一个链表来实现,在这种情况下,项(i)将是一场灾难
还有其他想法吗
# 1 楼答案
NodeList
是一个接口,如果不知道您正在/将要使用哪个实现,就无法说明它是如何实现的界面如下所示:
Docs说:
# 2 楼答案
根据Java文档(https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/NodeList.html)
节点列表是节点的有序集合,因此我假设它是一个排序列表。如果内存没问题,ArrayList会在引擎盖下使用规则数组背后的逻辑。我之所以怀疑它是一个列表,主要是因为它的名字叫“节点列表”
对于item(index),它要么返回索引处的项,要么返回null。这同样来自API。希望这对我有所帮助,我并没有太多使用节点列表
# 3 楼答案
WC3标准规定了节点列表的底层数据结构,因此它是数组还是链表(或两者)取决于DOM的实现。然而,NodeList接口只定义了“getLength()”和“item(i)”,因此您编写的代码几乎是完成任务的唯一方法,而不管性能如何
# 4 楼答案
这取决于实施情况。例如,OpenJDK提供了一个linked list implementation
更准确地说,
Node
是一个接口。与List
接口不同,它的文档对性能没有任何保证。上面的实现是IIOMetadataNode
。这个类在它的文档中同样没有性能保证,但是源代码在上面并回答了这个问题有许多实现:
这可能会产生其他性能保证。您应该尝试确定正在处理的
NodeList
的实现类,并检查其源代码