Bir dize “” kullanılarak nasıl başlatılabilir?


154

Dize, tıpkı diğerleri gibi bir sınıfsa, çift tırnak işaretleri kullanılarak nasıl başlatılabilir?


25
String bir VIP sınıfıdır. " "zaten bir String!
johnchen902

2
Özel bir anlamı yok. Sadece Çok Önemli demek istedim. Yani, java.lang.StringJava Dili için özel bir muamele var.
johnchen902

16
Dizenin "diğerleri gibi bir sınıf" olduğunu kim söyledi? Diğerlerinden farklı olarak çok özel bir sınıftır. Varsayımınız yanlış olduğu için soru gerçekten cevaplanamaz.
Eric Lippert

5
Varsayım yanlış olduğu için, sorunun cevaplanamayacağı anlamına gelmez. Ve doğru cevabın zaten 197 oyu var.
Koray Tugay

Yanıtlar:


293

Java Dizesi Özeldir

Java tasarımcıları, dilin performansını iyileştirmek için her şeyi bir nesne yapmak yerine, ilkel türleri nesne yönelimli bir dilde tutmaya karar verdiler. Temel öğeler, daha az depolama alanı gerektiren ve manipüle edilmesi daha ucuz olan çağrı yığınında saklanır. Öte yandan, nesneler program yığınında saklanır, bu da karmaşık bellek yönetimi ve daha fazla depolama alanı gerektirir.

Performans açısından Java'nın String ilkel ve sınıf arasında olacak şekilde tasarlanmıştır.

Örneğin

String s1 = "Hello";              // String literal
String s2 = "Hello";              // String literal
String s3 = s1;                   // same reference
String s4 = new String("Hello");  // String object
String s5 = new String("Hello");  // String object

resim açıklamasını buraya girin

Not: Dize değişmezleri ortak bir havuzda depolanır. Bu, depolamayı korumak için aynı içeriğe sahip dizeler için depolama alanının paylaşılmasını kolaylaştırır. Stringyeni işleç aracılığıyla ayrılan nesneler, içinde depolanır heapve aynı içerikler için depolama paylaşımı yoktur.


72
"Ortak havuz" genellikle yığının bir parçası olduğunu unutmayın .
Joachim Sauer

3
@JoachimSauer Evet .. küçük faydaları ile :) not ekledi.Anımsadığınız için teşekkürler.
Suresh Atta

2
Dize yazmak daha hızlı mı s1 = "Hello"; than String s2 = yeni Dize ("Merhaba") ;?
user2097804

28
Bunu örneğinize eklerim s1 == s2 == s3 ama s4! = S5
Alfredo Osorio

8
@AndrewJanke son hotspot jvm (7) üzerinde, dize havuzu perma gen değil ve Java 8'den artık perma gen yok ...
assylias

50

Java, String'i özel bir sınıf olarak ele alır, her iki şekilde de başlatabilirsiniz

  1. Doğrudan hazır bilgi atama

    String a = "adsasdf";
  2. Yeni anahtar kelime kullanan diğer Nesneler gibi

    String a = new String("adsasdf");

İşaretle karşılaştırmak istediğinizde özel dikkat göstermeniz gerekir ==:

String a = "asdf";
String b = "asdf";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

String a = new String("asdf");
String b = new String("asdf");
System.out.println(a == b);  // False
System.out.println(a.equals(b)); // True

Çünkü ilk durumda a ve b nesneleri denilen bir şeyde tutulur literal poolve her ikisi de aynı nesneyi referans alır, böylece her iki şekilde de eşit olurlar.

Ancak ikinci durumda a ve b, başka herhangi bir nesneyi başlattığımız gibi farklı nesnelere başvurur. bu yüzden ==operatörle karşılaştırıldığında eşit değildirler, oysa değerler eşittir.


18

String, JLS'de özel bir işlem görür: değişmezlerin bulunduğu ilkel olmayan iki türden biridir (diğeri Class) * .

Gönderen JLS :

Dize değişmezi, String [...] sınıfının bir örneğine başvurudur.

* iyi, "null literal " ile de "null tip" var null, ama çoğu insan "null tip" i uygun bir tip olarak düşünmüyor.


1
Ayrıca "null türü" Java uygun bir tür farkında değildi. Çok yararlı bilgiler, yazı tipi boyutunu artırmalısınız.
Grijesh Chauhan

1
@GrijeshChauhan: "boş tip" nullherhangi bir referans tipi değişkene atanmasına izin vermek için sadece şık bir ifadedir . Aksi halde ilginç bir tür değil.
Joachim Sauer

15

Java dilinin bir özelliği. Kaynak koddaki dize değişmezlerine özel işlem uygulanır.

Dil spesifikasyonu burada basit bir dize değişmezinin Stringtür olduğunu söylüyor


5

Çift tırnak içindeki metin değişmez bir Stringnesne oluşturur .

String myString = "Some text";

Yukarıdaki kod String, çift tırnak kullanarak bir nesne oluşturur .


4

Dizeler genellikle bir programlama dilinde kullanılır. Java nesne yönelimli olduğundan, bir dize bir nesnedir. Hantal yeni String ("someString") önlemek için; bir dize nesnesine ihtiyacınız olan her ifade java, dize değişmezini kullanarak bir dize nesnesi oluşturmanıza olanak sağlar.

Ama dize eşitliğini aklınızda bulundurmalısınız. Burada ne demek istediğimi göstermek için kısa bir JUnit testi.

    @Test
    public void stringTest() {
       // a string literal and a string object created 
       // with the same literal are equal
       assertEquals("string", new String("string"));

       // two string literals are the same string object
       assertSame("string", "string"); 

       // a string literal is not the same object instance 
       // as a string object created with the same string literal
       assertFalse("string" == new String("string"));

       // java's String.intern() method gives you the same
       // string object reference for all strings that are equal.
       assertSame("string", new String("string").intern());
    }

Bir dizeyi yalnızca ile new String(String src)başlatabilseydiniz, kurucuya bir dizgi değişmezi bile veremezdiniz . Dizeyi oluşturmak char []için String(char [] src)a'yı başlatmanız ve sonra da yapıcıyı kullanmanız veya dizeyi bir dosyadan okumanız gerekir.
AJMansfield

Bu doğru değil. Dize değişmezi, kaynak dosyadaki yalnızca çift tırnaklarla çevrelenmiş bir karakter dizisidir. Java, bu değişmez değeri kullanarak otomatik olarak bir dize örneği oluşturur. Bundan sonra bir değişmez değer ve bir String nesnesi eşittir, ancak bunlar aynı değildir. Java da yeni String ("") kullanmanız gerektiği şekilde bu şekilde uygulanabilir; Bir String nesnesini somutlaştırmak, ancak bu sadece hayatımızı daha zor hale getirir. Bu nedenle, yeni String ("bir dize") yazdığınızda java, "bir dize" hazır bilgisi için bir String nesnesi oluşturur ve bu dize nesnesini yeni String'in sıkıştırıcısına iletir.
René Link

2

Sadece bahsetmek gerekirse. Dize değişmezi, şöyle bir kod yazabileceğiniz String dizesinin bir örneğine başvurudır:

 "Abc" .getBytes ();

 "A: b: c", .split ( ":");

 "愛" .codePointAt (0);

2

- String, Java'daki bir sınıftır . Bu konuda haklısınız, böylece her zaman newanahtar kelimeyle başlatabiliriz .

- Ama böyle bir şey yaptığımızda:

String s = "";

Yukarıdaki açıklamada işaretlenir derleyici bir olmaya özel String nesnesi sonra ve yükleme sırasında JVM , (yükleme başlatma önce yapılır) sınıfının olarak bilinen bunu görür dize bir depolanır, düz dize havuzu .

- Böylece new(), ""yöntem kullanılarak ve yöntem kullanılarak bir String oluşturulabilir , ancak ikincisi, dize değişmez havuzundan bir referansa sahip olduğu için, o dize nesnesine hiç başvuru olmasa bile öbekte kalan bir dize değişmezi sağlar.


2

Java bizim için iki aşamalı bir işlem yapıyor.

String str = "hello";

eşittir

char data[] = {'h', 'e', 'l' , 'l', 'o'};
String str = new String(data);

[.NET] [1] de benzer bir şeye sahipti.

String(Char[]) constructor

yapar

String(char[] value)

Referans ekleme: -


2
Açıkladığınız işlem Java'nın gerçekte yaptığı şey değildir: Diğerleri daha önce de belirtildiği gibi "hello", bir dize değişmezidir ve derleyici tarafından sabit havuza konur, bkz. JLS §3.10.5 ve JVMS §5.1 .
siegi

1

Java.lang.Stringsadece bir sınıf değil. Çekirdek dilin ayrılmaz bir parçası. Derleyici bunun için sözdizimsel şekere sahiptir. Örneğin, ""bir kısaltma gibidir new String(""). Yazıldığında "", derleyici yerden tasarruf etmek için aynı dizeleri aynı örneğe göre optimize eder."a" + 5 == "a5" ==> true

Derleyici, nesne sürümleri ve yerel türleri arasında kutu / kutu açmak zorunda kalmamak dahil olmak üzere birçok şey için sözdizimsel şekere sahiptir, hiçbir ana araç Nesne, varsayılan oluşturucu, ...


5
""için bir kısaltma değildir new String(""). Kullanırsanız "", yapılacak ilk şey JVM'nin String havuzunda eşleşmeleri aramaktır ve bu doğruysa, o String'i döndürür. Kullanarak new String(""), String'in kendisi zaten String havuzunda olsa bile her zaman yeni bir String oluşturacaksınız (çünkü String havuzunda depolanmayacaktır).
g00glen00b

Cevabımı güncelledim. İnsanlar bunu Lisp sembol türüne eşdeğer gibi dize sabitleri kullanmak gibi kendi yararlarına kullanıyor mu?
Sylwester
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.