在Java中将字符串转换为ByteBuffer

3
我希望将ASCII字符串转换为ByteBuffer,并发现以下两种方法: ByteBuffer.wrap(str.getBytes(StandardCharsets.US_ASCII));StandardCharsets.US_ASCII.encode(str); 它们的区别是什么(也许在性能方面)?这些方法是否会产生相同的结果?
1个回答

3

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

该方法将此字符串使用平台默认的字符集编码为一系列字节,并将结果存储到一个新的字节数组中。

StandardCharsets.US_ASCII.encode 实际上使用的是ASCII编码。

然而, 如果您使用 str.getBytes(StandardCharsets.US_ASCII),那么它们在高层次上将会执行相同的操作。

经过快速查看它们各自的实现后, getBytesencode 的操作似乎有所不同。因此, 要找出哪一个在性能上更快,您需要进行基准测试。

编辑:

我写了一个 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 要快很多。

谢谢您指出这一点。我已经更新了原始帖子,以便更好地进行比较,因为我确实只对ASCII感兴趣。 - Gouz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接