List和ArrayList的性能比较

在使用ArrayList这样的非泛型集合的过程中,要进行装箱和拆箱操作,会有比较大的性能损失,而使用泛型集合就没有这样的问题。List是泛型,而ArrayList是非泛型。存数据岛ArrayList都需要专程object,读取又要转换成相应的数据类型,List则不需要。

//用来记录开始和结束的时间
 DateTime startTime = new DateTime();
 DateTime endTime = new DateTime();
//定义集合类型ArrayList的一个实例
 ArrayList list = new ArrayList();
//取得当前时间
 startTime = DateTime.Now;
//★★★★★★★★①使用ArrayList类★★★★★★★★
 //ArrayList的add方法的参数是Object型,
 //当我们把int型作为参数传入的时候需要做装箱操作
 //装箱操作将值类型转化为Object类型
 for (int i = 0; i < 1000000; i++)
 {
 list.Add(i);
 }
int iCount = 0;
 //当我们使用int型的时候需要做拆箱操作操作
 //拆箱操作将应用类型转化为Object类型,拆箱过程要做大量的工作
 foreach (int i in list)
 {
 iCount += 1;
 }
Console.WriteLine("使用ArrayList的结果 : {0}", iCount.ToString());
//取得结束时间并计算差值
 endTime = DateTime.Now;
 TimeSpan ts = endTime - startTime;
Console.WriteLine("使用ArrayList的耗时 :" + ts.TotalMilliseconds);
//★★★★★★★★②使用泛型类★★★★★★★★
 //使用List的泛型定义List<T>,int类型在编译器动态生成的类中本替换为int型
 //执行过程中不再执行装箱拆箱操作
 List<int> list2 = new List<int>();
startTime = DateTime.Now;
for (int i = 0; i < 1000000; i++)
 {
 list2.Add(i);
 }
iCount = 0;
 foreach (int i in list2)
 {
 iCount += 1;
 }
Console.WriteLine("使用泛型的结果 : {0}", iCount.ToString());
endTime = DateTime.Now;
 ts = endTime - startTime;
Console.WriteLine("使用泛型的耗时 :" + ts.TotalMilliseconds);
//显示三次结果如下
/* 第一次
 * 使用ArrayList的耗时 :92
 * 使用泛型的耗时 :25
 *
 * 第二次
 * 使用ArrayList的耗时 :96
 * 使用泛型的耗时 :22
 *
 * 第三次
 * 使用ArrayList的耗时 :90
 * 使用泛型的耗时 :22
 *
 * 由此可以明显看出两者的差别
 * 这里仅仅是时间上的,并不包括对内存消耗的统计
 *
 * ※但是也要注意到差别的单位是毫秒,
 * 我这里只想说明用泛型是有好处的,
 * 但也不可过分追求程序的孰优孰劣,
 * 总之要把握好这个度,适合自己的才是最好的
 * O(∩_∩)O~
 */
Console.Read();

ArrayList和LinkedList优缺点

java编程中我们用最多的几个类可以就是String,ArrayList,HashMap了.特别是ArrayList我们几乎无人不知,甚至有乱用的嫌疑了我们来看看ArrayList和LinkedList的区别.故名思意ArrayList是数组表,LinkedList是链接表.ArrayList的所有数据是在同一个地址上,而LinkedList的每个数据都拥有自己的地址.

我们来比较一下常用的数据的插入,数据的删除,数据的更新,数据查询.

数据插入 :比如在i节点插入一个新数据

ArrayList:循环到i节点,插入一个新数据,然后把i节点后面的所有的数据的index加1. ->操作多

LinkedList:循环到i节点,把前一个节点的后续链接到新数据,然后把新数据链接到后一个数据就可以了.  ->操作少

结论:平均效率LinkedList要好.

数据删除 :比如删除i节点数据

ArrayList:循环到i节点,然后把i节点后面的所有的数据的index减1. ->操作多

LinkedList:循环到i节点,把前一个节点的后续链接到i节点的后一个数据就可以了.  ->操作少

结论:平均效率LinkedList要好.

数据查询 :比如查询i节点数据

ArrayList:循环到i节点. ->操作少

LinkedList:循环到i节点.  ->操作少,但由于每个数据的地址不一样,查询比如 ArrayList慢.

结论:平均效率 ArrayList要好.

数据更新 :比如更新i节点数据

ArrayList:循环到i节点,把数据更新. ->操作少

LinkedList:循环到i节点,把前数据更新.  ->操作少,但由于查询速度没有 ArrayList好,所有效率没有 ArrayList好.

结论:平均效率ArrayList要好.

这样我们就可以看到各有优点.

如果查询操作较多ArrayList的效果更好.如果删除,插入较多LinkedList的效果较好.具体怎么用还看具体的需求.

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int , 数据 , arraylist , 效率 , 类型 时间 arraylist linkedlist、linkedarraylist、linkedlist、java linkedlist、linkedlist线程安全,以便于您获取更多的相关知识。

比较List和ArrayList的性能及ArrayList和LinkedList优缺点的更多相关文章

  1. paip.提升性能---list,arraylist,vector,linkedlist,map的选用..

    paip.提升性能---list,arraylist,vector,linkedlist,map的选用.. arraylist,vector基本一样,但是,vector线程安全的. 作者Attilax ...

  2. 关于for循环和Iterator遍历ArrayList的性能问题

    今日看到@DriveMan的一篇博客,题为<ArrayList集合实现RandomAccess接口有何作用?为何LinkedList集合却没实现这接口?>,文中提到对于实现了RandomA ...

  3. ArrayList(顺序表)和LinkedList(链表)的区别联系,优劣取舍问题

    ArrayList和LinkedList都是List接口的实现类.主要区别如下: 最主要的区别是底层的数据结构不同: 1)ArrayList相当于一个动态数组,需要随机访问列表中的元素时,ArrayL ...

  4. 为什么是List list = new ArrayList() 而不直接用ArrayList

    为什么是List list = new ArrayList(),而不直接用ArrayList? 编程是要面向对象编程,针对抽象(接口),而非具体.List 是接口,ArrayList是实现. 实现Li ...

  5. javase基础回顾(一)ArrayList深入解析 解读ArrayList源代码(JDK1.8.0_92)

    我们在学习这一块内容时需要注意的一个问题是 集合中存放的依然是对象的引用而不是对象本身. List接口扩展了Collection并声明存储一系列元素的类集的特性.使用一个基于零的下标,元素可以通过它们 ...

  6. 记录一下显示Map<String, ArrayList<String>>中的ArrayList里的数据的操作

    1.有以下数据: ArrayList<Employee> emp = new ArrayList<>(); emp.add(new Employee("zhang&q ...

  7. new ArrayList(0) 和 new ArrayList() 和一样吗?

    第一感觉是一样的,盲猜后者调用了前者,并传入参数 0.然而,无论是 JDK 7 还是 JDK 8,这两个方法构造的结果都是不一样的.JDK 开发人员在这方面作了优化. JDK 7 在 Java 7 中 ...

  8. 2.请介绍一下List和ArrayList的区别,ArrayList和HashSet区别

    第一问: List是接口,ArrayList实现了List接口. 第二问: ArrayList实现了List接口,HashSet实现了Set接口,List和Set都是继承Collection接口. A ...

  9. ArrayList深度分析:ArrayList和数组间的相互转换

    一.ArrayList转换为数组ArrayList提供public <T> T[] toArray(T[] a)方法返回一个按照正确的顺序包含此列表中所有元素的数组,返回数组的运行时类型就 ...

随机推荐

  1. 基于Gitlab统计代码行--统计所有仓库、所有提交人的代码总行数(新增加-删除)

    公司绩效考核要求,统计GITLAB仓库所有人提示有效代码行业 脚本1: 统计所有仓库.所有提交人的代码总行数(新增加-删除) 脚本2: 统计所有仓库.所有提交人的代码提交汇总与删除汇总 脚本3: 统计 ...

  2. python note 04 list的应用及元组

    1,昨日内容 ascii:字母,数字,特殊字符:1个字节,8位 Unicode:16位 两个字节 升级 32 位 四个字节 utf-8:最少一个字节 8位表示. 英文字母 8位 1个字节 欧洲16位, ...

  3. Java17-java语法基础——泛型

    Java18-java语法基础——泛型 一.泛型概念和作用 1.泛型概念: 泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说,所操作的数据类型被指定为一个参数.这种参数类型可以用在类 ...

  4. 微软Office Online服务安装部署(一)

    1.要使用office online功能,首先需要的是2台主机,并且主机的系统要求是windwos Server 我把他命名为Server和Client(两台服务器 用户必须为administrato ...

  5. 46-web页面登入前和登入后控制

    可以将user存入session中,然后在前端根据能否取到user,来判断是否登入 <c:if test="${user == null }"> <li clas ...

  6. 20175234 《Java程序设计》第二周学习总结(二)

    学习内容总结 运算符与表达式 If语句.switch语句 break和continue语句 数组和for语句 IDEA的安装和调试 教材学习中的问题和解决过程 在第一次使用IDEA中出现了一些情况,在 ...

  7. php进程(线程)通信基础--System V共享内存

    PHP默认情况没有开启功能,要支持该功能在编译PHP的时候要加入下面几个选项  System V消息,--enable-sysvmsg   System V信号量支持,--enable-sysvsem ...

  8. Android抓取log日志过滤

    前提:Android SDK已安装并配置环境变量 1.手机USB调试模式打开,连接PC 2.cmd窗口,执行adb logcat >log.log   // 输出日志到一个log文件 或者执行a ...

  9. CSS学习总结4:派生选择器学习总结

    派生选择器:通过依据元素在其位置的上下文关系来定义样式,你可以使标记更加简洁.派生选择器中一共分为三种:后代选择器.子元素选择器.相邻兄弟选择器. 1.初识派生选择器 实例:你希望列表中的 stron ...

  10. I/O dempo

    标准读取写入 package io_stream; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; i ...