Java中最快的char到字符串转换

时间:2015-03-25 10:25:17

标签: java performance

我在Java中看到了将char转换为Stirng的四种方法。

v = Something.lookup(new String((char)binaryData[idx])); // SORRY! Wrong.
v = Something.lookup("" + (char)binaryData[idx]);
v = Something.lookup(String.valueOf((char)binaryData[idx]));
v = Something.lookup(Character.toString((char)binaryData[idx])));

我认为第一个是最慢的。第二个很方便。我推测第三个可以返回先前创建的String实例,但我不确定,API文档没有这么说。这同样适用于备选方案四。这种重用实例非常幸运,因为基于哈希的查找可以利用hashCode()中的String缓存。 (API文档中也没有描述哪个功能,但很多人告诉我。)

我来自C ++,我觉得缺乏复杂的信息令人不安。 :-)我的推测是否正确?我们是否有任何形式的性能保证和缓存机制的官方文档?

4 个答案:

答案 0 :(得分:8)

首先,Java规范没有说明有关这四种方法的性能,因此结果可能会因您使用的JRE版本和供应商而异。

如果您使用Oracle的JRE,您可以自己轻松检查源代码!在Java 8中,它如下:

给定char c有一些值:

  • new String(c)无法编译。没有这样的构造函数。
  • "" + c看起来很丑陋,笨重而且很棘手。在内部,它会创建一个新的空StringBuilder并将角色附加到它上面。然后,它会从String
  • 中创建一个新的StringBuilder实例
  • Character.toString(c)代表String.valueOf(c)
  • String.valueOf(c)创建一个新的String实例。

那么使用哪一个?

最易读!

我的观点是String.valueOf(c)Character.toString(c)

答案 1 :(得分:2)

第二个肯定(理论上)慢,因为它被翻译成

v = Something.lookup(new StringBuilder().append("").append((char)binaryData[idx]).toString());

StringBuilder是使用char[]初始化来保存16个值来实现的。因此,StringBuilder选项初始化大小为16的char[],仅将设置的单元格(在本例中仅为第一个)复制到结果字符串。

String.valueOf(相当于Character.toString)使用大小为1的char[],然后直接设置String的支持{{1} },从而避免了复制的需要。

第一种方法不会编译(至少不在java 7下),因为没有char[]构造函数接受单个字符作为输入:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html

答案 2 :(得分:1)

第一个解决方案无法编译。 第二个解决方案在内部创建一个String,调用类似于Character.valueOf(char)的代码。 第三种解决方案优于第四种解决方案,因为Character.toString(char ch)的内部实施是对String.valueOf

的调用
public static String toString(char c) {
    return String.valueOf(c);
}

第三个String.valueOf(char ch)的内部实施是

public static String valueOf(char c) {
    char data[] = {c};
    return new String(0, 1, data);
}

答案 3 :(得分:1)

  

我来自C ++,我觉得缺乏复杂的信息令人不安。 :-)我的推测是否正确?我们是否有任何形式的性能保证和缓存机制的官方文档?

回答这部分问题:一般来说,没有。您可以找到有关内置集合的渐近性能的信息,也可能是其他几个方面的信息,但总的来说,这些问题留给了VM的实现。自由裁量权。您当然可以始终查看源代码,但请记住,有些事情会影响您无法直接控制的性能:JIT编译和垃圾回收是最大的。

你是否会对此感到不安?我不这么认为,Java的前提是低级别性能很少是应用程序开发人员需要关注自己或自己的问题。这是一种权衡,你可以争论它是否是一个很好的权衡,但事实就是如此。

但是当你达到可以开发真正高性能系统的程度时,你将会在整个过程中获得所有必要的信息。