Char'ı String'e Dönüştürme Java (Örnekler)

⚡ Akıllı Özet

Karakteri dizeye dönüştürme Java Tek bir String.valueOf(myChar) veya Character.toString(myChar) çağrısı gerektirir. Ters yönde hareket etmek için charAt(index) kullanılır ve bu, bir String'den konumuna göre bir karakter çıkarır.

  • 🔘 Dize.değeri: String.valueOf(myChar) tek karakterlik bir String döndürür ve dönüştürmenin amacını en açık şekilde belirtir.
  • ☑️ Karakter.DizeyeDönüştür: Character.toString(myChar) aynı işi yapıyor ve çünkü Java 9, basitçe String.valueOf'a yetki devrediyor.
  • karakter: `charAt(index)` fonksiyonu, sıfır tabanlı konumdaki karakteri döndürür ve geçerli aralığın dışında ise `StringIndexOutOfBoundsException` hatası fırlatır.
  • 🧪 Karakter dizileri: `toCharArray()` bir dizeyi karakter dizisine ayırır ve `new String(chars)` bu diziden metni yeniden oluşturur.
  • Oyuncu seçimi yok: Bir String, ilgili bir temel veri türü değil, bir nesne olduğu için asla bir char türüne dönüştürülemez.
  • 📌 Unicode sınırı: Bir karakter, bir adet 16 bitlik UTF-16 kod birimini tutar; dolayısıyla bir emoji için iki karakter veya Character.toString(codePoint) gerekir.

Java Karakteri dizeye ve dizeyi tekrar karaktere dönüştüren kod.

Bu eğitimde, bir değeri iki yol arasında taşıyan iki kısa programı inceleyeceğiz. Java depolanan metin:

  1. Karakteri dizeye dönüştürün
  2. Bir dizeyi karaktere dönüştürün.

İki tür birbirinin yerine kullanılamaz. 'Char', tek tırnak içinde 'g' olarak yazılan, tam olarak bir adet 16 bitlik UTF-16 kod birimini tutan bir temel veri türüdür. 'String' ise çift tırnak içinde "" olarak yazılan, bu kod birimlerinin bir dizisini tutan bir nesnedir.Guru99”. Çünkü biri temel bir tür, diğeri bir nesne olduğundan, aralarında köprü kurmak için tür dönüştürme işlemi kullanılamaz; bu işi bir kütüphane yöntemi yapmalıdır ve Java Her yön için bir tane temin edilir.

Char'ı String'e Dönüştür

Bir karakteri bir dizeye dönüştürmenin birden fazla yolu vardır. JavaDahili olarak a Java String, metnini saklar. Bir dizi kod birimi olarak, bu nedenle tek bir karakter (char) bunlardan birine bu kadar kolay yerleşir. Char, 0 ile 65,535 arasında değerler tutabilen, iki bayt genişliğinde, 16 bitlik işaretsiz bir veri türüdür.

Bir karakteri (char) bir dizeye (string) dönüştürmek için iki yöntem kullanabiliriz: Character sınıfındaki statik toString() yöntemi ve String sınıfındaki statik valueOf() yöntemi. Her ikisi de tek karakter uzunluğunda yepyeni bir dize döndürür ve aşağıdaki iki program aynı sonucu verir.

Yöntem 1: toString() yöntemini kullanma

Aşağıdaki program "g" harfini bir değişkene kaydeder. karakter değişkeni ve bu karakteri Character.toString() fonksiyonuna iletir; bu fonksiyon da o tek karakteri bir String olarak döndürür. Kod düzenlenebilir olduğundan, harfi değiştirip tekrar çalıştırarak çıktının nasıl değiştiğini izleyebilirsiniz.

public class CharToString_toString {
  public static void main(String[] args) {
    //input character variable 
    char myChar = 'g';
    //Using toString() method
    //toString method take character parameter and convert string.
    String myStr = Character.toString(myChar);
    //print string value
    System.out.println("String is: " + myStr);
  }
} 

Beklenen çıktı :

String is: g

Yöntem 2: valueOf() yöntemini kullanma

İkinci program, String.valueOf(myChar) değerini kullanıyor ve başka hiçbir şeyi değiştirmiyor. Çünkü Java 9. İki çağrı da aynı işlemi gerçekleştiriyor: Character.toString(char) ifadesi String.valueOf(char) çağrısı olarak uygulanıyor, bu nedenle ikisinden birinin diğerinden ölçülebilir derecede daha hızlı olduğu söylenemez.

public class CharToString_valueOf {
  public static void main(String[] args) {
    char myChar = 'g';
    //valueOf method take character parameter and convert string.
    String myStr = String.valueOf(myChar);
    ////print string value
    System.out.println("String is: " + myStr);
  }
}

Beklenen çıktı :

String is: g

Karakteri Dizeye Dönüştürmenin Diğer Yolları

Eski kodlarda ve mülakat sorularında dört farklı yol daha karşımıza çıkıyor. Hepsi çalışıyor, ancak hiçbiri yukarıdaki iki yöntem kadar açık ve anlaşılır değil ve ikisi gerekenden fazla bellek tahsis ediyor.

public class CharToStringMore {
  public static void main(String[] args) {
    char myChar = 'g';

    // 1. concatenation with an empty literal
    String byConcat = myChar + "";

    // 2. the Character wrapper instance method
    String byWrapper = Character.valueOf(myChar).toString();

    // 3. a one-element array of code units
    String byArray = new String(new char[]{myChar});

    // 4. the format() helper with the %c conversion
    String byFormat = String.format("%c", myChar);

    System.out.println(byConcat + byWrapper + byArray + byFormat);
  }
}

Beklenen çıktı:

gggg

Tablo, her bir güzergahın ne zaman kullanılmaya değer olduğunu göstermektedir.

Yöntem Örnek E-posta notlar
Dize.değeri(karakter) Dize.değeri(myChar) Tavsiye edilir. Tek çağrı, döndürülen dizenin ötesinde ek bir nesne yok.
Karakter.toString(char) Karakter.toString(myChar) Aynı derecede iyi. Şu tarihten beri mevcut. Java 1.4 ve String.valueOf'a yetki devrediyor çünkü Java 9.
birbirine bağlama myChar + “” Eserler ve üzerine Java 9 ve sonrasında StringBuilder yerine invokedynamic çağrısına derlenir, bu nedenle yavaş olduğuna dair eski uyarı artık geçerli değildir. Yine de amacını gizler.
Karakter sarmalayıcı Karakter.değeri(myChar).dizeyedönüştür() BoxÖncelikle karakteri alın. Yeni Character(char) yapıcı metodu yerine Character.valueOf kullanın; bu metot, kullanımdan kaldırılmak üzere 2017'den beri kullanımdan kaldırılmıştır. Java 9.
karakter dizisi yeni Dize(yeni karakter dizisi {myChar}) Bir dizi ayırır ve kopyalar. Bu özelliği, halihazırda bir karakter dizisine sahip olduğunuz durumlar için ayırın.
Dize.biçimlendirme Dize.biçim("%c", myChar) En yavaş yöntemdir, çünkü format dizesi çalışma zamanında ayrıştırılır. Yalnızca karakter daha büyük bir şablonun parçası olduğunda kullanışlıdır.

Tek karakter dönüştürmenin her iki yönü de ele alındığına göre, sırada ters işlem var.

String'i karaktere dönüştür

String sınıfının charAt() metodunu kullanarak bir String'i char'a dönüştürebiliriz. Bu metot sıfır tabanlı bir indeks alır ve o konumda bulunan karakteri döndürür; bu nedenle her karakteri okumak şu anlama gelir: tuvaletping 0'dan length() eksi bire kadar indeks değerleri alınabilir. 0'ın altında veya length() ve üzeri bir indeks değeri istendiğinde StringIndexOutOfBoundsException hatası fırlatılır.

Aşağıdaki program dizeyi dolaşır. Guru99 karakteri tek tek konumlandırır ve her karakteri indeksiyle birlikte yazdırır.

//Convert String to Character using string method 
package com.guru99;
 
public class StringToChar {
 
	public static void main(String[] args) 
	{
		//input String 
	      String myStr = "Guru99";
	      
	      //find string length using length method.
	      int stringLength =myStr.length();
	      
	      //for loop start 0 to total length
	      for(int i=0; i < stringLength;i++)
	      {
	    	  //chatAt method find Position and convert to character.  
	        char myChar = myStr.charAt(i);
	        
	        //print string to character
	        System.out.println("Character at "+i+" Position: "+myChar);
	      }
 
	}
 
}

Beklenen çıktı:

Character at 0 Position: G
Character at 1 Position: u
Character at 2 Position: r
Character at 3 Position: u
Character at 4 Position: 9
Character at 5 Position: 9

Unutmayın ki bir String'i doğrudan dönüştüremezsiniz: `char c = (char) myStr;` derlenmez, çünkü String bir nesnedir ve `char` bir temel veri türüdür. Tam olarak bir karakter içerdiği bilinen bir String için, `charAt(0)` tüm cevabı verir.

Bir Dizeyi Karakter Dizisine ve Geri Dönüştürme

Her karakterin aynı anda, tek tek indekslere değil de aynı anda gerekli olduğu durumlarda, toCharArray() yöntemi geri dönüş değeri döndürür. yeni bir kömür dizisiBu diziyi tekrar metne dönüştürmek, String(char[]) yapıcı fonksiyonunun veya String.valueOf(char[]) fonksiyonunun görevidir ve her ikisi de diziyi koruyucu bir şekilde kopyalar, böylece dizide yapılan sonraki düzenlemeler String'i değiştirmez.

public class StringCharArray {
  public static void main(String[] args) {
    String myStr = "Guru99";

    // the text split into its array of code units
    char[] chars = myStr.toCharArray();
    System.out.println(chars.length);
    System.out.println(chars[0]);

    // the array turned back into text
    System.out.println(new String(chars));
    System.out.println(String.valueOf(chars));

    // one range copied into an array you already own
    char[] part = new char[4];
    myStr.getChars(0, 4, part, 0);
    System.out.println(new String(part));
  }
}

Beklenen çıktı:

6
G
Guru99
Guru99
Guru

Dördüncü bir yöntem olan getChars(srcBegin, srcEnd, dst, dstBegin), yeni bir dizi ayırmak yerine, bir aralığı zaten sahip olduğunuz bir diziye kopyalar. Bitiş indeksi hariç tutulur, bu nedenle getChars(0, 4, part, 0) şu sonucu verir: Guru ziyade Guru9. Aralık dışı sınırlar IndexOutOfBoundsException hatası fırlatır.

Aşağıda özetlendiği gibi, üç yaklaşım esas olarak tahsis ettikleri kaynaklar bakımından farklılık gösterir.

Görev Çağrı Neyi tahsis eder?
Dizeyi karakter dizisine dönüştür myStr.toCharArray() Yeni bir dizi; boş bir dize üzerinde güvenlidir, bu durumda sıfır uzunlukta bir dizi döndürür.
Karakter dizisini dizeye dönüştür yeni String(karakterler) veya String.valueOf(karakterler) Yeni bir String ve dizinin dahili bir kopyası.
Mevcut bir diziye aralık ekle myStr.getChars(0, 4, part, 0) Yeni bir şey yok; sizin verdiğiniz diziye yazıyor.

Karakter ve Dize Dönüştürme İşlemlerinde Sık Karşılaşılan Hatalar Java

Bu dönüşümlerdeki sorunların çoğu, yöntemlerin kendisinden ziyade altı tekrar eden hatadan kaynaklanmaktadır. Tablo, her birini çözümüyle eşleştirmektedir.

Sorun Sebeb olmak sabit
Uyumsuz türler: Dize, karakter türüne dönüştürülemez. Örneğin, char c = (char) myStr; şeklinde bir dönüştürme girişimi. Bunun yerine myStr.charAt(0)'ı çağırın. Bir nesne ile bir ilkel veri türü arasında tür dönüştürme yoktur.
StringIndexOutOfBoundsException charAt() fonksiyonu negatif bir indeksle veya boş bir String üzerinde length() fonksiyonuyla çağrıldığında Okuma işlemine başlamadan önce isEmpty() ile kontrol edin veya indeksi length() ile karşılaştırın.
String.valueOf(null) NullPointerException hatası fırlatır. Null değeri, en spesifik olan char[] aşırı yüklemesiyle eşleşir. Eğer "null" metnini doğrudan kullanmak istiyorsanız, String.valueOf((Object) null) yazın.
Character.toString(65) 65 değil, A döndürür. Java 11. sürümde, argümanını Unicode kod noktası olarak okuyan Character.toString(int) aşırı yüklemesi eklendi. 65 rakamı için String.valueOf(65) veya Integer.toString(65) kullanın.
Emoji, iki anlaşılmaz sembol olarak yazdırılır. U+FFFF'nin üzerindeki karakterler iki karakter kaplar; önce yüksek bir vekil karakter, ardından düşük bir vekil karakter gelir. codePointAt(0) ile değeri okuyun, ardından Character.toString(codePoint) ile yeniden oluşturun. Java 11 ve sonrası.
Yeni Karakter (myChar) için kullanımdan kaldırma uyarısı. Character(char) yapıcı fonksiyonu, şu tarihten beri kullanımdan kaldırılmıştır. Java 9 ve kaldırılmak üzere işaretlendi Character.valueOf(myChar) kullanın veya otomatik kutulama işleminin sarmalayıcıyı sağlamasına izin verin.

Aynı String sınıfı, birçok komşu alıştırmayı destekler: Özyinelemeli yöntemle bir dizenin tersini alma, iki dizeyi karşılaştırmak, ve Biçimlendirilmiş çıktı yazdırma.

SSS

`char`, tek tırnak içinde yazılmış, 16 bitlik bir UTF-16 kod birimini tutan bir temel veri türüdür. `String` ise çift tırnak içinde yazılmış, bu birimlerin bir dizisini tutan bir nesnedir ve temel veri türlerinin sahip olmadığı `length()` ve `charAt()` gibi yöntemlere sahiptir.

Hayır. Java 9. Character.toString(char) işlevi, String.valueOf(char) çağrısı olarak uygulanır, bu nedenle ikisi de aynı kodu çalıştırır. Çalıştığınız yerde hangisi daha iyi okunuyorsa onu seçin; String.format(“%c”, c) gerçekten yavaş olan tek yöntemdir.

Bir karakter 16 bitlik bir kod birimini saklar ve emojiler U+FFFF'nin üzerinde yer alır. Java Bunları birer yedek çiftine ayırır, böylece iki karakter kaplarlar. codePointAt() ile kod noktasını okuyun ve Character.toChars() veya Character.toString(codePoint) ile metni yeniden oluşturun.

A Dizisi. Java 11. sürüm, argümanını Unicode kod noktası olarak okuyan bir int aşırı yüklemesi ekledi ve 65, A'nın kod noktasıdır. String.valueOf(65) bunun yerine 65 rakamlarını döndürür, bu da iki çağrının karıştırılmasını kolaylaştırır.

Bunu artı operatörüyle birleştirin veya toplama işlemi bir döngü içinde gerçekleşiyorsa StringBuilder üzerinde append() yöntemini çağırın. Java Dize değiştirilemez olduğundan, her birleştirme işlemi eski nesneyi genişletmek yerine yeni bir nesne oluşturur.

O zamandan beri değil Java 9. Kompakt dizeler, dahili karakter dizisini bir bayt dizisi ve bir kodlayıcı bayrağıyla değiştirdi, böylece saf Latin-1 metin karakter başına bir bayt kullanıyor. Genel API'de hiçbir şey değişmedi ve charAt() hala bir karakter döndürüyor.

Makine öğrenimi tabanlı statik analizciler, derleyicinin kabul ettiği şüpheli dönüşümleri işaretler; örneğin, korumasız bir charAt() çağrısı veya char dizisi aşırı yüklemesine çözümlenen bir String.valueOf(null) gibi. Bulguları olasılığa göre sıralayarak, düz kural tabanlı taramanın gürültüsünü azaltırlar.

GitHub Yardımcı Pilotu Güvenilir bir şekilde String.valueOf() ve charAt() tek satırlık kodlar üretir, ancak aynı zamanda eğitim verilerinden gelen, kullanımdan kaldırılmış new Character(c) yapıcı fonksiyonu gibi eski tavsiyeleri de yeniden üretir. Her öneriyi derleyin ve kullanımdan kaldırma uyarılarını okuyun.

Bu yazıyı şu şekilde özetleyin: