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

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

"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. :slight_smile:

2 Likes

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.

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

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

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

4 Likes

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. :slight_smile:

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

1 Like

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

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

1 Like

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

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?