Tôi có một char
và 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?
Tôi có một char
và 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?
Câu trả lời:
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 char
mộ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.
new StringBuilder("").append('s').toString();
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 value
mả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.java
trong 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 đổichar
sangString
.
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
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:+OptimizeStringConcat
tối ưu hóa. Bạn có thể đọc về nó ở đây .
Hãy thử điều này: Character.toString(aChar)
hoặc chỉ thế này:aChar + ""
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 Character
lớp:
char ch = 'I';
String str1 = Character.toString(ch);
Trên thực tế toString
phương thức này sử dụng valueOf
phương thức từ String
lớ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);
valueOf
Phương thức này trong String
lớ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 String
tạ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 append
phương thức từ StringBuilder
lớ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.
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();
Tôi đang chuyển đổi Char Array thành String
Char[] CharArray={ 'A', 'B', 'C'};
String text = String.copyValueOf(CharArray);
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;
}
}
}});