我正在撰写关于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)将是一场灾难。
还有其他想法吗?
答案 0 :(得分:2)
NodeList
是一个接口,在不知道您将要/将要使用哪个实现的情况下,无法说明它是如何实现的。
接口看起来像这样:
interface NodeList {
int getLength();
Node item(int index);
}
Docs说:
NodeList接口提供有序节点集合的抽象,而不定义或约束此集合的实现方式。 DOM中的NodeList对象是实时的。
答案 1 :(得分:1)
这取决于实施。例如,OpenJDK提供linked list implementation。
public Node item(int index) {
if (index < 0) {
return null;
}
Node child = getFirstChild();
while (child != null && index-- > 0) {
child = child.getNextSibling();
}
return child;
}
更准确地说,Node
是一个界面。与List
接口不同,它的文档不保证性能。上述实现是IIOMetadataNode
。这个类在其文档中再次没有提供性能保证,但源代码在上面并回答了问题。
有很多实现:
com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl
com.sun.org.apache.xml.internal.dtm.ref.DeepNodeListImpl
com.sun.org.apache.xml.internal.security.utils.HelperNodeList
// ...
这可能会提供其他性能保证。您应该尝试确定正在处理的NodeList
的实现类并检查其源代码。
答案 2 :(得分:1)
WC3标准规定了NodeList的基础数据结构,因此无论是数组还是链表(或两者)都将取决于DOM的实现。但是,NodeList接口只定义“getLength()”和“item(i)”,因此您编写的代码几乎是完成任务的唯一方法,无论性能如何。
答案 3 :(得分:0)
根据Java Doc(https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/NodeList.html)
nodeList是一个有序的节点集合,因此我假设它是一个排序列表。如果内存对我有用,ArrayList会使用常规数组背后的逻辑。我怀疑它是一个列表的原因主要是由于它的名称“nodeLIST”。
对于item(index),它将返回索引处的项目,否则将返回null。这又来自API。希望这有帮助,我还没有真正使用nodeLists。