有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将double[]转换为不可变列表的成本更低的方法

我想将数组double[]转换为不可变的集合,以便在值对象中使用。然而,我处理的是一个非常大的数组,我不断得到错误java.lang.OutOfMemoryError: Java heap space

我目前正在使用

Collections.unmodifiableList(DoubleStream.of(myArray).boxed().collect(Collectors.toList()));

我想正是因为这个原因,我的程序内存不足。有没有更便宜的方法将double[]转换为不可变列表


共 (1) 个答案

  1. # 1 楼答案

    流对于函数式编程和可读性非常好,但当性能是主要考虑因素时,应该避免流。它们会创建不必要的额外对象

    同样令人惊讶的是,双基元类型的数组比它们的包装类双数组(ref:https://www.baeldung.com/java-primitives-vs-objects)消耗更多内存

    使用Double对象数组而不是双原语,然后运行:

    Collection<Double> l = Collections.unmodifiableCollection(Arrays.asList(myArray));
    

    我比较了这两种方法

        public static void main(String[] args) {
            int len = 1000000;
            Double[] myArray = new Double[len];
            for (int i = 0; i < len; i++) {
                myArray[i] = Math.random();
            }
            Collection<Double> l = Collections.unmodifiableCollection(Arrays.asList(myArray));
            long totalMem = Runtime.getRuntime().totalMemory();
            long usedMem =  totalMem - Runtime.getRuntime().freeMemory();
            System.out.println("totalMem="+humanReadableByteCountBin(totalMem));
            System.out.println("usedMem=" + humanReadableByteCountBin(usedMem));
            System.out.println("l has " + l.size() + " items ");
        }
    

    stream方法使用48Mb,而Double方法使用28Mb