• list.ensureCapacity竟然会变慢


    list.ensureCapacity竟然会变慢

    jdk1.8

    应该是做了优化了;

    public class Test10 {
    
        public static void main(String[] args) {
    
            ArrayList<Integer> list = new ArrayList<>();
            long beginTime = System.currentTimeMillis();
            for (int i = 0; i < Integer.MAX_VALUE / 300; i++) {
                list.add(i);
            }
            long endTime = System.currentTimeMillis();
            CusPrint.print(endTime - beginTime); // 344
        }
    
    }
    
    public class Test11 {
    
        public static void main(String[] args) {
    
            ArrayList<Integer> list = new ArrayList<>();
    //        ArrayList<Integer> list = new ArrayList<>(Integer.MAX_VALUE/300); // 这样也挺慢的
            CusPrint.print("---");
            list.ensureCapacity(Integer.MAX_VALUE/300); // 这样竟然比不加这句要慢
            CusPrint.print("---");
            long beginTime = System.currentTimeMillis();
            for (int i = 0; i < Integer.MAX_VALUE / 300; i++) {
                list.add(i);
            }
            long endTime = System.currentTimeMillis();
            CusPrint.print(endTime - beginTime);  // 3391
        }
    
    }

     测了一下还是数组快:

            beginTime2 = System.currentTimeMillis();
            int [] arr1 = new int[Integer.MAX_VALUE/300];
            for(int i=0;i<Integer.MAX_VALUE/300;i++) {
                arr1[i] = i;
            }
            endTime2 = System.currentTimeMillis();
            CusPrint.print(endTime2 - beginTime2); // 59

     放到一起,修改一下list的最大容量,数组就是快,使用了ensureCapacity就是慢;

    public class Test11_2 {
    
        public static void main(String[] args) {
    
            ArrayList<Integer> list = new ArrayList<>();
            CusPrint.print("---");
            int capacity = Integer.MAX_VALUE/30;
            list.ensureCapacity(capacity); // 这样竟然比不加这句要慢
            CusPrint.print("---");
            long beginTime = System.currentTimeMillis();
            for (int i = 0; i < capacity; i++) {
                list.add(i);
            }
            long endTime = System.currentTimeMillis();
            CusPrint.print(endTime - beginTime);  // 26524
            CusPrint.print("---------------");
            ArrayList<Integer> list2 = new ArrayList<>();
            long beginTime2 = System.currentTimeMillis();
            for (int i = 0; i < capacity; i++) {
                list2.add(i);
            }
            long endTime2 = System.currentTimeMillis();
            CusPrint.print(endTime2 - beginTime2); // 20126
            CusPrint.print("---------------");
            for(int i=0;i<capacity;i++) {
                if(i<capacity) {
                    
                }
            }
            CusPrint.print("---------------");
            for(int i=0;i<capacity;i++) {
                if(i<i+1) {
                    
                }
            }
            CusPrint.print("---------------");
            beginTime2 = System.currentTimeMillis();
            int [] arr1 = new int[capacity];
            for(int i=0;i<capacity;i++) {
                arr1[i] = i;
            }
            endTime2 = System.currentTimeMillis();
            CusPrint.print(endTime2 - beginTime2); // 47
            CusPrint.print("---------------");
            
        }
    
    }

     改到Integer.MAX_VALUE/3;直接就OOM了;

    list.ensureCapacity(capacity);  // 就是这句就可以OOM

    异常:

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    	at java.util.Arrays.copyOf(Arrays.java:3210)
    	at java.util.Arrays.copyOf(Arrays.java:3181)
    	at java.util.ArrayList.grow(ArrayList.java:265)
    	at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
    	at java.util.ArrayList.ensureCapacity(ArrayList.java:219)
    	at com.stono.thread3.page_arraylist.Test11_2.main(Test11_2.java:14)

    你在凝望深渊的时候,深渊也在凝望你,别看太久。

     哈哈,再看会儿:

    使用list.trimToSize();竟然可以变快;

    public class Test30 {
    
        public static void main(String[] args) {
    
            ArrayList list = new ArrayList();
            list.ensureCapacity(Integer.MAX_VALUE / 300);
            list.trimToSize();
            long beginTime = System.currentTimeMillis();
            for (int i = 0; i < Integer.MAX_VALUE / 300; i++) {
                list.add(i);
            }
            long endTime = System.currentTimeMillis();
            System.out.println(endTime - beginTime);
        }
    }
  • 相关阅读:
    php生成excel
    gearmand
    开启Nginx的目录文件列表功能
    zend框架学习
    引用方法形成树
    智能指针实现
    图文例解C++类的多重继承与虚拟继承
    CC++定位崩溃代码行的方法
    C++函数重定义、重载、重写
    勤奋吧,一天一点,努力提高基本技能。
  • 原文地址:https://www.cnblogs.com/stono/p/8520284.html
Copyright © 2020-2023  润新知