문자를 문자열로 변환하는 방법?


837

나는 char있고 나는 필요하다 String. 하나에서 다른 것으로 어떻게 변환합니까?


187
공감? 왜 그렇게 쉬운 질문을합니까? Google은이 질문에 대한 확실한 검색 결과가 없기 때문입니다. 이것을 여기에두면 변경됩니다.
랜던 쿤

45
나는 당신의 의견에 전적으로 동의합니다. 나는 부정적인 투표를 없애기 위해 이것을 투표했다. 모든 사람들이 쉽게 인터넷 검색을 할 수 있다고 믿습니다. =)
prolink007

4
연구에 String 클래스의 문서를 읽는 것이 포함 되었습니까?
DJClayworth

12
@DJClayworth 대부분의 SO 질문은 RTFM으로 대답 할 수 있지만 그다지 도움이되지는 않습니다. 질문을 찾는 사람들이 그 질문을지지하고 일을 수강하게하지 않겠습니까?
beldaz

10
@PaulBellora StackOverflow만이 연구 의 첫 번째 정지 점이되었습니다 . 처음 10 개의 Google 검색 결과에 StackOverlfow 링크가있는 경우 여기에 문의하십시오.
Martin

답변:


642

사용할 수 있습니다 Character.toString(char). 이 메소드는 단순히에 대한 호출을 리턴 String.valueOf(char)합니다.

다른 사람들이 지적했듯이 문자열 연결은 바로 가기로도 작동합니다.

String s = "" + 's';

그러나 이것은 다음과 같이 컴파일됩니다.

String s = new StringBuilder().append("").append('s').toString();

때문에 비효율적 인 StringBuildera로 백업 char[](기준 초과 할당 StringBuilder()으로 16) 해당 어레이가 수비를 생성하여 복사 할 String.

String.valueOf(char)char배열을 단일 요소 배열 로 감싸고 이를 패키지 private constructor에 전달하면 "백도어를 가져옵니다" String(char[], boolean).


바로 가기가 다음과 같이 컴파일 new StringBuilder("").append('s').toString();
된다고

javac 1.8.0_51-b16을 사용하여 javaB 1.8.0_51-b16을 사용한 다음 javap를 사용하여 @BinkanSalaryman은 생성자 / 메소드 호출을 볼 수 있습니다. 무엇을 사용하고 있습니까?
Paul Bellora

237

좋은 질문. 나는 다음과 같은 다섯 가지 6 가지 방법을 가지고 있습니다.

// #1
String stringValueOf = String.valueOf('c'); // most efficient

// #2
String stringValueOfCharArray = String.valueOf(new char[]{x});

// #3
String characterToString = Character.toString('c');

// #4
String characterObjectToString = new Character('c').toString();

// #5
   // Although this method seems very simple, 
   // this is less efficient because the concatenation
   // expands to new StringBuilder().append(x).append("").toString();
String concatBlankString = 'c' + "";

// #6
String fromCharArray = new String(new char[]{x});

참고 : Character.toString (char)String.valueOf (char)를 반환합니다 . 효과적으로 둘 다 동일합니다.

String.valueOf(char[] value)를 호출 new String(char[] value)하면 valuechar 배열이 설정 됩니다.

public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}

반면에 String.valueOf(char value)다음 패키지 개인 생성자를 호출합니다 .

String(char[] value, boolean share) {
    // assert share : "unshared not supported";
    this.value = value;
}

에서 소스 코드 String.java에서 자바 8 소스 코드

따라서 String.valueOf(char)로 변환하는 char데 메모리와 속도 모두에서 가장 효율적인 방법 인 것 같습니다 String.

  1. Java에서 원시 문자를 문자열로 변환하는 방법
  2. 예를 들어 Java에서 Char를 String으로 변환하는 방법

50

다음은 char c를 String s로 변환하는 다양한 방법입니다 (속도와 효율성의 순서가 감소).

char c = 'a';
String s = String.valueOf(c);             // fastest + memory efficient
String s = Character.toString(c);
String s = new String(new char[]{c});
String s = String.valueOf(new char[]{c});
String s = new Character(c).toString();
String s = "" + c;                        // slowest + memory inefficient

누군가 이것을 테스트 했습니까?
Lucas Noetzold

34

다음 Character.toString()과 같은 방법을 사용하십시오 .

char mChar = 'l';
String s = Character.toString(mChar);

33

다음 중 하나를 사용하십시오.

String str = String.valueOf('c');
String str = Character.toString('c');
String str = 'c' + "";

17

@WarFox가 언급했듯이 char을 문자열로 변환하는 6 가지 방법이 있습니다. 그러나 가장 빠른 것은 위의 답변에도 불구하고 연결을 통해 이루어 String.valueOf집니다. 이를 입증하는 벤치 마크는 다음과 같습니다.

@BenchmarkMode(Mode.Throughput)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 10, time = 1, batchSize = 1000, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 1, batchSize = 1000, timeUnit = TimeUnit.SECONDS)
public class CharToStringConversion {

    private char c = 'c';

    @Benchmark
    public String stringValueOf() {
        return String.valueOf(c);
    }

    @Benchmark
    public String stringValueOfCharArray() {
        return String.valueOf(new char[]{c});
    }

    @Benchmark
    public String characterToString() {
        return Character.toString(c);
    }

    @Benchmark
    public String characterObjectToString() {
        return new Character(c).toString();
    }

    @Benchmark
    public String concatBlankStringPre() {
        return c + "";
    }

    @Benchmark
    public String concatBlankStringPost() {
        return "" + c;
    }

    @Benchmark
    public String fromCharArray() {
        return new String(new char[]{c});
    }
}

그리고 결과 :

Benchmark                                        Mode  Cnt       Score      Error  Units
CharToStringConversion.characterObjectToString  thrpt   10   82132.021 ± 6841.497  ops/s
CharToStringConversion.characterToString        thrpt   10  118232.069 ± 8242.847  ops/s
CharToStringConversion.concatBlankStringPost    thrpt   10  136960.733 ± 9779.938  ops/s
CharToStringConversion.concatBlankStringPre     thrpt   10  137244.446 ± 9113.373  ops/s
CharToStringConversion.fromCharArray            thrpt   10   85464.842 ± 3127.211  ops/s
CharToStringConversion.stringValueOf            thrpt   10  119281.976 ± 7053.832  ops/s
CharToStringConversion.stringValueOfCharArray   thrpt   10   86563.837 ± 6436.527  ops/s

보다시피 가장 빠른 것은 c + ""또는 "" + c;

VM version: JDK 1.8.0_131, VM 25.131-b11

이 성능 차이는 -XX:+OptimizeStringConcat최적화 때문 입니다. 여기에서 읽을 수 있습니다 .



4

를로 변환하는 다양한 방법 charString있습니다. 한 가지 방법은 클래스 toString()에서 정적 메소드 를 사용하는 것입니다 Character.

char ch = 'I'; 
String str1 = Character.toString(ch);

실제로이 toString메소드는 내부적 으로 char 배열을 사용하는 클래스 의 valueOf메소드를 String사용합니다.

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

그래서 두 번째 방법은 직접를 사용하는 것입니다 :

String str2 = String.valueOf(ch);

클래스 의이 valueOf메소드 String는 char 배열을 사용합니다.

public static String valueOf(char c) {
        char data[] = {c};
        return new String(data, true);
}

따라서 세 번째 방법은 익명 배열을 사용하여 단일 문자를 래핑 한 다음 String생성자에 전달하는 것입니다 .

String str4 = new String(new char[]{ch});

네 번째 방법은 연결의 메이크업에 사용하는 것입니다 :

String str3 = "" + ch;

이것은 실제로 루프에서 연결을 수행 할 때 실제로 선호 append되는 StringBuilder클래스 의 메소드를 사용 합니다.


4

다음은 특별한 순서가 아닌 몇 가지 방법입니다.

char c = 'c';

String s = Character.toString(c); // Most efficient way

s = new Character(c).toString(); // Same as above except new Character objects needs to be garbage-collected

s = c + ""; // Least efficient and most memory-inefficient, but common amongst beginners because of its simplicity

s = String.valueOf(c); // Also quite common

s = String.format("%c", c); // Not common

Formatter formatter = new Formatter();
s = formatter.format("%c", c).toString(); // Same as above
formatter.close();

2

Char Array를 String으로 변환하고 있습니다

Char[] CharArray={ 'A', 'B', 'C'};
String text = String.copyValueOf(CharArray);

이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 의견을 남기십시오. - 리뷰에서
pczeus

Char 배열을 String @pczeus로 변환 중입니다.
Shiva

0

제안을 시도했지만 다음과 같이 구현했습니다.

editView.setFilters(new InputFilter[]{new InputFilter()
        {
            @Override
            public CharSequence filter(CharSequence source, int start, int end,
                                       Spanned dest, int dstart, int dend)
            {
                String prefix = "http://";

                //make sure our prefix is visible
                String destination = dest.toString();

                //Check If we already have our prefix - make sure it doesn't
                //get deleted
                if (destination.startsWith(prefix) && (dstart <= prefix.length() - 1))
                {
                    //Yep - our prefix gets modified - try preventing it.
                    int newEnd = (dend >= prefix.length()) ? dend : prefix.length();

                    SpannableStringBuilder builder = new SpannableStringBuilder(
                            destination.substring(dstart, newEnd));
                    builder.append(source);
                    if (source instanceof Spanned)
                    {
                        TextUtils.copySpansFrom(
                                (Spanned) source, 0, source.length(), null, builder, newEnd);
                    }

                    return builder;
                }
                else
                {
                    //Accept original replacement (by returning null)
                    return null;
                }
            }
        }});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.