我想将ASCII字符串转换为ByteBuffer,然后遇到了以下两种方法:ByteBuffer.wrap(str.getBytes(StandardCharsets.US_ASCII));StandardCharsets.US_ASCII.encode(str);它们有什么区别(也许在性能方面)?
这些会产生相同的结果吗?

最佳答案

getBytes 使用平台默认的字符集,不一定是ASCII。

使用平台的默认字符集将此String编码为字节序列,并将结果存储到新的字节数组中。
StandardCharsets.US_ASCII.encode实际上使用ASCII。
但是,如果使用str.getBytes(StandardCharsets.US_ASCII),那么它们将在较高级别上做同样的事情。
快速浏览它们的实现后,getBytes似乎与encode做了非常不同的事情,因此要找出哪种性能更快,您必须进行基准测试。
编辑:
我写了一个JMH基准测试:

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 10)
@Fork(value = 1)
public class Main {

    static final String s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";

    public static void main (String args[]) throws IOException, RunnerException {
        org.openjdk.jmh.Main.main(args);
    }

    @Benchmark
    public void wrap(Blackhole bh) {

        bh.consume(ByteBuffer.wrap(s.getBytes(StandardCharsets.US_ASCII)));
    }

    @Benchmark
    public void encode(Blackhole bh) {
        bh.consume(StandardCharsets.US_ASCII.encode(s));
    }
}
结果如下:
Benchmark    Mode  Cnt     Score    Error  Units
Main.encode  avgt   20  2407.242 ± 28.147  ns/op
Main.wrap    avgt   20   199.227 ±  4.093  ns/op
因此,wrap快很多。

10-06 03:19