2011-12-30 4 views
27

Tôi mới sử dụng java.Tại sao từ khóa mới không cần thiết cho Chuỗi

Trong java, String là một class .Nhưng chúng tôi không cần phải sử dụng new từ khóa để tạo ra một đối tượng của lớp String nơi như new được sử dụng để tạo các đối tượng cho các lớp khác.

Tôi đã nghe nói về các lớp trình bao bọc như Integer, Double tương tự như vậy. Nhưng String không phải là Trình bao bọc, phải không?

thực tế những gì đang xảy ra khi tôi sử dụng

 String message = "Hai"; 

?? Làm thế nào nó khác với

String message = new String("Hai"); 

Đây là message một biến tham chiếu hay cái gì khác ?? Có các lớp học khác không yêu cầu new để tạo đối tượng không?

+0

sonu thomas :)! – jenuine

+0

@jenuine hmmmm .... –

Trả lời

22

Với dòng sau bạn không tạo ra một đối tượng mới String trong đống nhưng tái sử dụng một chuỗi chữ (nếu đã có sẵn):

String message = "Hai"; 

"Hai" là một chuỗi chữ trong chuỗi hồ bơi chữ. Vì, các chuỗi là không thay đổi, chúng có thể tái sử dụng được nên chúng được gộp vào nhóm chuỗi ký tự bằng JVM. Và đây là cách được khuyến nghị, bởi vì bạn đang sử dụng lại nó.

Nhưng, với những điều sau đây bạn đang thực sự tạo ra một đối tượng mới (trong đống):

String message = new String("Hai"); 

new String("Hai") là một đối tượng mới String. Trong trường hợp này, ngay cả khi số "Hai" theo nghĩa đen đã có trong nhóm chuỗi chữ, một đối tượng mới được tạo. Điều này không được khuyến khích bởi vì rất có thể là bạn có thể kết thúc với nhiều hơn một đối tượng có cùng giá trị với các đối tượng String.

Cũng xem bài này: Questions about Java's String pool

Có các lớp khác mà không yêu cầu mới để tạo ra đối tượng ??

Thực ra, bạn không thể tạo bất kỳ đối tượng nào trong Java mà không sử dụng từ khóa new.

ví dụ:

Integer i = 1; 

Có, không có nghĩa là đối tượng Integer được tạo mà không sử dụng new. Chúng tôi không bắt buộc phải sử dụng từ khóa new một cách rõ ràng. Nhưng dưới mui xe, nếu đối tượng Integer có giá trị 1 không tồn tại trong bộ nhớ cache (Integer đối tượng được lưu trong bộ nhớ cache của JVM), thì từ khóa new sẽ được sử dụng để tạo nó.

+0

Tôi nghĩ rằng, 'Integer' là một lớp Wrapper cho kiểu nguyên thủy' int'. nhưng chuỗi là ** không ** nguyên thủy, phải không? –

+1

Có bạn đã đúng. –

6

Tạo chuỗi và số nguyên khác nhau.

String s = "Test"; 

Tại đây toán tử '=' bị quá tải cho chuỗi. Vì vậy, là toán tử '+' trong "một số" + "thứ". Ở đâu,

Integer i = 2; 

Cho đến Java 5.0 đây là lỗi thời gian biên dịch; bạn không thể gán nguyên thủy cho trình bao bọc của nó. Nhưng từ Java 5.0, nó được gọi là auto-boxing, nơi nguyên thủy được tự động thăng cấp lên các trình bao bọc của chúng ở bất cứ đâu.

String h1 = "hi"; 

sẽ khác nhau từ

String h2 = new String("hi"); 

Lý do là JVM duy trì một bảng chuỗi cho tất cả các xâu. vì vậy sẽ có một mục nhập trong bảng cho "hi", nói địa chỉ của nó là 1000.

Nhưng khi bạn tạo một đối tượng chuỗi một cách rõ ràng, đối tượng mới sẽ được tạo, nói địa chỉ của nó là 2000. Bây giờ đối tượng mới sẽ trỏ đến mục trong bảng chuỗi đó là 1000.

Do đó khi bạn nói

h1 == h2 

nó so sánh

1000 == 2000 

Vì vậy, nó là sai

+1

Toán tử '=' là * NOT * bị quá tải. Java cung cấp một số cú pháp đường cho các chuỗi, vì vậy khi bạn viết "Hello, World", bạn sẽ nhận được một tham chiếu đến một đối tượng 'String' đại diện cho luồng ký tự đã cho. Bạn đang ngầm tạo một đối tượng (nếu cần) ở đó, nhưng điều đó không có gì liên quan đến toán tử '='. – Darkhogg

8

Đặc tả ngôn ngữ Java cho phép biểu diễn chuỗi dưới dạng chữ số. Bạn có thể coi đó là một khởi phím tắt cho một String có một tác dụng phụ quan trọng đó là khác biệt so với khởi tạo thường xuyên qua mới

literals String được tất cả thực tập nội trú, có nghĩa là họ là những giá trị liên tục được lưu trữ bằng Java thời gian chạy và có thể được chia sẻ trên nhiều lớp.Ví dụ:

class MainClass (
    public String test = "hello"; 
} 

class OtherClass { 
    public String another = "hello"; 

    public OtherClass() { 
     MainClass main = new MainClass(); 
     System.out.println(main.test == another); 
    } 
} 

Sẽ in ra "true" vì cả hai trường hợp chuỗi thực sự trỏ đến cùng một đối tượng. Đây không phải là trường hợp nếu bạn khởi tạo các chuỗi thông qua từ khóa mới.

+1

+1. Đẹp và ngắn gọn. Chúng ta nên đề cập đến Đặc tả Ngôn ngữ Java có sẵn miễn phí tại http: //java.sun.com/docs/books/jls/nếu OP muốn thực sự tìm hiểu điều này. –

1

Trong java
"==" so sánh & địa điểm trái bộ nhớ bên tay phải (và không phải là giá trị ở vị trí nhớ) và do đó trong trường hợp

new String("hai")==new String("hai")

nó trả về false.

Trong trường hợp "Hai" == "Hai", java không phân bổ bộ nhớ riêng cho cùng một chuỗi chữ vì vậy tại đây "==" trả về giá trị true. Bạn luôn có thể sử dụng phương thức equals để so sánh các giá trị.