Dize, tıpkı diğerleri gibi bir sınıfsa, çift tırnak işaretleri kullanılarak nasıl başlatılabilir?
java.lang.StringJava Dili için özel bir muamele var.
Dize, tıpkı diğerleri gibi bir sınıfsa, çift tırnak işaretleri kullanılarak nasıl başlatılabilir?
java.lang.StringJava Dili için özel bir muamele var.
Yanıtlar:
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

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.
Java, String'i özel bir sınıf olarak ele alır, her iki şekilde de başlatabilirsiniz
Doğrudan hazır bilgi atama
String a = "adsasdf";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.
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.
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.
Ç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 .
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());
}
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.
- 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.
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: -
"hello", bir dize değişmezidir ve derleyici tarafından sabit havuza konur, bkz. JLS §3.10.5 ve JVMS §5.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, ...
""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).
" "zaten bir String!