zoukankan      html  css  js  c++  java
  • 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);
        }
    }
  • 相关阅读:
    UVA 562 Dividing coins --01背包的变形
    HDU 2602 Bone Collector --01背包
    Topcoder SRM 618 Div2 --900
    【转】Python 列表排序
    线段树之区间最大连续和问题
    【转】Python中string的strip,lstrip,rstrip用法
    《Python核心编程》部分代码习题实践(持续更新)
    《Python核心编程》部分错误纠正(勘误表)(持续更新)
    UVA 103 Stacking Boxes --LIS
    POJ 1836 Alignment --LIS&LDS
  • 原文地址:https://www.cnblogs.com/stono/p/8520284.html
Copyright © 2011-2022 走看看