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