Làm thế nào để chuyển đổi một char thành một chuỗi?


837

Tôi có một charvà tôi cần một String. Làm thế nào để tôi chuyển đổi từ cái này sang cái khác?


187
Bị hạ bệ? Tại sao tôi lại hỏi một câu hỏi dễ như vậy? Bởi vì Google thiếu một kết quả tìm kiếm thực sự rõ ràng cho câu hỏi này. Bằng cách đặt nó ở đây, chúng tôi sẽ thay đổi điều đó.
Landon Kuhn

45
Tôi hoàn toàn đồng ý với ý kiến ​​của bạn. Tôi đã bỏ phiếu này để loại bỏ các phiếu bầu tiêu cực. Tôi tin tưởng chắc chắn vào việc làm cho các chủ đề googling như thế này dễ dàng hơn cho mọi người. =)
prolink007

4
Nghiên cứu của bạn có bao gồm đọc tài liệu của lớp String không?
DJClayworth

12
@DJClayworth Hầu hết các câu hỏi SO có thể được trả lời bằng RTFM, nhưng điều đó không hữu ích lắm. Tại sao không để những người tìm thấy câu hỏi nêu lên và để mọi thứ diễn ra?
beldaz

10
@PaulBellora Chỉ có StackOverflow mới trở thành điểm dừng đầu tiên cho nghiên cứu. Nếu có một liên kết StackOverlfow trong 10 Kết quả Google đầu tiên tôi đến đây.
Martin

Câu trả lời:


642

Bạn có thể sử dụng Character.toString(char). Lưu ý rằng phương thức này chỉ đơn giản trả về một cuộc gọi đến String.valueOf(char), cũng hoạt động.

Như những người khác đã lưu ý, nối chuỗi cũng hoạt động như một phím tắt:

String s = "" + 's';

Nhưng điều này biên dịch xuống:

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

ít hiệu quả hơn vì StringBuilderđược hỗ trợ bởi một char[](được phân bổ quá StringBuilder()mức cho 16), chỉ cho mảng đó được sao chép một cách phòng thủ bởi kết quả String.

String.valueOf(char)"vào cửa sau" bằng cách gói charmột mảng phần tử đơn và chuyển nó đến hàm tạo riêng của gói String(char[], boolean), để tránh bản sao mảng.


Tôi nghĩ rằng các phím tắt biên dịch xuống:new StringBuilder("").append('s').toString();
Binkan Salaryman

@BinkanSalaryman sử dụng javac 1.8.0_51-b16 và sau đó javap để dịch ngược, tôi thấy các hàm gọi phương thức / phương thức mà tôi có trong câu trả lời. Bạn đang dùng gì?
Paul Bellora 24/07/2015

237

Câu hỏi hay. Tôi đã có năm 6 phương pháp sau đây để làm điều đó.

// #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});

Lưu ý: Character.toString (char) trả về String.valueOf (char) . Vì vậy, hiệu quả cả hai đều giống nhau.

String.valueOf(char[] value)Gọi new String(char[] value), lần lượt thiết lập valuemảng char.

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

Mặt khác String.valueOf(char value)gọi các gói xây dựng riêng sau đây .

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

Mã nguồn từ String.javatrong mã nguồn Java 8

Do đó String.valueOf(char)dường như là phương pháp hiệu quả nhất, về cả bộ nhớ và tốc độ, để chuyển đổi charsang String.

  1. Cách chuyển đổi char nguyên thủy thành String trong Java
  2. Cách chuyển đổi Char thành Chuỗi trong Java với Ví dụ

50

Dưới đây là nhiều cách khác nhau để chuyển đổi thành char c thành Chuỗi s (theo thứ tự giảm tốc độ và hiệu quả)

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

ai đó đã thử nghiệm điều này?
Lucas Noetzold

34

Sử dụng Character.toString()phương pháp như vậy:

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

33

Sử dụng bất kỳ thứ nào sau đây:

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

17

Như @WarFox đã nêu - có 6 phương thức để chuyển đổi char thành chuỗi. Tuy nhiên, cách nhanh nhất sẽ là thông qua ghép nối, mặc dù câu trả lời ở trên cho biết đó là String.valueOf. Đây là điểm chuẩn chứng minh rằng:

@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});
    }
}

Và kết quả:

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

Như bạn có thể thấy, cái nhanh nhất sẽ là c + ""hoặc "" + c;

VM version: JDK 1.8.0_131, VM 25.131-b11

Sự khác biệt hiệu suất này là do -XX:+OptimizeStringConcattối ưu hóa. Bạn có thể đọc về nó ở đây .


15

Hãy thử điều này: Character.toString(aChar)hoặc chỉ thế này:aChar + ""


4

Chúng tôi có nhiều cách khác nhau để chuyển đổi một charđể String. Một cách là sử dụng phương thức tĩnh toString()trong Characterlớp:

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

Trên thực tế toStringphương thức này sử dụng valueOfphương thức từ Stringlớp trong đó sử dụng mảng char:

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

Vì vậy, cách thứ hai là sử dụng trực tiếp:

String str2 = String.valueOf(ch);

valueOfPhương thức này trong Stringlớp sử dụng mảng char:

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

Vì vậy, cách thứ ba là sử dụng một mảng ẩn danh để bọc một ký tự đơn và sau đó chuyển nó đến hàm Stringtạo:

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

Cách thứ tư là sử dụng phép nối:

String str3 = "" + ch;

Điều này thực sự sẽ sử dụng appendphương thức từ StringBuilderlớp thực sự được ưa thích khi chúng ta thực hiện nối trong một vòng lặp.


4

Dưới đây là một vài phương pháp, không theo thứ tự cụ thể:

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

Tôi đang chuyển đổi Char Array thành String

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

Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ. - Từ đánh giá
pczeus

Tôi đang chuyển đổi mảng Char thành chuỗi @pczeus
Shiva

0

Tôi đã thử các đề xuất nhưng cuối cùng đã thực hiện nó như sau

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;
                }
            }
        }});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.