我看到了四种替代方法,用于将char
转换为Java中的Stirng
。Java中最快的字符串转换
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文档没有这样说。选项四也是如此。实例的重用将非常幸运,因为然后基于散列的查找可以利用String
中的hashCode()
高速缓存。 (哪些功能在API文档中也没有描述,但很多人告诉我)。
我来自C++,我觉得缺乏复杂性信息令人不安。 :-)我的猜测是否正确?我们是否有任何形式的官方文档,在其中声明了性能保证和缓存机制?
“第二个非常方便” - 不是如果你想读代码,国际海事组织。该代码使用字符串连接和一个空字符串,这两者都不是你真正想实现的一部分。 'String.valueOf'一路,海事组织 - 并且你*测量了*这些中的任何一个?你知道吗,这实际上是代码中的瓶颈?你有没有尝试确定'String.valueof' *是否缓存这些值? (很容易分辨......)假设'binaryData'是一个'byte []',你可以很容易地用256个字符串构建你自己的'String []',以绝对保证缓存...... – 2015-03-25 10:28:40
3和4同样的..暗含地调用3 :)。我们还没有一个String构造函数,它只接受一个字符(case-1?) – TheLostMind 2015-03-25 10:30:58
版本2将由编译器翻译为:创建一个StringBuilder对象,然后将char添加到该对象,最后toString()将被调用。所以这相当昂贵。对于v3或v4的成本...你可以看看源代码,看看会发生什么。 – GhostCat 2015-03-25 10:32:12