SORU
12 EKİM 2009, PAZARTESİ


Değişmezliğini tanıdı Java Dizeleri

Aşağıdaki örneği ele alalım.

String str = new String();

str  = "Hello";
System.out.println(str);  //Prints Hello

str = "Help!";
System.out.println(str);  //Prints Help!

Şimdi, Java, String nesneleri değiştirilemez. Nasıl str atanabilir nesne değer gel "Yardım edin!". sonra Bu Java dizeleri değişmezliğini tanıdı aykırı değil mi? Kimse beni değişmezliğini tanıdı tam kavramını açıklayabilecek olan var mı?

Düzenleme:

Tamam. Şimdi bunu alıyorum, ama sadece bir takip soru. Aşağıdaki kodu ne hakkında:

String str = "Mississippi"; 
System.out.println(str); // prints Mississippi 

str = str.replace("i", "!"); 
System.out.println(str); // prints M!ss!ss!pp! 

Bu iki nesne daha oluşturulur anlamına ("Mississippi" ve "M!ss!ss!") pp! ve başvuru str puan replace() yöntem sonra farklı bir nesneye?

CEVAP
12 EKİM 2009, PAZARTESİ


str bir nesne değil, bir nesne için bir başvuru. "Hello" "Help!" String iki farklı nesne. Böylece, strpuan içinbir dize. Ne değiştirebilirsinizpuan içinolan bu değil amaişaret ediyor.

Örneğin: bu kodu alın

String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"

Şimdi, bir şey yok1s2 değerini etkileyecek s1 yapabiliriz. Aynı nesne - 19 ** - ama nesne değişmez bir dize bakın ve değiştirilemez böylece.

Eğer yaparsak böyle bir şey:

s1 = "Help!";
System.out.println(s2); // still prints "Hello"

Burada bir nesneye dönüşmekte ve bir referans değiştirme arasındaki farkı görüyoruz. s2 hala başlangıçta s1 işaret kümesi olarak aynı nesneyi işaret eder. "Help!" s1 ayar değişiklikleribaşvuruString nesne olsa da , başlangıçta belirtilen değişmeden kalır.

Dizeleriedildikesilebilir, böyle bir şey yapabiliriz:

String s1 = "Hello";
String s2 = s1;
s1.setCharAt(1, 'a'); // Fictional method that sets character at a given pos in string
System.out.println(s2); // Prints "Hallo"

Edit OP karşılık düzenlemek için:

Bakarsanız source code for String.replace(char,char) (de mevcut src.zip senin İLGİLENİYORUZ yükleme dizini profesyonel ipucu için bak sana her zaman merak ediyorum nasıl bir şey gerçekten çalışıyor) o ne yapar şudur:

  • Eğer string içinde oldChar bir ya da daha fazla eşleşme varsa, oldChar tüm tekrarlarını newChar ile değiştirilir geçerli dize bir kopyasını alın.
  • Eğer oldChar string içinde varsa, geçerli dize döndürür.

Yani Evet, "Mississippi".replace('i', '!') oluşturur String yeni bir nesne. Yine şunları içerir:

String s1 = "Mississippi";
String s2 = s1;
s1 = s1.replace('i', '!');
System.out.println(s1); // Prints "M!ss!ss!pp!"
System.out.println(s2); // Prints "Mississippi"
System.out.println(s1 == s2); // Prints "false" as s1 and s2 are two different objects

Ödevini şimdi ise değiştirirseniz yukarıdaki kodun ne yaptığını görmek için s1 = s1.replace('i', '!'); s1 = s1.replace('Q', '!'); :)


1Aslında, buOlası dizeleri mutasyona (ve diğer sabit nesneler). Yansıma gerektirir ve çok, çok tehlikeli ve asla hiç program yok ilgilendiğiniz sürece kullanılmalıdır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • olinerd

    olinerd

    23 AĞUSTOS 2007
  • TheOtherMau5

    TheOtherMau5

    6 Mart 2012
  • Top10Series

    Top10Series

    26 Kasım 2008