相关疑难解决方法(0)

不可变与不可修改的集合

集合框架概述:

不支持修改操作(例如add,removeclear)的集合称为不可修改.不可修改的集合是可修改的.

另外保证Collection对象中没有可见变化的集合称为不可变.不可变的集合是可变的.

我无法理解这种区别.这里不可修改不可变
的区别是什么?

java collections immutability

156
推荐指数
5
解决办法
7万
查看次数

Stream.toList() 会比 Collectors.toList() 表现得更好吗

JDK 正在引入一个Stream.toList()带有JDK-8180352的 API 。这是一个基准代码,我试图将其性能与现有的进行比较Collectors.toList

@BenchmarkMode(Mode.All)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 20, time = 1, batchSize = 10000)
@Measurement(iterations = 20, time = 1, batchSize = 10000)
public class CollectorsVsStreamToList {

    @Benchmark
    public List<Integer> viaCollectors() {
        return IntStream.range(1, 1000).boxed().collect(Collectors.toList());
    }

    @Benchmark
    public List<Integer> viaStream() {
        return IntStream.range(1, 1000).boxed().toList();
    }
}
Run Code Online (Sandbox Code Playgroud)

结果总结如下:

Benchmark                                                       Mode  Cnt   Score    Error  Units
CollectorsVsStreamToList.viaCollectors                         thrpt   20  17.321 ±  0.583  ops/s
CollectorsVsStreamToList.viaStream                             thrpt   20  23.879 ±  1.682  ops/s
CollectorsVsStreamToList.viaCollectors                          avgt   20   0.057 ± …
Run Code Online (Sandbox Code Playgroud)

java performance java-stream jmh java-16

12
推荐指数
1
解决办法
749
查看次数

是否有充分的理由将 OpenJDK 代码中的以下 ArrayList 构造函数分为两种不同的情况?

例如,在 JDK17 中阅读 ArrayList 类的 OpenJDK 代码时

https://github.com/openjdk/jdk17/blob/master/src/java.base/share/classes/java/util/ArrayList.java

我偶然发现了以下构造函数:

public ArrayList(Collection<? extends E> c) {
    Object[] a = c.toArray();
    if ((size = a.length) != 0) {
        if (c.getClass() == ArrayList.class) {
            elementData = a;
        } else {
            elementData = Arrays.copyOf(a, size, Object[].class);
        }
    } else {
        // replace with empty array.
        elementData = EMPTY_ELEMENTDATA;
    }
}
Run Code Online (Sandbox Code Playgroud)

c.getClass()区分是或不是的原因是什么ArrayList.class?这个案子有必要分拆吗?

(我只是想理解 OpenJDK 类 ArrayList 发行版中的 Java 代码。)

java reflection constructor arraylist java-17

12
推荐指数
2
解决办法
290
查看次数

为什么 Stream#toList 的默认实现看起来过于复杂/次优?

查看 的实现Stream#toList,我只是注意到它看起来是多么复杂和次优。

就像上面的 javadoc 中提到的那样default,大多数实现都没有使用这个实现Stream,但是,在我看来,它本来可以是其他的。

来源

/**
 * Accumulates the elements of this stream into a {@code List}. The elements in
 * the list will be in this stream's encounter order, if one exists. The returned List
 * is unmodifiable; calls to any mutator method will always cause
 * {@code UnsupportedOperationException} to be thrown. There are no
 * guarantees on the implementation type or serializability of the returned List.
 *
 * <p>The returned instance …
Run Code Online (Sandbox Code Playgroud)

java java-stream java-16

6
推荐指数
1
解决办法
189
查看次数