这是在Java中将char转换为String的正确方法吗?


19

在编写单元测试以返回boolean一个需要2 Strings 的函数时,我需要依次测试作为参数之一的字母('a'- 'z')的每个字符,所以我这样做是为了做到这一点:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, new String(c));
} 

我本以为这是允许的,但事实并非如此,所以我只是这样做了:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
} 

这是在Java中将chara 转换为a的可靠方法String吗?是首选方式吗?我对Java并不了解很多,所以想对此进行一些说明。


2
并非直接回答您的问题,但我会IntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
Elliott Frisch

3
@ElliottFrisch但是为什么呢?在这里不需要流,但是即使您坚持在每个循环中都使用流,又为什么不至少要使用IntStream.rangeClosed('a', 'z')
PhilipRoman

1
没有单一的“正确”方法。可能至少有五种方法可以做到这一点:您选择哪种方式取决于时尚以及科学事实。在大多数情况下,这根本无关紧要,并且测试程序当然是其中一种情况。
user207421

@PhilipRoman因为在那里(Edmund Hillary)。因为我可以。因为我们要(我想是Billie Piper)。这也是一个很酷的方法。
Elliott Frisch

我本以为这是允许的您以为调用一个String不存在的构造函数是允许的?如果我错了,请纠正我,但据我所知,类String中没有构造函数采用单个char参数。请注意,这char与并不相同char[]
亚伯拉

Answers:


32

最短的解决方案:

char c = 'a';
String s = "" + c;

最干净(也是最有效的1)解决方案:

char c = 'a';

String s1 = String.valueOf(c);
// or
String s2 = Character.toString(c);

与您的方法相比,以上方法避免了将原语装箱到Character对象中的开销。


1在第一种方法中,字符串连接的效率低下可能会被编译器或运行时优化,因此,一个人(如果倾向于的话)实际上必须运行一个微基准来确定实际性能。像这样的微优化很少值得付出努力,依靠串联来强制进行字符串转换看起来不太好。


6
上次查看时,Sun的javac编译器会自动转换String s = "" + c;String s = String.valueOf(c);,因此性能将相同。
尼尔

4
@尼尔哇!我开始认为我在堆栈溢出中不再存在该脚注的类型:)
Robby Cornelissen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.