NodeList是数组还是列表还是其他什么?

时间:2015-07-15 19:37:39

标签: java performance dom

我正在撰写关于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)将是一场灾难。

还有其他想法吗?

4 个答案:

答案 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。