Perbedaan antara String Java null dan kosong ("")

151

Apa perbedaan antara nulldan ""(string kosong)?

Saya telah menulis beberapa kode sederhana:

String a = "";
String b = null;

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

Kedua pernyataan kembali false. Sepertinya, saya tidak dapat menemukan apa perbedaan yang sebenarnya di antara mereka.

Vikas Patidar
sumber
6
Bandingkan dengan b.equals(a)- tetapi jangan gunakan ==untuk membandingkan string karena "tidak akan berfungsi" dengan cara lain. The nullvalue (yang berbeda dari string kosong "", contoh String valid) dapat tidak pernah memiliki metode dipanggil atasnya. Menempatkan "dikenal non-null" (biasanya nilai konstan atau literal) ke sisi kiri kesetaraan adalah "Yoda conditional" atau semacamnya.

Jawaban:

220

"" adalah string yang sebenarnya, meskipun yang kosong.

null, bagaimanapun, berarti bahwa variabel String menunjuk ke nol.

a==b mengembalikan false karena "" dan null tidak menempati ruang yang sama dalam memori - dengan kata lain, variabel mereka tidak menunjuk ke objek yang sama.

a.equals(b) mengembalikan false karena "" tidak sama dengan nol, jelas.

Perbedaannya adalah karena "" merupakan string yang sebenarnya, Anda masih dapat memanggil metode atau fungsi seperti itu

a.length()

a.substring(0, 1)

dan seterusnya.

Jika String sama dengan nol, seperti b, Java akan melempar NullPointerExceptionjika Anda mencoba memohon, katakan:

b.length()


Jika perbedaan yang Anda tanyakan adalah == versus sama, inilah ini:

== membandingkan referensi, seperti jika saya pergi

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

Itu akan menghasilkan false karena saya mengalokasikan dua objek yang berbeda, dan a dan b menunjuk ke objek yang berbeda.

Namun, a.equals(b)dalam hal ini akan mengembalikan true, karena equalsuntuk Strings akan mengembalikan true jika dan hanya jika argumen String tidak nol dan mewakili urutan karakter yang sama.

Namun, berhati-hatilah bahwa Jawa memiliki kasus khusus untuk Strings.

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

Anda akan berpikir bahwa outputnya adalah false, karena seharusnya mengalokasikan dua String yang berbeda. Sebenarnya, Java akan menginternir String literal (yang diinisialisasi seperti a dan b dalam contoh kita). Jadi hati-hati, karena itu bisa memberikan beberapa kesalahan positif tentang cara kerja ==.

Zach L
sumber
Apakah ini juga berlaku untuk C #? Seperti dalam array "" adalah {'\ 0'}, null
Cole Johnson
3
Tautan tentang interntelah kedaluwarsa. Anda dapat merujuk ke situs lain untuk membacanya: weblogs.java.net/blog/enicholas/archive/2006/06/…
Alston
Jadi, jika saya memiliki String nol String a = nulldan kemudian saya menambahkannya seperti String a+= "example", ketika saya mencetaknya, mengapa ditampilkan nullexamplejika null bukan String?
cpinamtz
@PinaGamer JavaScript memungkinkan menambahkan non-string ke string. "num: " + 20memberi Anda string "num: 20". Apakah ini berarti itu 20adalah sebuah string? (bukan, 20adalah angka). Kasus yang sama untuk null: ini bukan string, tetapi dapat dikonversi menjadi satu jika Anda mencoba menambahkannya.
daboross
@ Zak L: ketika String s = null + "a"; itu memberikan output nulla tetapi null.concat ("a") itu memberikan pengecualian pointer nol. apa alasan dalam kasus pertama saya null + "a"; sedang bekerja.
Ved Prakash
249

Anda juga dapat memahami perbedaan antara null dan string kosong dengan cara ini:

Perbedaan antara null dan 0 / string kosong

Gambar asli oleh R. Sato ( @raysato )

mikiqex
sumber
7
Ini bagus! Saya sedang menjelaskan nol vs kosong kepada seseorang dan terjadi atas jawaban Anda. Konsepnya langsung diklik untuk mereka.
matt.fc
14

String adalah Obyek dan bisa null

null berarti Objek String tidak dipakai

"" adalah nilai aktual dari String Objek yang dipakai seperti "aaa"

Berikut ini tautan yang mungkin menjelaskan titik itu http://download.oracle.com/javase/tutorial/java/concepts/object.html

Aba Dov
sumber
"null berarti Objek String tidak dipakai" - terima kasih! itu membantu saya untuk memahami banyak hal. saya bisa menggunakan pernyataan if pada objek MediaPlayer sekali, dan itu berhasil menggunakan null, untuk memeriksa apakah itu berjalan atau tidak (dengan metode untuk mengeksekusi jika itu), tetapi saya tidak pernah mengerti mengapa itu bekerja, tapi sekarang saya melihat apa yang dikatakannya, saya sedang memeriksa apakah MediaPlayer telah dipakai atau tidak, dengan menggunakan null ... misalnya if (mp==null){do something}.
Azurespot
12

Apa yang dikatakan pernyataan Anda hanya "" tidak sama dengan nol - yang benar. "" adalah string kosong; null berarti tidak ada nilai yang diberikan.

Mungkin lebih mencerahkan untuk mencoba:

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

"" masih berupa string, artinya Anda dapat memanggil metode dan mendapatkan informasi yang bermakna. null adalah variabel kosong - benar-benar tidak ada di sana.

Arkaaito
sumber
9

Ada perbedaan yang cukup signifikan antara keduanya. String kosong ""adalah "string yang tidak memiliki karakter di dalamnya." Ini adalah string aktual yang memiliki panjang yang jelas. Semua operasi string standar didefinisikan dengan baik pada string kosong - Anda dapat mengubahnya menjadi huruf kecil, mencari indeks beberapa karakter di dalamnya, dll. String nol nulladalah "tidak ada string sama sekali." Tidak memiliki panjang karena itu bukan string sama sekali. Mencoba menerapkan operasi string standar apa pun ke string nol akan menyebabkan NullPointerExceptionsaat runtime.

templatetypedef
sumber
9

di sini a is an Objecttapi b(null)ini tidak Obyek itu adalah referensi null

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

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

ini jawaban saya yang serupa

Komunitas
sumber
1
Keduanya adan bmerupakan referensi. aadalah referensi dengan objek instantiated. badalah referensi tanpa objek instantiated (karenanya istilah "referensi nol").
HANYA SAYA PENDAPAT benar
Saya melawan tindakan -1 ;-) Tapi itu akan membantu untuk memperjelas jawaban ini dan mendiskusikan perbedaan antara "suatu objek" dan nullnilai dan perbedaan antara objek dan variabel.
@ terima kasih :) Saya menjawabnya dengan hati karena inilah jawaban saya yang lain yang mirip dengan pertanyaan ini stackoverflow.com/questions/4459623/...
8

null berarti nama tersebut tidak merujuk objek apa pun yang dipakai. "" berarti string kosong.

Di sini a mereferensikan beberapa objek yang kebetulan berupa string kosong. b tidak mereferensikan objek apa pun karena null.

Shamim Hafiz
sumber
5

Di Jawa jenis referensi yang diberikan tidaknull memiliki nilai sama sekali . Sebuah string yang ditugaskan ""memiliki nilai: string kosong, yang berarti string tanpa karakter di dalamnya. Ketika variabel ditugaskan nullitu berarti tidak ada objek yang mendasari jenis, string atau sebaliknya.

HANYA PENDAPAT SAYA yang benar
sumber
4

"" dan null keduanya berbeda. yang pertama berarti sebagai bagian dari deklarasi variabel string konstanta string telah dibuat dalam kumpulan string dan beberapa memori telah ditetapkan untuk hal yang sama.

Tetapi ketika kita mendeklarasikannya dengan null maka itu baru saja dipakai jvm, tetapi tidak ada memori yang dialokasikan untuk itu. oleh karena itu jika Anda mencoba mengakses objek ini dengan memeriksanya dengan "" - variabel kosong, itu tidak dapat mencegah nullpointerexception. Silakan temukan di bawah ini satu use case.

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());
    }
}

}

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

String s = null;
s.length();

Referensi ke string kosong ""menunjuk ke objek di heap - sehingga Anda dapat memanggil metode di atasnya.

Tetapi referensi yang menunjuk ke nulltidak memiliki objek untuk menunjuk di tumpukan dan dengan demikian Anda akan mendapatkan NullPointerException.

Mukesh Kumar
sumber
1

String kosong berbeda dari referensi nol karena dalam bahasa pemrograman berorientasi objek referensi nol ke tipe string tidak menunjuk ke objek string dan akan menyebabkan kesalahan adalah salah satu yang mencoba melakukan operasi di atasnya. String kosong masih berupa string tempat operasi string dapat dilakukan.

Dari artikel wikipedia pada string kosong .

weltraumpirat
sumber
1

String s=null;

String tidak diinisialisasi untuk null. jika ada operasi string yang mencoba itu dapat membuang pengecualian null pointer

String t="null";

Ini adalah string literal dengan nilai string "null" sama seperti t = "xyz". Itu tidak akan membuang pointer nol.

String u="";

Ini sebagai string kosong, Ini tidak akan membuang pointer nol.

Bharat Kasodariya
sumber
0

String dapat kosong atau memiliki nullnilai. Jika sebuah string null, itu tidak merujuk pada apa pun di memori. Coba s.length()>0. Ini karena jika sebuah string kosong, ia masih mengembalikan panjang 0. Jadi, jika Anda tidak memasukkan apa pun untuk yang sama, maka ia akan terus melanjutkan perulangan karena tidak mendaftarkan string sebagai null. Sedangkan jika Anda memeriksa panjang, maka itu akan keluar dari lingkaran itu.

Bibiana
sumber
0

Konsep ini dapat lebih dipahami dari matematika. Pernahkah Anda mencoba membagi angka (bukan nol) dengan 0 menggunakan kalkulator misalnya 7/0? Anda akan mendapatkan hasil yang terlihat seperti sesuatu ini: undefined, not a number, nulldll Hal ini berarti bahwa operasi tidak mungkin, untuk beberapa alasan (mari kita meninggalkan alasan-alasan yang akan dibahas hari lain).

Sekarang, lakukan ini: 0/7. Anda akan mendapatkan output, 0. Ini berarti operasi itu mungkin dan dapat dieksekusi, tetapi Anda jawabannya hanya 0 karena tidak ada yang tersisa setelah pembagian. Ada output yang valid dan output itu nol.

Dalam contoh pertama, tidak hanya output yang tidak valid, operasi tidak mungkin dilakukan. Ini mirip dengan nullstring di java. Contoh kedua mirip dengan emptystring.


sumber
0

Ketika Anda menulis

String a = "";

Itu berarti ada variabel 'a' dari tipe string yang menunjuk ke referensi objek dalam kumpulan string yang memiliki nilai "". Karena variabel amemegang referensi objek string yang valid, semua metode string dapat diterapkan di sini.

Sedangkan saat Anda menulis

String b = null;

Ini berarti bahwa ada variabel btipe string yang menunjuk ke referensi yang tidak diketahui . Dan setiap operasi pada referensi yang tidak diketahui akan menghasilkan NullPointerException.

Sekarang, mari kita evaluasi ekspresi di bawah ini.

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
Neeraj Singh
sumber
0

Secara sederhana,

  • "" adalah String kosong

  • null adalah Variabel String kosong .

RoboAlex
sumber
0

Perbedaan antara string kosong & kosong. Misalnya: Anda memiliki variabel bernama x. Jika Anda menulis dalam JS,

var x = "";

ini berarti bahwa Anda telah menetapkan nilai string kosong (panjangnya 0). Sebenarnya ini seperti sesuatu tetapi yang tidak merasakan apa-apa :) Di sisi lain,

var y = null;

ini berarti Anda belum memberikan nilai pada y yang diucapkan dengan jelas dengan menuliskan null to y pada saat deklarasi. Jika Anda menulis y.length; itu akan melempar kesalahan yang menunjukkan bahwa tidak ada nilai yang ditetapkan untuk y dan sebagai hasilnya tidak dapat membaca panjang y.

RashedRahat
sumber
Pertanyaannya adalah untuk Jawa
Vega
0

masukkan deskripsi gambar di sini

Gambar ini dapat membantu Anda memahami perbedaan.

Gambar dikumpulkan dari ProgrammerHumor

Sazzad Hissain Khan
sumber
0

"Saya menyebutnya kesalahan miliaran dolar saya. Itu adalah penemuan referensi nol pada tahun 1965" - https://en.wikipedia.org/wiki/Tony_Hoare

Sehubungan dengan dunia nyata keduanya dapat dianggap sama. Itu hanya sintaks dari bahasa pemrograman yang menciptakan perbedaan antara dua seperti yang dijelaskan oleh orang lain di sini. Ini hanya menciptakan overhead seperti ketika memeriksa / membandingkan apakah variabel string memiliki sesuatu, Anda harus terlebih dahulu memeriksa apakah itu bukan nol dan kemudian string aktual membandingkan yaitu dua perbandingan. Ini adalah pemborosan daya pemrosesan untuk setiap perbandingan string.

Objects.equals () memeriksa null sebelum memanggil .equals ().

Shivakumar
sumber
0

sebagai rasa ingin tahu

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

     s1 = s1 + s2;
   

    System.out.println((s); // nullhello
Duracell De Monaco
sumber