2010-02-01 38 views
8

Trong một câu hỏi phỏng vấn, phỏng vấn hỏi tôiSự khác nhau giữa việc gán và tạo cá thể của chuỗi là gì?

là gì phổ biến và sự khác biệt giữa những điều khoản sau đây:

String s = "Test"; 

String s = new String("Test"); 

Có sự khác biệt trong việc phân bổ bộ nhớ?

+0

http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-expression-new-string-in-java –

Trả lời

6
String s = "Test"; 

Trước tiên, hãy tìm chuỗi "Kiểm tra" trong nhóm hằng số chuỗi. Nếu tìm thấy s sẽ được thực hiện để tham khảo các đối tượng tìm thấy. Nếu không tìm thấy, một đối tượng String mới được tạo, được thêm vào pool và s được tạo để chỉ đối tượng mới được tạo ra.

String s = new String("Test"); 

Trước tiên, tạo một đối tượng chuỗi mới và tham chiếu đến nó. Ngoài ra một mục nhập cho chuỗi "Kiểm tra" được thực hiện trong nhóm hằng số chuỗi, nếu chưa được nhập vào đó.

Vì vậy, giả sử chuỗi "Kiểm tra" không có trong hồ bơi, khai báo đầu tiên sẽ tạo một đối tượng trong khi thứ hai sẽ tạo hai đối tượng.

+1

Khi tôi hiểu nó, việc tìm kiếm/tạo đối tượng trong hằng số pool xảy ra cho tất cả các literals xảy ra trong mã của lớp khi lớp đó được nạp, chứ không phải khi dòng mã cụ thể đó được thực thi. –

5

differnce về bộ nhớ là các biểu thức của biểu mẫu: String s = "test" sử dụng chuỗi "được thực tập" để chia sẻ các phiên bản duy nhất.

Các gọi của hình thức: String s = "test"
là hiệu quả so với String s = new String("test")

Cuộc gọi đầu tiên tận dụng các biểu thức hằng hiện hữu (nếu có), cuộc gọi thứ hai tạo ra một trường hợp mới mà không tận dụng các bất kỳ cá thể hiện có nào.

Dưới đây đang chứng tỏ đoạn này:

String test = new String("test"); 
String internTest = "test"; 
String nonInternTest = new String("test"); 

System.out.println(test == internTest); // prints false 
System.out.println(test != nonInternTest); // prints true 
System.out.println(test.equals(nonInternTest)); // prints true 

Cũng lưu ý rằng JLS xác định hành vi để được như sau:
Mỗi chuỗi chữ là một tham chiếu đến một thể hiện của lớp String (§4.3.3). Đối tượng chuỗi có giá trị không đổi. Chuỗi ký tự - hoặc, nói chung, các chuỗi là các giá trị của các biểu thức không đổi được "interned" để chia sẻ các cá thể duy nhất, sử dụng phương thức String.intern.

0

Đầu tiên sẽ tìm kiếm chuỗi "Kiểm tra" theo chuỗi trong nhóm Chuỗi, nếu nó hiện diện thì s sẽ tham chiếu và sẽ không tạo mới. và tạo đối tượng mới chỉ khi "Kiểm tra" nghĩa đen không có ở đó.

nhưng trong trường hợp thứ hai, nó sẽ tạo một đối tượng khác mà không làm phiền nhiều về việc liệu nó có hiện diện hay không.

1

Chuỗi s = "Kiểm tra"; // tạo một đối tượng String và một biến tham chiếu Trong trường hợp đơn giản này, "Test" sẽ đi vào nhóm và s sẽ tham chiếu đến nó.

Chuỗi s = chuỗi mới ("Kiểm tra"); // tạo hai đối tượng và một biến tham chiếu Trong trường hợp này, vì chúng ta đã sử dụng từ khóa mới, Java sẽ tạo một đối tượng String mới trong bộ nhớ bình thường (không phải nhóm) và s sẽ tham chiếu đến nó. Ngoài ra, "Kiểm tra" theo nghĩa đen sẽ được đặt trong hồ bơi.

nhưng điểm chung của chúng là tạo tất cả đối tượng String mới, với giá trị của "Kiểm tra" và gán giá trị đó cho biến tham chiếu s.

0

+ Sự khác biệt giữa việc tạo một đối tượng String mới và tạo tham chiếu là gì, nhưng chúng ta đang nói với jvm để tạo một đối tượng mới. và tạo ra sự refence có nghĩa là chúng tôi đang tạo ra các đối tượng tự của chúng tôi chỉ.

+0

Không phải là một câu hỏi. – Luv

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