01/10/2018, 08:19

Khác nhau giữa return "text" và return new String("text") trong java

Ví dụ em có 2 đoạn code sau:

static String getMessage() {
	return "abc";
}

static String getMessage() {
	return new String("abc");
}

Vậy có sự khác nhau nào ở 2 cách return trên không nếu ở hàm main em có lệnh gán như thế này

String s = getMessage(); 
Nguyễn Duy Hùng viết 10:29 ngày 01/10/2018

Theo mình nghĩ là không vì String trong Java nó là một đối tượng.

viết 10:34 ngày 01/10/2018

"abc" là String literal còn new String("abc"); là String object

Nếu bạn return "abc"; thì Java sẽ kiểm tra trong String pool xem “abc” tồn tại hay chưa, nếu đã có thì ref getMessage() vào giá trị “abc” trong String pool, nếu chưa thì tạo mới “abc” trong String pool.

Còn return new String("abc"); thì luôn tạo 1 chuỗi “abc” mới trong String pool mà không cần kiểm tra gì cả.

Về cơ bản thì 2 cách trên bạn dùng đều cho ra kết quả như nhau.

Trần Hoàn viết 10:35 ngày 01/10/2018

Có một chút khác biệt: return “text” thì trực tiếp gán vào kết quả hàm. Còn return new String(“text”) thì Java tạo thêm 1 object String (tốn thêm bao nhiêu byte trong RAM mình không nhớ) rồi gán giá trị của object đó vào kết quả hàm.

Đối với C#, Java hay các ngôn ngữ bậc cao khác có Garbage Collector thì chuyện này không vấn đề, các biến cục bộ sẽ được release tự động khi chạy hàm xong. Nhưng với C++ chẳng hạn, bạn “new” mà không “delete” thì cũng rắc rối đấy.

viết 10:28 ngày 01/10/2018

Vậy cơ bản là giống như khi mình khai báo String s = "abc"String s = new String("abc") nhỉ
Cảm ơn mọi người đã giải thích

Nguyễn Duy Hùng viết 10:26 ngày 01/10/2018

địa chỉ khác :v nãy ông kia nói rồi mà.

Nguyen Ca viết 10:26 ngày 01/10/2018

Khác ở chỗ một cái được lưu trên common pool, một cái lưu trên heap

static String getMessage() {
	return "abc";
}
s1 = getMessage();
s2 = getMessate()
s1==s2 -> true
static String getMessage() {
	return new String("abc");
}
s1 = getMessage();
s2 = getMessate()
s1==s2 -> false

Tynk Huynk viết 10:33 ngày 01/10/2018

Theo mình biết thìreturn new String("abc") thì tạo 1 object String có giá trị “abc” ở trong Heap, chứ ko phải ở String pool, rồi trả về Object này.

Cơ bản thì: String pool là 1 vùng nhớ nằm trong heap nên có nghĩa là String Object sẽ nằm ngoài vùng nhớ này

Đỗ Nhiên viết 10:28 ngày 01/10/2018

thạo cả c# và java bá đạo thế anh

viết 10:30 ngày 01/10/2018

Chính xác, cám ơn bạn đã nhắc mình.

Trần Hoàn viết 10:26 ngày 01/10/2018

học cả 2, Java thì đủ để giải phương trình bậc 2 =))

Bài liên quan
0