Sự khác biệt giữa Chuỗi Java rỗng và rỗng (phiên bản)


151

Sự khác biệt giữa null""(chuỗi trống) là gì?

Tôi đã viết một số mã đơn giản:

String a = "";
String b = null;

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

Cả hai tuyên bố trở lại false. Dường như, tôi không thể tìm thấy sự khác biệt thực sự giữa chúng là gì.


6
So sánh với b.equals(a)- nhưng không sử dụng ==để so sánh chuỗi là "nó sẽ không hoạt động" theo những cách khác. Các nullgiá trị (đó là khác biệt so với một chuỗi rỗng "", một String dụ hợp lệ) có thể không bao giờ có một phương pháp gọi theo nó. Đặt "đã biết không null" (thường là giá trị không đổi hoặc bằng chữ) vào bên trái của đẳng thức là "Yoda có điều kiện" hoặc một số tương tự.

Câu trả lời:


220

"" là một chuỗi thực tế, mặc dù là một chuỗi trống.

null, tuy nhiên, có nghĩa là biến String chỉ vào không có gì.

a==b trả về false vì "" và null không chiếm cùng một không gian trong bộ nhớ - nói cách khác, các biến của chúng không trỏ đến cùng một đối tượng.

a.equals(b) trả về false vì "" không bằng null, rõ ràng.

Sự khác biệt là mặc dù "" là một chuỗi thực tế, bạn vẫn có thể gọi các phương thức hoặc hàm trên nó như

a.length()

a.substring(0, 1)

và như thế.

Nếu Chuỗi bằng null, như b, Java sẽ ném a NullPointerExceptionnếu bạn đã thử gọi, nói:

b.length()


Nếu sự khác biệt bạn đang tự hỏi là == so với bằng, thì đây là:

== so sánh các tài liệu tham khảo, như nếu tôi đã đi

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

Điều đó sẽ xuất sai vì tôi đã phân bổ hai đối tượng khác nhau và điểm a và b cho các đối tượng khác nhau.

Tuy nhiên, a.equals(b)trong trường hợp này sẽ trả về true, vì equalsđối với String sẽ trả về true khi và chỉ khi String đối số không null và biểu thị cùng một chuỗi ký tự.

Tuy nhiên, được cảnh báo rằng Java có trường hợp đặc biệt cho Chuỗi.

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

Bạn sẽ nghĩ rằng đầu ra sẽ là false, vì nó sẽ phân bổ hai Chuỗi khác nhau. Trên thực tế, Java sẽ thực hiện các chuỗi ký tự (các chuỗi được khởi tạo như a và b trong ví dụ của chúng tôi). Vì vậy, hãy cẩn thận, bởi vì điều đó có thể đưa ra một số tích cực sai về cách thức == hoạt động.


Điều này cũng áp dụng cho C #? Như trong mảng của "" là {'\ 0'}, null
Cole Johnson

3
Các liên kết về internđã hết hạn. Bạn có thể tham khảo một trang web khác để đọc về nó: weblogs.java.net/blog/enicholas/archive/2006/06/ Kẻ
Alston

Vì vậy, nếu tôi có Chuỗi rỗng String a = nullvà sau đó tôi nối thêm Chuỗi đó a+= "example", khi tôi in, tại sao hiển thị nullexamplenếu null không phải là Chuỗi?
cpinamtz

@PinaGamer JavaScript cho phép thêm các chuỗi không vào chuỗi. "num: " + 20cung cấp cho bạn chuỗi "num: 20". Điều này có nghĩa 20là một chuỗi? (không phải, 20là một con số). Trường hợp tương tự cho null: nó không phải là một chuỗi, nhưng nó có thể được chuyển đổi thành một chuỗi nếu bạn cố gắng thêm nó.
daboross

@Zach L: khi Chuỗi s = null + "a"; nó cung cấp đầu ra nulla nhưng null.concat ("a") nó cung cấp ngoại lệ con trỏ null. lý do trong trường hợp đầu tiên của tôi null + "a"; đang làm việc.
Ved Prakash

249

Bạn cũng có thể hiểu sự khác biệt giữa null và một chuỗi rỗng theo cách này:

Sự khác biệt giữa null và 0 / chuỗi rỗng

Ảnh gốc của R. Sato ( @raysato )


7
Điều đó thật tuyệt! Tôi đã giải thích null vs trống cho ai đó và đã xảy ra khi câu trả lời của bạn. Khái niệm ngay lập tức nhấp cho họ.
matt.fc

14

Chuỗi là một đối tượng và có thể là null

null có nghĩa là Đối tượng chuỗi không được khởi tạo

"" là một giá trị thực tế của Chuỗi đối tượng được khởi tạo như "aaa"

Đây là một liên kết có thể làm rõ điểm đó http://doad.oracle.com/javase/tutorial/java/con accept / object.html


"null có nghĩa là Đối tượng chuỗi không được khởi tạo" - cảm ơn bạn! Điều đó giúp tôi hiểu mọi thứ rất nhiều. tôi đã có thể sử dụng câu lệnh if trên đối tượng MediaPlayer một lần và nó hoạt động để sử dụng null, để kiểm tra xem nó có chạy hay không (với một phương thức để thực thi nếu có), nhưng tôi chưa bao giờ hiểu tại sao nó hoạt động, nhưng bây giờ Tôi thấy những gì nó đang nói, tôi đã kiểm tra xem MediaPlayer có được khởi tạo hay không, bằng cách sử dụng null ... ví dụ if (mp==null){do something}.
Azurespot

12

Những gì báo cáo của bạn nói với bạn chỉ là "" không giống như null - đó là sự thật. "" là một chuỗi rỗng; null có nghĩa là không có giá trị đã được chỉ định.

Có thể sẽ giác ngộ hơn khi thử:

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

"" Vẫn là một chuỗi, có nghĩa là bạn có thể gọi các phương thức của nó và nhận thông tin có ý nghĩa. null là một biến rỗng - thực sự không có gì ở đó.


9

Có một sự khác biệt khá đáng kể giữa hai. Chuỗi rỗng ""là "chuỗi không có ký tự trong đó." Đó là một chuỗi thực tế có độ dài được xác định rõ. Tất cả các hoạt động chuỗi tiêu chuẩn được xác định rõ trên chuỗi trống - bạn có thể chuyển đổi nó thành chữ thường, tra cứu chỉ mục của một số ký tự trong đó, v.v. Chuỗi null nulllà "không có chuỗi nào cả". Nó không có độ dài vì nó hoàn toàn không phải là một chuỗi. Cố gắng áp dụng bất kỳ hoạt động chuỗi tiêu chuẩn nào cho chuỗi null sẽ gây ra NullPointerExceptionthời gian chạy.


9

ở đây a is an Objectnhưng b(null)không một đối tượng nó là một tham chiếu null

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

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

đây là câu trả lời tương tự của tôi


1
Cả hai ablà tài liệu tham khảo. alà một tài liệu tham khảo với một đối tượng khởi tạo. blà một tham chiếu không có đối tượng khởi tạo (do đó thuật ngữ "null tham chiếu").
CHỈ CẦN HOẠT ĐỘNG CỦA TÔI

Tôi đã hành động ngược lại -1 ;-) Nhưng nó sẽ giúp làm rõ câu trả lời này và thảo luận về sự khác biệt giữa "một đối tượng" và nullgiá trị và sự khác biệt giữa các đối tượng và các biến.

@pst cảm ơn :) Tôi đã trả lời nó bằng trái tim bởi vì đây là câu trả lời khác của tôi tương tự câu hỏi này stackoverflow.com/questions/4459623/

8

null có nghĩa là tên không tham chiếu bất kỳ đối tượng khởi tạo. "" Có nghĩa là một chuỗi rỗng.

Ở đây a đang tham chiếu một số đối tượng xảy ra là một chuỗi rỗng. b không tham chiếu bất kỳ đối tượng nào vì nó là null.


5

Trong Java một loại tài liệu tham khảo được phân công nullkhông có giá trị gì cả . Một chuỗi được gán ""có một giá trị: một chuỗi rỗng, nghĩa là một chuỗi không có ký tự trong đó. Khi một biến được gán, nullđiều đó có nghĩa là không có đối tượng cơ bản thuộc bất kỳ loại, chuỗi nào khác.


4

""null cả hai đều khác nhau. cái đầu tiên có nghĩa là một phần của khai báo biến chuỗi, hằng chuỗi đã được tạo trong nhóm chuỗi và một số bộ nhớ đã được gán cho cùng.

Nhưng khi chúng ta khai báo nó bằng null thì nó vừa được jvm khởi tạo, nhưng không có bộ nhớ nào được phân bổ cho nó. do đó, nếu bạn đang cố gắng truy cập đối tượng này bằng cách kiểm tra nó bằng "" - biến trống, nó không thể ngăn chặn nullpulumexception. Vui lòng tìm bên dưới một trường hợp sử dụng.

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

Tham chiếu đến một chuỗi rỗng ""trỏ đến một đối tượng trong heap - vì vậy bạn có thể gọi các phương thức trên nó.

Nhưng một tham chiếu trỏ đến nullkhông có đối tượng để chỉ trong heap và do đó bạn sẽ nhận được a NullPointerException.


1

Chuỗi rỗng khác với tham chiếu null ở ngôn ngữ lập trình hướng đối tượng, tham chiếu null đến loại chuỗi không trỏ đến đối tượng chuỗi và sẽ gây ra lỗi khi cố gắng thực hiện bất kỳ thao tác nào trên nó. Chuỗi trống vẫn là một chuỗi mà các hoạt động chuỗi có thể được thử.

Từ bài viết trên wikipedia về chuỗi rỗng .


1

String s=null;

Chuỗi không được khởi tạo cho null. nếu bất kỳ hoạt động chuỗi nào được thử, nó có thể ném ngoại lệ con trỏ null

String t="null";

Nó là một chuỗi ký tự có chuỗi giá trị "null" giống như t = "xyz". Nó sẽ không ném con trỏ null.

String u="";

Nó là một chuỗi rỗng, Nó sẽ không ném con trỏ null.


0

Một chuỗi có thể trống hoặc có một nullgiá trị. Nếu một chuỗi là null, nó không đề cập đến bất cứ điều gì trong bộ nhớ. Hãy thử s.length()>0. Điều này là do nếu một chuỗi trống, nó vẫn trả về độ dài bằng 0. Vì vậy, nếu bạn không nhập gì cho cùng một chuỗi, thì nó vẫn sẽ tiếp tục lặp vì nó không đăng ký chuỗi như null. Trong khi đó, nếu bạn kiểm tra độ dài, thì nó sẽ thoát ra khỏi vòng lặp của nó.


0

Khái niệm này có thể được hiểu rõ hơn từ toán học. Bạn đã bao giờ thử chia một số (không phải 0) cho 0 bằng máy tính, ví dụ 7/0 chưa? Bạn sẽ nhận được một kết quả mà trông giống như một cái gì đó này: undefined, not a number, nullvv Điều này có nghĩa rằng các hoạt động là không thể, đối với một số lý do (chúng ta hãy rời khỏi những lý do để được thảo luận một ngày khác).

Bây giờ, thực hiện điều này: 0/7. Bạn sẽ nhận được đầu ra, 0. Điều này có nghĩa là thao tác có thể và có thể được thực thi, nhưng câu trả lời của bạn chỉ là 0 vì không có gì còn lại sau khi chia. Có một đầu ra hợp lệ và đầu ra đó bằng không.

Trong ví dụ đầu tiên, không chỉ đầu ra không hợp lệ, thao tác không thể thực thi. Đây là giống như nullchuỗi trong java. Ví dụ thứ hai giống như emptychuỗi.


0

Khi bạn viết

String a = "";

Điều đó có nghĩa là có một biến 'a' của chuỗi kiểu trỏ đến tham chiếu đối tượng trong nhóm chuỗi có giá trị "". Do biến ađang giữ một tham chiếu đối tượng chuỗi hợp lệ, tất cả các phương thức của chuỗi có thể được áp dụng ở đây.

Trong khi bạn viết

String b = null;

Nó có nghĩa là có một biến bchuỗi kiểu chỉ đến một tham chiếu không xác định . Và bất kỳ hoạt động trên tham chiếu không xác định sẽ dẫn đến một NullPointerException.

Bây giờ, hãy để chúng tôi đánh giá các biểu thức dưới đây.

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

Nói một cách đơn giản,

  • "" là một chuỗi rỗng

  • null là một biến chuỗi rỗng .


0

Sự khác biệt giữa null & chuỗi rỗng. Ví dụ: bạn có một biến có tên x. Nếu bạn viết bằng JS,

var x = "";

điều này có nghĩa là bạn đã gán một giá trị là chuỗi rỗng (độ dài bằng 0). Trên thực tế điều này giống như một cái gì đó nhưng cảm giác không có gì :) Mặt khác,

var y = null;

điều này có nghĩa là bạn chưa gán giá trị cho y mà nói rõ ràng bằng cách viết null cho y tại thời điểm khai báo. Nếu bạn viết y.length; nó sẽ đưa ra một lỗi chỉ ra rằng không có giá trị nào được gán cho y và kết quả là không thể đọc được độ dài của y.


Câu hỏi dành cho Java
Vega


0

"Tôi gọi đó là sai lầm tỷ đô của tôi. Đó là phát minh của tài liệu tham khảo null năm 1965" - https://en.wikipedia.org/wiki/Tony_Hoare

Đối với thế giới thực cả hai có thể được giả định như nhau. Nó chỉ là một cú pháp của một ngôn ngữ lập trình tạo ra sự khác biệt giữa hai như được giải thích bởi những người khác ở đây. Điều này chỉ đơn giản là tạo ra chi phí như khi kiểm tra / so sánh xem biến chuỗi có gì không, trước tiên bạn phải kiểm tra xem nó có phải là null không và sau đó là chuỗi thực tế so sánh tức là hai so sánh. Đây là một sự lãng phí sức mạnh xử lý cho mọi so sánh chuỗi.

Object.equals () kiểm tra null trước khi gọi .equals ().


0

như một sự tò mò

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

     s1 = s1 + s2;
   

    System.out.println((s); // nullhello
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.