当前位置: 首页 > 知识库问答 >
问题:

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

云霖
2023-03-14

在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])));

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

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

共有3个答案

鲍向笛
2023-03-14

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

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

第三个< code > string . value of(char ch)的内部实现是

public static String valueOf(char c) {
    char data[] = {c};
    return new String(0, 1, data);
}
翟新
2023-03-14

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

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

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

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

第一种方法不能编译(至少在java 7下不能),因为没有接受单个字符作为输入的< code>String构造函数:http://docs . Oracle . com/javase/7/docs/API/Java/lang/String . html

陆烨磊
2023-03-14

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

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

给定一个char c的值:

  • new String(c)无法编译。没有这样的构造函数。
  • "c看起来丑陋、笨重且棘手。在内部,它创建了一个新的空StringBuilder并将字符附加到其中。然后它从StringBuilder创建了一个新的String实例。
  • Character.toString(c)委托给String.valueOf(c)
  • String.valueOf(c)创建一个新的String实例。

那么使用哪一个呢?

最具可读性!

那在我看来就是< code>String.valueOf(c)或者< code > character . tostring(c)!

 类似资料:
  • 问题内容: 在Java中,迭代字符串中所有字符的最快方法是: 或这个: 编辑: 我想知道的是,在长时间的迭代过程中重复调用该方法的开销是否小于或大于在开始时执行一次单次调用然后在迭代过程中直接访问数组的开销。 如果有人能够针对不同的字符串长度提供可靠的基准测试,那将是非常不错的,同时考虑到JIT的预热时间,JVM的启动时间等,而不仅仅是两个调用之间的区别。 问题答案: 在我的AMDx64 8cor

  • 我有以下JSON字符串: 我只想要和。我试过这样的方法: 但我得到了以下错误: 我只使用过几次JSON。有人能帮我吗? 对我来说最好的例子是这样的,我在另一个例子中做过: 可能吗? 现在我已经做到了: 我试着这样做: 然后: 但现在当我做一个Prtinout时,我会得到和以前一样的错误:

  • 我遇到了这样一个java字符串,其中以下内容是错误的: 我想这是因为字符串构造函数默认将主体字节[]的编码视为UTF-8,我不是100%确定。我如何能够将此字符串存储在字节[]中,并能够稍后将其转换回来?我想我需要能够确定字节[]的编码方式。我该怎么做呢? 一些上下文:我需要字节[],以便压缩数据,将其存储在数据库中,然后解压缩并将未压缩的字节[]转换回原始字符串。这个字符串最初来自某个下载了网页

  • 我被一些有趣的任务困住了。我有3个字符串(hello,heavy&word)。需要计算每一个世界的总和并打印最大的世界和总和。用于计算-a=1,z=26。所以hello=50,heavy=61&word=60。最大的字符串是“Heavy”,我需要像“Heavy,61”那样打印出来。我找到了从一个字符串计算字符的代码:

  • 问题内容: 我们给了一个字符串,例如,取“ TUOPPPPJHHTT”。我们希望找出哪个字符在字符串中连续出现次数最多以及发生多少次。在这种情况下,其P发生4次。 我尝试如下运行for循环 但是用这种方法,问题是它将计算所有字母的重复出现。 问题答案: 每次找到与上一个字符不同的字符,则表示运行(连续重复的字母)结束,因此您应记下当前运行的长度(即的值),然后重置计数。最后,您可以打印最大值。

  • Golang具有strconv库,可以将字符串转换为int64和uint64。 但是,其余的整数数据类型似乎不受支持,因为我找不到byte、int16、uint16、int32、uint32数据类型的转换函数。 始终可以将字节、16位和32位数据类型转换为int64和uint64,而不会损失精度。这就是语言的意图吗?