zoukankan      html  css  js  c++  java
  • ArrayList 和linkedList 插入比较

    从学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),就很快了。 不用移动指针, 就特别 爽。

  • 相关阅读:
    SQL语句的执行顺序
    凭兴趣求职80%会失败,为什么
    Google Analytics:为链接点击设定事件追踪的方法
    org/hamcrest/SelfDescribing
    Idea使用记录--添加Problems&&解决Autowired报错could not autowire
    RBAC(Role-Based Access Control)基于角色的访问控制
    如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?
    记录使用Hibernate查询bean中字段和数据库列类型不匹配问题
    Java添加自定义注解
    JS获取select的值
  • 原文地址:https://www.cnblogs.com/zgghb/p/9588493.html
Copyright © 2011-2022 走看看