java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
2023-09-27 14:26:54 时间
一、list简介
List列表类,顺序存储任何对象(顺序不变),可重复。
List是继承于Collection的接口,不能实例化。实例化可以用:
ArrayList(实现动态数组),查询快(随意访问或顺序访问),增删慢。整体清空快,线程不同步(非线程安全)。数组长度是可变的百分之五十延长
LinkedList(实现链表),查询慢,增删快。
Vector(实现动态数组),都慢,被ArrayList替代。长度任意延长。线程安全(同步的类,函数都是synchronized)
Stack(实现堆栈)继承于Vector,先进后出。
所以,快速访问ArrayList,快速增删LinkedList,单线程都可以用,多线程只能用同步类Vector
list基本操作
插入:add()
查找:get()
删除:remove(int index)
修改:set()
清空表:clear()
遍历:用Iterator迭代器遍历每个元素,如
List al = new ArrayList();
Iterator it = al.iterator()
while (it.hasNext())
{
System.out.println(it.next().toString());
}
此外,其他函数
boolean add(int index, E element)
boolean addAll(index,Collection)
二、ArrayList和LinkedList的效率比较
2.1 原理
顺序存储是将数据元素存放于一个连续的存储空间中,实现顺序存取或(按下标)直接存取。存储效率高,速度快。但空间大小一经定义,在程序整个运行期间不会发生改变,因此,不易扩充。同时,由于在插入或删除时,为保持原有次序(没有规定元素进栈顺序),平均需要移动一半(或近一半)元素,修改效率不高。
链接存储表示的存储空间一般在程序的运行过程中动态分配和释放,且只要存储器中还有空间,就不会产生存储溢出的问题。同时在插入和删除时不需要保持数据元素原来的物理顺序,只需要保持原来的逻辑顺序,因此不必移动数据,只需修改它们的链接指针,修改效率较高。但存取表中的数据元素时,只能循链顺序访问,因此存取效率不高。
2.2 代码测试
package test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List<String> LList = new LinkedList<String> ();
List<String> AList = new ArrayList<String> ();
long startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++)
{
LList.add(""+i);
}
long endTime = System.currentTimeMillis();
long result = endTime - startTime;
System.out.println("linkedlist:"+result);
startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++)
{
AList.add(""+i);
}
endTime = System.currentTimeMillis();
result = endTime - startTime;
System.out.println("arraylist:"+result);
}
结果发现速度上ArrayList 比LinkedList要快的多
这里用来获取时间戳(毫秒)来计算时间的方式用三种,
//方法一 速度最快
System.currentTimeMillis();
//方法二 比方法一慢,低于一倍的时间
new Date().getTime();
//方法三 速度最慢,Canlendar处理时区耗时
Calendar.getInstance().getTimeInMillis();
另外,文章http://blog.csdn.net/inkfish/article/details/5185320中
提到了更多的list,以及性能比较,可以参看
结论:
1.随机插入、随机删除操作中,用TreeList 效率最高;
2.在只需要追加、迭代的环境下,LinkedList 效率最高;
3.平均效率来讲,ArrayList 相对平衡,但如果海量随机操作,还是会造成性能瓶颈;
4.CopyOnWriteArrayList 因为线程安全的原因,致使性能降低很多,所以慎用;
5.Vector 没有传说中那么低的效率;
6.让Stack 来做List 的事可以,不过语义上Stack 不应该做过多的List 的事情;
7.在排序中,ArrayList 具有最好的性能,TreeList 平均性能也不错,LinkedList 的排序效率受元素初始状态的影响很大。
8.各种List 间转换几乎没有时间损耗。
相关文章
- Java框架-MyBatis三剑客之MyBatis Generator(mybatis-generator MBG插件)详解
- JAVA学习实战(十一)@Transactional注解的失效场景
- 10分钟带你徒手做个Java线程池
- java中string数组转换为list列表的方法
- Java 把 Map 的值(Value)转换为 Array, List 或 Set
- Java 如何删除 List 中的重复元素
- java.io.IOException: Timed out waiting 20000ms for a quorum of nodes to respond
- Java开发知识之Java中的集合上List接口以及子类讲解.
- java jsonString与Map之间转换
- Java删除List和Set集合中元素
- java中给集合快速取值最大值和最小值
- java list分组 list里面分装的都是对象 按照对象的属性来分组
- 用 Java 写一个抽奖功能,太秀了~
- Java 中初始化 List 集合的 6 种方式!
- Java 中的 String 真的是不可变吗?
- spring redis java.lang.IllegalStateException: Cannot load configuration class: redis.RedisTemplet报错
- Java Socket编程----通信是这样炼成的
- java.util.List 的大小
- 问题:Cannot deserialize value of type `java.util.Date` from String "2020-06-16"
- JSONArray数据转换成java List
- 百度校园招聘历年经典面试题汇总:Java开发岗
- Java 做项目能用到 List 的场景,这篇总结全了
- 【Java面试题】List如何一边遍历,一边删除?
- Java中List和ArrayList的区别
- java分布式通信系统(J2EE分布式服务器架构)
- Java Properties配置文件读取到Map<String, List<String>>的方法(lambda)
- java中的ArrayList 、List、LinkedList、Collection关系详解
- Java标准输入输出流(in/out)