重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1. LinkedList
成都创新互联公司从2013年成立,是专业互联网技术服务公司,拥有项目网站建设、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元下冶做网站,已为上家服务,为下冶各地企业和个人服务,联系电话:18980820575
2. ArrayList
那么这两者有什么异同呢
首先是代码测试:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import bean.Answer;
import bean.User;
/**
* 测试类
*
* @author hxz
*
*/
public class MyTestUtil {
public static void addTest(List list) {
System.out.println(list.getClass().getName() + "开始查询");
long start = System.currentTimeMillis();
System.out.println("开始时间:" + start);
list.add("需要查找的数据");
list.add("eeee");
list.add("aaee");
list.add("abbb");
for (int i = 0; i < 10000000; i++) {
for (int j = 0; j < list.size(); j++) {
list.get(j).contains("e");
System.out.print("");
}
}
long end = System.currentTimeMillis();
System.out.println("结束时间:" + end);
System.out.println("总耗时:" + (end - start));
}
public static void main(String[] args) {
List a = new ArrayList<>();
List b = new LinkedList<>();
addTest(a);
addTest(b);
}
}
???不是说ArrayList查询快于LinkedList么?
然后我们测试增加
???简直颠覆我的认知!
难道我学的都是错的吗?
事情的真相只有一个!
首先我们需要了解
linkedLIst是双向链表结构
元素之间的所有关系是通过引用关联的,就好比最近特别火的从袖子里撤出棒棒糖来的情景,想要撤出下一个就必须撤出上一个。它在查询的时候,只能一个一个的遍历查询,所以他的查询效率很低,如果我们想删除一节怎么办呢?就相当于自行车的链子,有一节坏了,我们是不是直接把坏的那节仍掉,然后让目标节的上一节指向目标节的下一节,但是
ArrayList是数组结构郑州好的妇科医院 http://www.zzkedayy.com/
就是有相同特性的一组数据的箱子,比如说我有一个能容下10个苹果的箱子,我现在只放了5个苹果,那么放第6个是不是直接放进去就行了?呢我要放11个呢?这个箱子是不是放不下了?所以我是不是需要换个大点的箱子?这就是**数组的扩容!**同样,我们一般放箱子里面的东西是不是按照顺序放的?假如说是按abcd的顺序放的,我突然想添加一个e,这个e要放到c的后面,你是不是需要把d先拿出来,再把e放进去,再把d放进去?假如说c后面有10000个呢?你是不是要把这10000个都拿出来,把e放进去,再放这10000个?效率是不是很低了?所以,理论上它的增删比较慢!但是前面也说了,我们箱子里面放东西,都是按照顺序放的,所以我知道其中一个"地址",是不是就知道所有元素的地址?所以它的查询在理论上比较快!
注意:只是在在list容量较大情况下,ArrayList查询数据要远优于LinkedList
总结
ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:
对ArrayList而言,主要是在内部数组中增加一项数据,指向所添加的元素,偶尔复杂度为O(n)可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,复杂度为O(1),分配一个内部对象。
在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
LinkedList不支持高效的随机元素访问。
只是在在list容量较大情况下,ArrayList查询数据要远优于LinkedList