首页 >> 民生新闻

Java列表对象的性能分析和测试2节能

民生新闻  2020-10-11 13:25 字号: 大 中 小

二、LinkedList的实现

LinkedList通过一个双向链接的节点列表实现。要通过索引访问元素,你必须查找所有节点,直至找到目标节点:

public Object get(intindex) {

// 首先检查index是否合法...此处不显示这部分代码

Entry e = header; // 开始节点

// 向前或者向后查找,具体由哪一个方向距离较

// 近决定

if (index size/2) {

for (int i = 0; i = index; i++)

e = xt;

} else {

for (int i = size; i index; i--)

e = evious;

}

return e;

}

把元素插入列表很简单:找到指定索引的节点,然后紧靠该节点之前插入一个新节点:

public void add(int index, Object element) {

// 首先检查index是否合法...此处不显示这部分代码

Entry e = header; // starting node

// 向前或者向后查找,具体由哪一个方向距离较

// 近决定

if (index size/2) {

for (int i = 0; i = index; i++)

e = xt;

} else {

for (int i = size; i index; i--)

e = evious;

}

Entry newEntry = new Entry(element, e, evious);

xt = newEntry;

evious = newEntry;

size++;

}

线程安全的LinkedList和其他集合

如果要从Java SDK得到一个线程安全的LinkedList,你可以利用一个同步封装器从nchronizedList(List)得到一个。然而,使用同步封装器相当于加入了一个间接层,它会带来昂贵的性能代价。当封装器把调用传递给被封装的方法时,每一个方法都需要增加一次额外的方法调用,经过同步封装器封装的方法会比未经封装的方法慢二到三倍。对于象搜索之类的复杂操作,这种间接调用所带来的开销不是很突出;但对于比较简单的方法,比如访问功能或者更新功能,这种开销可能对性能造成严重的影响。

这意味着第一个30%,和Vector相比,经过同步封装的LinkedList在性能上处于显著的劣势,因为Vector不需要为了线程安全而进行任何额外的间接调用。如果你想要有一个线程安全的LinkedList,你可以复制LinkedList类并让几个必要的方法同步,这样你可以得到一个速度更快的实现。对于所有其它集合类,这一点都同样有效:只有List和Map具有高效的线程安全实现(分别是Vector和Hashtable类)。有趣的是,这“将以此次用户体验之旅为契机两个高效的线程安全类的存在只是为了向后兼容,而不是出于性能上的考虑。

对于通过索引访问和更新元素,LinkedList实现的性能开销略大一点,因为访问任意一个索引都要求跨越多个节点。插入元素时除了有跨越多个节点的性能开销之外,还要有另外一个开销,即创建节点对象的开销。在优势方面,LinkedList实现的插入和删除操作没有其他开销,因此,插入-删除开销几乎完全依赖于插入-删除点离集合末尾的远近。

肝硬化的突出表现
白城哪里的白癜风医院专业
莱芜治疗白癜风医院在哪
推荐资讯