これはJavaで文字を文字列に変換する正しい方法ですか?[重複]


20

boolean2つStringのsを返す関数の単体テストを作成しているときに、アルファベット('a'- 'z')のすべての文字をパラメーターの1つとして1つずつ順番にテストする必要があったので、これを行うためにこれを作成しました。

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でa charをa Stringに変換する信頼できる方法ですか?それが望ましい方法ですか?Javaについてはあまり詳しくないので、これについて説明をお願いします。


2
あなたの質問に直接ではありませんが、私はそうしますIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
エリオットフリッシュ

3
@ElliottFrischしかし、なぜですか?ここではストリームは不要ですが、すべてのループでストリームを使用するように主張したとしても、少なくとも使用しないのはなぜIntStream.rangeClosed('a', 'z')ですか?
PhilipRoman

1
単一の「正しい」方法はありません。これを行うには少なくとも5つの方法があります。どちらを選択するかは、科学的事実だけでなく、ファッションにも依存します。ほとんどの場合、それは単純に重要ではなく、テストプログラムは確かにそれらのケースの1つです。
user207421

@PhilipRoman(エドムンドヒラリー)があるから。出来るからです。したいからです(ビリーパイパー、そう思います)。それもクールなアプローチです。
エリオットフリッシュ

これは許されると思いましたが、String存在しないコンストラクタを呼び出すことは許されると思いましたか?私が間違っている場合は修正してください。ただし、私の知る限りStringでは、単一のchar引数を取るクラスのコンストラクタはありません。charと同じではないことに注意してくださいchar[]
アブラ

回答:


33

最短のソリューション:

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);ため、パフォーマンスは同じになります。
Neil

4
@ニールフー!私がその脚注を書いた種類の人がスタックオーバーフローに存在しなくなったと思っていました:)
Robby Cornelissen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.