Java NodeList是数组、列表还是其他什么?
我正在写一篇关于java性能的演讲,我试图确定这是否是一个糟糕的做法。我是C++的人,所以我还不知道java的一切。我没有该项目的源代码,我需要一个快速的答案 这对性能是否有害:Java NodeList是数组、列表还是其他什么?,java,performance,dom,Java,Performance,Dom,我正在写一篇关于java性能的演讲,我试图确定这是否是一个糟糕的做法。我是C++的人,所以我还不知道java的一切。我没有该项目的源代码,我需要一个快速的答案 这对性能是否有害: NodeList elems; // public abstract interface org.w3c.dom.NodeList for (int i = 0; i < elems.getLength(); i++) { elem = elems.item(i); if (elem.getNodeT
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可能会使用一个链表来实现,在这种情况下,itemi将是一场灾难
还有其他想法吗?节点列表是一个接口,如果不知道您正在/将要使用哪个实现,就不可能说出它是如何实现的
界面如下所示:
interface NodeList {
int getLength();
Node item(int index);
}
说:
NodeList接口提供节点有序集合的抽象,而不定义或约束如何实现该集合。DOM中的节点列表对象是活动的
这取决于实施情况。例如,OpenJDK提供了一个 这可能会产生其他性能保证。您应该尝试确定正在处理的节点列表的实现类,并检查其源代码。根据Java文档 节点列表是节点的有序集合,因此我假设它是一个排序列表。如果内存没问题,ArrayList会在引擎盖下使用规则数组背后的逻辑。我之所以怀疑它是一个列表,主要是因为它的名字是nodeLIST
至于itemindex,它要么返回索引处的项,要么返回null。这同样来自API。希望这对我有所帮助,我并没有太多使用节点列表 WC3标准规定了节点列表的底层数据结构,因此它是数组还是链表,或者两者都是,取决于DOM的实现。但是,NodeList接口只定义了getLength和itemi,因此无论性能如何,您编写的代码几乎是完成任务的唯一方法。此接口有几种实现方式。我不知道你在看哪一个。@Luiggmendoza它被展开了。@Luiggmendoza和我链接到了源文件。OP正在寻找公共接口org.w3c.dom。NodeList@LuiggiMendoza如何判断?使用初始化为ArrayList或LinkedList的列表。不要使用此库,因为它用于web服务。这似乎是一个糟糕的库。什么是好的?还不错。事实上,它是Java内部使用的,并不意味着程序员可以直接使用它。关于这个接口的使用,你想展示什么?我已经得到了一段在xml文件中遍历节点的代码。我不明白这是如何回答这个问题的。这更像是一个评论,里面有很多文字。我喜欢你的回答,这是唯一的方式。我还喜欢djechlins关于实际实现的细节。我希望我能接受这两个答案。
public Node item(int index) {
if (index < 0) {
return null;
}
Node child = getFirstChild();
while (child != null && index-- > 0) {
child = child.getNextSibling();
}
return child;
}
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
// ...