有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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)将是一场灾难

还有其他想法吗


共 (4) 个答案

  1. # 1 楼答案

    NodeList是一个接口,如果不知道您正在/将要使用哪个实现,就无法说明它是如何实现的

    界面如下所示:

    interface NodeList {
      int getLength();
      Node item(int index);
    }
    

    Docs说:

    The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.

  2. # 2 楼答案

    根据Java文档(https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/NodeList.html

    节点列表是节点的有序集合,因此我假设它是一个排序列表。如果内存没问题,ArrayList会在引擎盖下使用规则数组背后的逻辑。我之所以怀疑它是一个列表,主要是因为它的名字叫“节点列表”

    对于item(index),它要么返回索引处的项,要么返回null。这同样来自API。希望这对我有所帮助,我并没有太多使用节点列表

  3. # 3 楼答案

    WC3标准规定了节点列表的底层数据结构,因此它是数组还是链表(或两者)取决于DOM的实现。然而,NodeList接口只定义了“getLength()”和“item(i)”,因此您编写的代码几乎是完成任务的唯一方法,而不管性能如何

  4. # 4 楼答案

    这取决于实施情况。例如,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的实现类,并检查其源代码