文字配列を文字列に戻す方法は?


405

私はchar配列を持っています:

char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};

私の現在の解決策は

String b = new String(a);

しかし、確かにこれを行うより良い方法がありますか?


151
なぜもっと良い方法があると思いますか?そして、私をシャーリーと呼ばないでください。:)
ホバークラフトフルウナギ

上記のような新しい変数を作成することは常に実行時に関連付けられるためです。たとえば、上記の行を入力してchar配列を文字列に変換してforループにした場合、私には正しく見えません。そして、はい、私は少し完璧主義者です。。。
11

1
char []の配列またはコレクションなど、これらの人がたくさんいる場合、char配列をStringBufferに追加しますが、ここまたはそこにあるStringの場合、投稿したものが最も使用されます。
ホバークラフトフルウナギ

char []のコピーを回避する方法を探しているなら、それはありません。そうでなければ、文字列の不変性を覆す可能性があります。
Paul Cager、2011年

13
「新しい変数を作成する」ことでオーバーヘッドは発生しません。変数は値を参照するために使用される名前であり、名前自体は実行時にメモリ内のどこにも存在しません(少なくとも、リフレクションがかなり制限されているJavaのような言語では存在しません)。「オーバーヘッド」は、新しいを作成することから生じます。問題が「この値を作成する」ことであることを考えると、ケースではそれを回避する方法はありません。char配列を魔法のように文字列に変換することはできません。あなたはできる文字列が作成された後、元のchar配列は、ガベージコレクトするために手配します。
Karl Knechtel、2011年

回答:


212

いいえ、その解決策は完全に正しく、最小限です。

ただし、これは非常に珍しい状況であることに注意してください。はStringJavaで特別に処理されるため、"foo"実際にはStringです。そのcharため、通常のコードでは、文字列を個別のに分割して結合する必要はありません。

これをC / C ++と比較してください。一方の側ともう一方の側で0バイトで終了するsの"foo"バンドルがあり、レガシーメソッドによるそれらの間の多くの変換があります。charstring


146

String text = String.copyValueOf(data);

または

String text = String.valueOf(data);

間違いなく優れています(new String呼び出しをカプセル化します)。


6
どちらのメソッドも、String(char[])またはそのバリアントを呼び出します。そして、コピー部分は内部で行われString(char[])ます。これは、他のvalueOfメソッドとの対称性を除いて、直接呼び出しに利点を残しません。
AH

1
静的OOPは用語の矛盾です。staticと宣言されたものは、オブジェクトまたはその動作の一部ではないため、オブジェクト指向ではありません。この他に-の実装がString互換性のない方法で変更および/または拡張される可能性がある場合、またはいくつかの競合する実装が実行時に選択される可能性がある場合は、静的なファクトリメソッドが理にかなっています。これは、などの低レベルのものでは発生しませんString。したがって、私の前提は、利用可能な最大のハンマーではなく、適切な最小のハンマーを使用することです。
AH

@AH私はそれについて知りません。Stringは、StringBuilderに取って代わったStringBufferに取って代わりました。StringBufferの支持者たちも同じことを言っていたに違いありませんが、StringBuilderを使用するにはコードをリファクタリングする必要があります。
corsiKa 2013年

1
@AH彼らがCharSequenceインターフェースを作成しなければならなかったという事実は、あなたの「文字列のような低レベルのもので起こらない」という欠陥があることを示しています-彼らは早い段階でそれに結びついていたので、文字列で起こっていることを変更しません。彼らは持っていないでしょう。
corsiKa 2013年

1
@corsiKa String APIはすべて優れており、すばらしいと私は言いませんでした。互換性のない方法で変更されないこと、およびクラス自体とそのコンストラクターがどこにも移動しないことだけです。:-)
AH

37

これは文字配列を文字列に変換します:

char[] charArray = {'a', 'b', 'c'};
String str = String.valueOf(charArray);

14
String str = "wwwwww3333dfevvv";
char[] c = str.toCharArray();

文字配列をStringに変換するには、2つの方法があります。

Arrays.toString(c);

文字列を返します[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]

そして:

String.valueOf(c)

文字列を返しますwwwwww3333dfevvv

要約するとArrays.toString(c)、の"[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"代わりになるので、に注意してください"wwwwww3333dfevvv"


7

Javaの文字列は、charの配列を囲むオブジェクトにすぎません。したがって、

char[]

同じ文字を持つボックス化されていない文字列と同じです。文字の配列から新しい文字列を作成する

new String(char[])

基本的に、文字配列の周りのStringオブジェクトをオートボックス化するようコンパイラーに指示します。



2
package naresh.java;

public class TestDoubleString {

    public static void main(String args[]){
        String str="abbcccddef";    
        char charArray[]=str.toCharArray();
        int len=charArray.length;

        for(int i=0;i<len;i++){
            //if i th one and i+1 th character are same then update the charArray
            try{
                if(charArray[i]==charArray[i+1]){
                    charArray[i]='0';                   
                }}
                catch(Exception e){
                    System.out.println("Exception");
                }
        }//finally printing final character string
        for(int k=0;k<charArray.length;k++){
            if(charArray[k]!='0'){
                System.out.println(charArray[k]);
            }       }
    }
}

このコードは質問に答えることがありますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。
バイコー2017

1
 //Given Character Array 
  char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};


    //Converting Character Array to String using String funtion     
    System.out.println(String.valueOf(a));
    //OUTPUT : hello world

Java 8ストリーム関数を使用して、特定の配列型を文字列に変換する

String stringValue = 
Arrays.stream(new char[][]{a}).map(String::valueOf).collect(Collectors.joining());

1

使用してみてくださいjava.util.Arrays。このモジュールには、配列に関連して使用できるさまざまな便利なメソッドがあります。

Arrays.toString(your_array_here[]);


0

以下のようなString.valueを使用するだけです。

  private static void h() {

        String helloWorld = "helloWorld";
        System.out.println(helloWorld);

        char [] charArr = helloWorld.toCharArray();

        System.out.println(String.valueOf(charArr));
    }

-3

これを試して:

CharSequence[] charArray = {"a","b","c"};

for (int i = 0; i < charArray.length; i++){
    String str = charArray.toString().join("", charArray[i]);
    System.out.print(str);
}

-4

StringBuilderクラスを使用することもできます

String b = new StringBuilder(a).toString();

StringまたはStringBuilderの使用は、メソッドの要件によって異なります。


なんで?これから何を得るのですか?
ケーシー

-12

1つの代替方法は次のとおりです。

String b = a + "";

3
toString正しく動作すると想定しているため、これは誤りchar[]です。特定のベンダーやJVMのバージョンで動作する場合があります。
fommil 14

3
Stringクラスは不変であるので、この二つの操作が実行されるようになります:のtoString()の呼び出しaと別のStringオブジェクトの作成と連結しているa.toString()""
Alpay
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.