Benim bir charve ihtiyacım var String. Birinden diğerine nasıl dönüştürebilirim?
Benim bir charve ihtiyacım var String. Birinden diğerine nasıl dönüştürebilirim?
Yanıtlar:
Kullanabilirsiniz Character.toString(char). Bu yöntemin sadece bir çağrıyı döndürdüğünü String.valueOf(char)ve bunun da işe yaradığını unutmayın.
Diğerlerinin de belirttiği gibi, dize birleştirme de kısayol olarak çalışır:
String s = "" + 's';
Ancak bu, aşağıdakilere kadar derlenir:
String s = new StringBuilder().append("").append('s').toString();
çünkü daha az verimli olan StringBuilderbir ile desteklenmektedir char[](göre aşırı tahsis StringBuilder()etmek 16,) Sadece bu dizi savunmaya elde edilen tarafından kopyalanması için String.
String.valueOf(char)"arka kapıya girer", chartek öğeli bir diziye sarılarak String(char[], boolean)ve dizinin kopyalanmasını önleyen paket özel yapıcısına iletilir.
new StringBuilder("").append('s').toString();
Güzel soru. Bunu yapmak için aşağıdaki beş 6 yöntemden birini aldım .
// #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});
Not: Character.toString (char) , String.valueOf (char) değerini döndürür . Yani etkili bir şekilde her ikisi de aynı.
String.valueOf(char[] value)çağırır new String(char[] value), bu da valuechar dizisini ayarlar .
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
Öte yandan String.valueOf(char value)aşağıdaki paket özel kurucu çağırır .
String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}
Kaynak kodu String.javaiçinde Java 8 kaynak kodu
Bu nedenle
String.valueOf(char), hem bellek hem de hız açısından dönüştürmekchariçin en etkili yöntem gibi görünüyorString.
Aşağıda char c'yi String s'e dönüştürmenin çeşitli yolları vardır (azalan hız ve verimlilik sırasıyla)
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
@WarFox'un belirttiği gibi - char'ı dizeye dönüştürmek için 6 yöntem vardır. Bununla birlikte, en hızlı olanı, yukarıda belirtilen cevaplara rağmen, birleştirme yoluyla olacaktır String.valueOf. İşte bunu kanıtlayan kriter:
@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});
}
}
Ve sonuç:
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
Gördüğünüz gibi, en hızlısı c + ""veya "" + c;
VM version: JDK 1.8.0_131, VM 25.131-b11
Bu performans farkı -XX:+OptimizeStringConcatoptimizasyondan kaynaklanmaktadır . Burada okuyabilirsiniz .
Şunu deneyin: Character.toString(aChar)veya sadece şunu deneyin :aChar + ""
Biz dönüştürmek için çeşitli yollar vardır chariçin String. Tek yönlü statik yöntemin yapmak kullanımı için toString()de Charactersınıfta:
char ch = 'I';
String str1 = Character.toString(ch);
Aslında bu toStringyöntem valueOf, Stringsınıftan char dizisini kullanan yöntemi kullanır:
public static String toString(char c) {
return String.valueOf(c);
}
Yani ikinci yolu doğrudan bu kullanmaktır:
String str2 = String.valueOf(ch);
Sınıftaki bu valueOfyöntem Stringchar dizisini kullanır:
public static String valueOf(char c) {
char data[] = {c};
return new String(data, true);
}
Yani üçüncü bir yol yapmaktır anonim dizinin kullanılması geçirmeden sonra tek bir karakter sarın ve Stringyapıcı:
String str4 = new String(new char[]{ch});
Dördüncü yolu birleştirme yapmak kullanımına geçerli:
String str3 = "" + ch;
Bu aslında bir döngüde birleştirme yaparken aslında tercih edilen sınıftan bir appendyöntem kullanacaktır StringBuilder.
İşte belirli bir sırayla birkaç yöntem:
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();
Char Array'ı String'e dönüştürüyorum
Char[] CharArray={ 'A', 'B', 'C'};
String text = String.copyValueOf(CharArray);
Önerileri denedim, ancak aşağıdaki gibi uyguladım
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;
}
}
}});