Boş ve boş (“”) Java Dizesi arasındaki fark


151

nullVe ""(boş dize) arasındaki fark nedir ?

Bazı basit kodlar yazdım:

String a = "";
String b = null;

System.out.println(a == b); // false
System.out.println(a.equals(b)); // false

Her iki ifade de geri döner false. Görünüşe göre, aralarındaki gerçek farkın ne olduğunu bulamıyorum.


6
İle karşılaştır b.equals(a)- ancak ==başka yollarla "işe yaramaz" olarak karşılaştırmak için kullanmayın . null(Boş bir dize farklıdır değeri "", geçerli bir String örneği) olabilir asla bunun üzerine çağrılan bir yöntem var. Eşitliğin sol tarafına "bilinen null olmayan" (genellikle sabit bir değer veya değişmez) yerleştirmek "Yoda koşullu" ya da bazılarına benzer.

Yanıtlar:


220

"", boş da olsa gerçek bir dizedir.

null ise, String değişkeninin hiçbir şeye işaret etmediği anlamına gelir.

a==b "" ve null bellekte aynı alanı işgal etmediği için yanlış döndürür - başka bir deyişle, değişkenleri aynı nesnelere işaret etmez.

a.equals(b) "", null değerine eşit olmadığı için yanlış döndürür.

Aradaki fark, "" gerçek bir dize olduğundan, üzerindeki yöntemleri veya işlevleri şu şekilde çağırabilirsiniz:

a.length()

a.substring(0, 1)

ve bunun gibi.

Dize, b gibi null değerine eşitse, NullPointerExceptionçağırmayı denerseniz Java bir atar :

b.length()


Merak ettiğiniz fark == veya eşittir ise, bu şudur:

== referansları karşılaştırır, tıpkı gittim gibi

String a = new String("");
String b = new String("");
System.out.println(a==b);

İki farklı nesne tahsis ettiğim için yanlış çıktı ve a ve b farklı nesnelere işaret ettim.

Ancak, a.equals(b)bu durumda equalstrue değerini döndürür , çünkü Dizeler için yalnızca ve yalnızca String değişkeni boş değilse ve aynı karakter sırasını temsil ediyorsa true değerini döndürür .

Bununla birlikte, Java'nın Dizeler için özel bir durumu olduğu konusunda uyarılmalıdır.

String a = "abc";
String b = "abc";
System.out.println(a==b);

Çıktının falseiki farklı Dize ayırması gerektiği için olacağını düşünürdünüz . Aslında, Java sabit dizeleri staj yapar (örneğimizde a ve b gibi başlatılanlar). Bu yüzden dikkatli olun, çünkü bu == 'ın nasıl çalıştığı hakkında bazı yanlış pozitifler verebilir.


Bu C # için de geçerli mi? "" Dizisinde olduğu gibi {'\ 0'}, boş
Cole Johnson

3
İle ilgili bağlantının internsüresi doldu. Okumak için başka bir siteye başvurabilirsiniz
Alston

Ben dize null var ise, String a = nullo zaman ben eklemek neye String a+= "example"bunu yazdırırken, neden ekran gelmez, nullexampleboş bir dize değilse?
cpinamtz

@PinaGamer JavaScript, dizelere dize eklenmemesine izin verir. "num: " + 20size dizeyi verir "num: 20". Bu 20bir dize anlamına mı geliyor ? (değil, 20bir sayıdır). Aynı durum null: bu bir dize değildir, ancak eklemeye çalışırsanız bir dizeye dönüştürülebilir.
daboross

@Zach L: String s = null + "a" olduğunda; nulla çıktısını verir ama null.concat ("a") null işaretçi istisnasını verir. ilk durumumdaki nedenin null + "a"; çalışıyor.
Ved Prakash

249

Boş ve boş bir dize arasındaki farkı şu şekilde de anlayabilirsiniz:

Boş ve 0 / boş dize arasındaki fark

Orijinal görüntü R. Sato ( @raysato )


7
Bu harika! Birine null vs blank açıklıyordum ve cevabın üzerine oldu. Konsept hemen onlara tıkladı.
matt.fc

14

String bir Nesnedir ve boş olabilir

null, String Nesnesinin somutlaştırılmadığı anlamına gelir

"", örneklenen Nesne Dizesinin "aaa" gibi gerçek bir değeridir

İşte bu noktayı açıklığa kavuşturabilecek bir bağlantı http://download.oracle.com/javase/tutorial/java/concepts/object.html


"null, String Nesnesinin somutlaştırılmadığı anlamına gelir" - teşekkür ederim! bu, şeyleri çok iyi anlamama yardımcı oluyor. bir kez bir MediaPlayer nesnesi üzerinde bir if ifadesi kullanabildi ve null, çalışıp çalışmadığını kontrol etmek için çalıştı (olsaydı yürütmek için bir yöntemle), ama neden işe yaramadı asla anlamadım, ama şimdi ne dediğini görüyorum, MediaPlayer'ın başlatılmış olup olmadığını, null kullanarak kontrol ediyordum ... örn if (mp==null){do something}.
Azurespot

12

İfadelerinizin size söylediği sadece "" null ile aynı değil - ki bu doğru. "" boş bir dizedir; null, hiçbir değerin atanmadığı anlamına gelir.

Denemek daha aydınlatıcı olabilir:

System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object

"" hala bir dizedir, yani yöntemlerini çağırabilir ve anlamlı bilgiler edinebilirsiniz. null boş bir değişkendir - tam anlamıyla hiçbir şey yoktur.


9

İkisi arasında oldukça önemli bir fark var. Boş dize "", "içinde karakter olmayan dize" dir. İyi tanımlanmış bir uzunluğa sahip gerçek bir dizedir. Standart dize işlemlerinin tümü boş dizede iyi tanımlanmıştır - küçük harfe dönüştürebilir, içindeki bazı karakterlerin dizinine bakabilirsiniz, vb. Boş dize null"hiç dize yok" dur. Uzunluğu yok çünkü bir dize değil. Boş dizeye herhangi bir standart dize işlemi uygulamayı denemek NullPointerExceptionçalışma zamanında neden olur .


9

Buraya a is an Objectancak b(null)bir değil bir nesne bir boş referanstır

System.out.println(a instanceof Object); // true

System.out.println(b instanceof Object); // false

işte benzer cevabım


1
Her ikisi de ave breferanslardır. asomutlaştırılmış bir nesneye sahip bir referanstır. b"Örnek", somutlaştırılmış bir nesnesi olmayan bir referanstır (dolayısıyla "null referans" terimi).
SADECE benim doğru GÖRÜŞÜM

-1 ;-) karşı davrandım Ama bu cevabı açıklığa kavuşturmak ve "bir nesne" ile nulldeğer ve nesneler ve değişkenler arasındaki farkı tartışmak yardımcı olacaktır .

@pst thanks :) Kalbiyle cevapladım çünkü işte bu soruya benzer başka bir cevabım stackoverflow.com/questions/4459623/…

8

null , adın herhangi bir somut nesneye başvurmadığı anlamına gelir. "" boş bir dize anlamına gelir.

Burada a , boş bir dize olan bazı nesnelere başvuruyor. b boş olduğu için hiçbir nesneye başvurmuyor.


5

Java'da atanan başvuru türü nullvardır hiç hiçbir değer . Atanan bir dizenin ""bir değeri vardır: boş karakter, içinde karakter olmayan bir dize. Bir değişken atandığında null, herhangi bir tür, dize veya başka bir şekilde altta yatan bir nesne olmadığı anlamına gelir.


4

"" ve null değerlerinin ikisi de farklı. ilki, dize değişkeni bildiriminin bir parçası olarak dize sabitinin dize havuzunda oluşturulduğu ve bunun için bir miktar bellek atandığı anlamına gelir.

Ancak null ile bildirirken, o zaman jvm başlatıldı, ancak bunun için herhangi bir bellek tahsis edilmedi. bu nedenle bu nesneye "" - blank değişkeni ile kontrol ederek erişmeye çalışıyorsanız , nullpointerexception önlenemez. Lütfen aşağıda bir kullanım durumu bulabilirsiniz.

public class StringCheck {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    String s1 = "siddhartha";
    String s2 = "";
    String s3 = null;

    System.out.println("length s1 ="+s1.length());
    System.out.println("length s2 ="+s2.length());

    //this piece of code will still throw nullpointerexception . 
    if(s3 != ""){
        System.out.println("length s3 ="+s3.length());
    }
}

}


4
String s = "";
s.length();

String s = null;
s.length();

Boş bir dizeye yapılan başvuru "", öbekteki bir nesneyi işaret eder; böylece üzerindeki yöntemleri çağırabilirsiniz.

Ancak, işaret eden bir referansın nullyığın içinde gösterecek hiçbir nesnesi yoktur ve böylece bir NullPointerException.


1

Boş dize, bir null referansından farklıdır, çünkü nesne yönelimli bir programlama dilinde, bir dize türüne bir null referans, bir dize nesnesini göstermez ve bir hata üzerinde herhangi bir işlem gerçekleştirmeye çalışmak için bir hataya neden olur. Boş dize, hala dize işlemlerinin denenebileceği bir dizedir.

Boş dize hakkındaki wikipedia makalesinden .


1

String s=null;

Dize null için başlatılmadı. herhangi bir dize işlemi denediyse boş gösterici istisnası atabilir

String t="null";

T = "xyz" ile aynı "null" değer dizesine sahip bir dize değişmezidir. Boş gösterici atmaz.

String u="";

Boş dize, boş gösterici atmayacak.


0

Bir dize boş olabilir veya bir nulldeğeri olabilir. Bir dize ise null, bellekteki hiçbir şeye gönderme yapmaz. Deneyin s.length()>0. Bunun nedeni, bir dize boşsa, yine de 0 uzunluğunu döndürür. Dolayısıyla, aynı şey için hiçbir şey girmezseniz, dizeyi olarak kaydetmediği için döngü devam eder null. Oysa uzunluğu kontrol ederseniz, döngüden çıkar.


0

Bu kavram matematikten daha iyi anlaşılabilir. Hiç bir hesap makinesi kullanarak bir sayıyı (sıfır değil) 0'a bölmeyi denediniz mi, örneğin 7/0? Sen bakışlar şey böyle bir sonuç elde edecektir: undefined, not a number,null vb operasyon bazı nedenlerden dolayı imkansız olduğu bu araçlarla (let yeni bir gün tartışılacak bu sebepleri bırakın).

Şimdi şunu yapın: 0/7. Çıktı, 0 alırsınız. Bu, işlemin mümkün olduğu ve yürütülebileceği anlamına gelir, ancak bölünmeden sonra hiçbir şey kalmadığından yanıt sadece 0'dır. Geçerli bir çıktı var ve bu çıktı sıfır.

İlk örnekte, yalnızca çıktı geçersiz olmakla kalmadı, işlemin yürütülmesi de mümkün değildi. Bu nulljava dize benzer . İkinci örnek emptydizeye benzer .


0

Yazdığın zaman

String a = "";

Dize havuzunda "" değerine sahip bir nesne başvurusuna işaret eden türdeki 'a' değişkeninin olduğu anlamına gelir. Değişken ageçerli bir dize nesnesi başvurusu barındırdığından, tüm dize yöntemleri burada uygulanabilir.

Halbuki yazarken

String b = null;

Bilinmeyen bir referansıb işaret eden bir tür dize değişkeni olduğu anlamına gelir . Ve bilinmeyen referanstaki herhangi bir işlem bir .NullPointerException

Şimdi aşağıdaki ifadeleri değerlendirelim.

System.out.println(a == b); // false. because a and b both points to different object reference

System.out.println(a.equals(b)); // false, because the values at object reference pointed by a and b do not match.

System.out.println(b.equals(a)); // NullPointerException, because b is pointing to unknown reference and no operation is allowed

0

Basit bir ifadeyle,

  • "" boş bir Dize

  • null boş bir String Değişkeni'dir .


0

Boş ve boş dize arasındaki fark. Örneğin: x adında bir değişkeniniz var. JS'de yazarsanız,

var x = "";

bu, boş dize (uzunluk 0'dır) bir değer atadığınız anlamına gelir. Aslında bu bir şey gibidir ama hiçbir şey hissetmez :) Öte yandan,

var y = null;

bu, bildirim sırasında y'ye null yazarak açıkça söylenen bir değer atamadığınız anlamına gelir. Y.length yazarsanız; y'ye atanmış hiçbir değerin olmadığını ve sonuç olarak y'nin uzunluğunu okuyamayacağını belirten bir hata atar.


Soru Java için
Vega


0

"Buna milyar dolarlık hatam diyorum. 1965'teki boş referansın icadıydı" - https://en.wikipedia.org/wiki/Tony_Hoare

Gerçek dünya ile ilgili olarak her ikisi de aynı kabul edilebilir. Bu sadece burada başkaları tarafından açıklandığı gibi iki arasında bir fark yaratan bir programlama dilinin sözdizimidir. Bu basitçe dize değişkeninin bir şey olup olmadığını kontrol ederken / karşılaştırırken ek yük oluşturur, ilk önce null olup olmadığını kontrol etmelisiniz ve daha sonra iki karşılaştırmayı karşılaştırarak gerçek dizeyi kontrol etmelisiniz. Bu, her string karşılaştırması için işlem gücü kaybıdır.

Objects.equals (), .equals () öğesini çağırmadan önce null olup olmadığını kontrol eder.


0

bir merak olarak

    String s1 = null;
    String s2 = "hello";

     s1 = s1 + s2;
   

    System.out.println((s); // nullhello
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.