从学Java开始, 就一直大脑记着  arrayList 底层是数组 ,查询快, 插入慢, 有移动的动作。linkedList 底层链表, 插入快 查询慢,今天写了例子跑了跑, 果然。

public class ListTest {
public static void main(String[] args)throws Exception {
Thread thread = new Thread(()->{
addArraylist(); });
Thread thread2 = new Thread(()->{
addLinkedList();
});
thread.start();
thread.join();
thread2.start();
thread2.join(); }
private static void addArraylist(){
ArrayList<String > arrayList = new ArrayList();
long begin2 = System.currentTimeMillis();
for(int j= 0 ;j<1000000;j++){
arrayList.add(j+"===");
}
System.out.println("arraylist花费了:"+(System.currentTimeMillis()-begin2)+"毫秒");
System.out.println(arrayList.size()); } private static void addLinkedList(){
LinkedList <String >linkedList = new LinkedList();
long begin = System.currentTimeMillis();
for( int i=0 ;i<1000000;i++){
linkedList.add(i+"===");
}
System.out.println("linkedList花费了:"+(System.currentTimeMillis()-begin)+"毫秒");
System.out.println(linkedList.size());
} }

=============输出结构是:

数据量比较少时 ,看的不明显, 当数据在100000以内 ,结果差不多, 大于100 万, 感觉到执行时间差距很大了。心里有个底。

==================================================================================

说下两种集合的用途:

数组, 开发中主要是为了查询快,这个用的最多, 比如从数据库分页查询 数据, 需要 遍历 。

链表 Linkedlist  用作 堆栈(比如虚拟机栈 , 大量的变量作用,指令操作, 基本都链表结构), 队列 比较多, 比如 线程池的 队列啊, 插入删除快。

====================================================================================

从 JVM堆内存分析  效率为啥差别这么大。

为啥数组插入慢,数组有个默认大小,比如16 ,数组在初始化的时候在 内存中会被分配一块连续的内存,第一个元素进来。问角标 0 ,你存东西了吗, 没有, 我就进去啦。后面的元素在插入的时候,要询问多次,【比如第一万个元素, 要询问9999次, 你这位置有人不?】 时间复杂度为O(n),数组的大小;

而  链表不是这样, 并不是一段连续的内存,第一个元素进来, 记下自己的 【value =“张三” ,PRE =null(元素的 hash值) ,NEXT = null】,

第二个元素进来, 拿到上一个元素的值,先把张三的 next 改成自己  ,【value =“张三” ,PRE =null(元素的 hash值) ,NEXT = 5654654654(“李四的地址值”)】

然后把自己加进去了,类似于【value=“李四,PRE=343434("张三”),next=null】。

插入的时间复杂度为O(1),就很快了。 不用移动指针, 就特别 爽。

ArrayList 和linkedList 插入比较的更多相关文章

  1. ArrayList和LinkedList插入删除效率的测试(完全不在一个数量级8/20)

    通过index获取元素的值 java里面的链表可以添加索引,而C中的链表,是没有索引的 package ArrayListVSLinkedList; import java.util.ArrayLis ...

  2. java集合框架05——ArrayList和LinkedList的区别

    前面已经学习完了List部分的源码,主要是ArrayList和LinkedList两部分内容,这一节主要总结下List部分的内容. List概括 先来回顾一下List在Collection中的的框架图 ...

  3. 浅谈Vector、ArrayList、LinkedList

    下图是Collection的类继承图 从图中可以看出:Vector.ArrayList.LinkedList这三者都实现了List 接口.所有使用方式也很相似,主要区别在于实现方式的不同,所以对不同的 ...

  4. 面试题——ArrayList和LinkedList的区别

    List概括 先回顾一下List在Collection的框架图: 从图中可以看出: List是一个接口,他继承Collection接口,代表有序的队列. AbstractList是一个抽象类, ,它继 ...

  5. ArrayList和LinkedList在中间开始插入的快慢比较

    首先创建带数据的两个List, 然后在中间插入数据, 观察完成时间 public class Hero { public static void main(String[] args){ listAn ...

  6. 深入理解java中的ArrayList和LinkedList

    杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0 ...

  7. Java数据结构之表的增删对比---ArrayList与LinkedList之一

    一.Java_Collections表的实现 与c不同Java已经实现并封装了现成的表数据结构,顺序表以及链表. 1.ArrayList是基于数组的实现,因此具有的特点是:1.有索引值方便查找,对于g ...

  8. C++模拟实现JDK中的ArrayList和LinkedList

    Java实现ArrayList和LinkedList的方式采用的是数组和链表.以下是用C++代码的模拟: 声明Collection接口: #ifndef COLLECTION_H_ #define C ...

  9. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

随机推荐

  1. Redis探索之路(四):Redis的五种数据类型Set和ZSet

    一:Set无需集合 Set是个集合,string类型的无需集合,通过hash table实现,添加删除查找复杂度都是0(1).对集合我们可以取并集,交集和差集.通过这些操作我们可以实现sns中的好友推 ...

  2. 为什么要使用动态链接库(DLL)

    为什么要使用动态链接库(DLL)   第一章 为什么要使用动态链接库(DLL) top 提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常运行和维 ...

  3. php上传(二)

    上传的主体页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  4. thinkphp PATH_INFO支持

    如果发生在本地测试正常,但是一旦部署到服务器环境后会发生只能访问首页的情况,很有可能是你的服务器或者空间不支持PATH_INFO所致. 系统内置提供了对PATH_INFO的兼容判断处理,但是不能确保在 ...

  5. 依赖背包变形——hdu4003

    思维性比较强,代码挺简单的,dp[u][j]表示在u子树下安排j个机器人,让其不回u 注意转移时的初始值 /* dp[u][j]为在子树u有j个机器人不回来 */ #include<bits/s ...

  6. csp-s模拟测试99

    csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...

  7. spring其他配置 (3)

    目录 一.自动装配 Autowired 二.bean的作用于singleton,prototype 三.引入外部资源properties文件 四.SpEL表达式 (可以为属性进行动态的赋值) 五.通过 ...

  8. (转)sqoop常用命令http://www.cnblogs.com/cenyuhai/p/3306037.html

    转于:http://www.cnblogs.com/cenyuhai/p/3306037.html 这个连接已经写的很详细了,我看了很受启发.

  9. Openstack-L 路由注入方式

    目录 目录 前言 从 Commands 到 Action 操作函数 前言 Openstack 新旧版本提供了不同的路由注入方式,也就是 Route Module 的代码方式不同,就二次开发而言用那一种 ...

  10. 把Debian 设置中文环境

    要支持区域设置,首先要安装locales软件包: apt-get install locales 然后配置locales软件包: dpkg-reconfigure locales 在界面中钩选上“zh ...