在 Java 中将字符串转换为 ByteBuffer

Posted

技术标签:

【中文标题】在 Java 中将字符串转换为 ByteBuffer【英文标题】:Converting a String to ByteBuffer in Java 【发布时间】:2020-07-18 10:20:02 【问题描述】:

我想将 ASCII 字符串转换为 ByteBuffer,我遇到了这两种方法:

ByteBuffer.wrap(str.getBytes(StandardCharsets.US_ASCII));

StandardCharsets.US_ASCII.encode(str);

它们有什么区别(也许在性能方面也是如此)? 这些会产生相同的结果吗?

【问题讨论】:

【参考方案1】:

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

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

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 要快很多。

【讨论】:

感谢您指出这一点。我更新了原始帖子以使这些更具可比性,因为我确实只对 ASCII 感兴趣。

以上是关于在 Java 中将字符串转换为 ByteBuffer的主要内容,如果未能解决你的问题,请参考以下文章

在Java中将字符串转换为“字符”数组

如何在java中将当前日期转换为字符串?

在java中将国际字符串转换为\u代码

如何在Java中将String转换为long?

在Java中将字符串转换为文件

在java中将字符串转换为Json [重复]