2011-01-26 190 views
104

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

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. Có vẻ như, tôi không thể tìm thấy sự khác biệt thực sự giữa chúng.

+5

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

Trả lời

175

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

null, có nghĩa là biến Chuỗi trỏ đến 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 0, hiển nhiên.

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

a.length()

a.substring(0, 1)

và vân vân.

Nếu String bằng null, như b, Java sẽ ném một NullPointerException nếu bạn đã cố gắng gọi, nói:

b.length()


Nếu sự khác biệt bạn đang phân vân về được == so bằng, nó này:

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

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

Điều đó sẽ xuất ra sai vì tôi đã phân bổ hai đối tượng khác nhau, và một đ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ở thành sự thật, bởi vì equals cho Strings sẽ trở lại đúng if and only if the argument String is not null and represents the same sequence of characters.

Được cảnh báo, mặc dù, rằng Java không có một trường hợp đặc biệt cho Strings.

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ẽ intern 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ì đó có thể cung cấp cho một số tích cực sai về cách == hoạt động.

+0

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

+3

Liên kết về 'intern' đã hết hạn. Bạn có thể tham khảo một trang khác để đọc về nó: https://weblogs.java.net/blog/enicholas/archive/2006/06/all_about_inter.html – Stallman

+0

Vì vậy, nếu tôi có một chuỗi rỗng 'String a = null' và sau đó tôi ** thêm vào ** nó một String giống như 'a + =" example "', khi tôi in nó, tại sao hiển thị 'nullexample' nếu null không phải là một String? – PinaGamer

7

đây a is an Object nhưng b(null)không một Object nó là một tham chiếu null

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

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

here is câu trả lời tương tự của tôi

+1

Cả hai 'a' và' b' là các tham chiếu. 'a' là một tham chiếu với một đối tượng instantiated. 'b' là một tham chiếu không có đối tượng instantiated (do đó thuật ngữ" null reference "). –

+0

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

+0

@pst vậy tại sao -1? :) –

13

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

rỗng 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 đối tượng String instantiated như "aaa"

Dưới đây là một liên kết mà có thể làm rõ rằng điểm http://download.oracle.com/javase/tutorial/java/concepts/object.html

+0

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

8

Có sự khác biệt khá lớn giữa hai người. Chuỗi trố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õ ràng trên chuỗi rỗ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 rỗng null là "không có chuỗi nào cả". Nó không có chiều dài bởi vì nó không phải là một chuỗi. Cố gắng áp dụng bất kỳ hoạt động chuỗi chuẩn nào vào chuỗi rỗng sẽ gây ra NullPointerException khi chạy.

10

Điều gì báo cáo của bạn cho bạn biết là "" không giống như null - điều đó đúng. "" là một chuỗi rỗng; null có nghĩa là không có giá trị nào được gán.

Nó có thể là làm sáng tỏ hơn để 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, nghĩa là bạn có thể gọi các phương thức của nó và nhận được thông tin có ý nghĩa. null là một biến trống - có nghĩa là không có gì ở đó.

4

Trong Java, loại tham chiếu được gán nullkhông có giá trị nào ở tất cả. Một chuỗi được gán "" có một giá trị: một chuỗi rỗng, là để nói một chuỗi không có ký tự trong đó. Khi một biến được gán null nó có nghĩa là không có đối tượng cơ bản của bất kỳ loại, chuỗi hoặc cách khác.

6

null có nghĩa là tên không đề cập đến bất kỳ đối tượng đã được khởi tạo nà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à chuỗi rỗng. b không tham chiếu bất kỳ đối tượng nào vì nó là rỗng.

1

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

Từ bài viết wikipedia trên empty string.

2

""null cả hai đều khác nhau. cái đầu tiên có nghĩa là một phần của việc khai báo biến chuỗi, chuỗi hằng số đã đượ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 tôi khai báo nó với null thì nó vừa được tạo ra ngay lập tức nhưng không có bộ nhớ nào được cấp phát 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ó với "" - biến trống, nó không thể ngăn chặn sự nhận biết nullpointerexception. 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()); 
    } 
} 

}

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

String s = null; 
s.length(); 

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

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

0

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

66

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

Difference between null and 0/empty string

0

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

Bây giờ, hãy thực hiện điều này: 0/7. Bạn sẽ nhận được kết quả đầu ra, 0. Điều này có nghĩa rằng hoạt động có thể thực hiện được và bạn có thể thực hiện được, nhưng câu trả lời 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 hiện được. Điều này giống như chuỗi null trong java. Ví dụ thứ hai là giống như empty chuỗi.

Các vấn đề liên quan