Trang chủHướng dẫnBạn biết gì về String trong Java? Thử thách nhanh qua câu đố vui
Java

Bạn biết gì về String trong Java? Thử thách nhanh qua câu đố vui

CyStack blog 8 phút để đọc
CyStack blog25/08/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 8 minutes

Trong bài viết này, chúng ta sẽ cùng đến với một số câu hỏi nhanh thú vị về String trong Java. Đây là một trong những lớp quan trọng và quen thuộc nhất, nếu bạn đã từng lập trình Java, chắc chắn đã dùng đến nó.

String cũng thường xuyên xuất hiện trong các buổi phỏng vấn hoặc những bài quiz về Java. Vậy nên tôi đã tổng hợp một loạt câu hỏi hay, đôi khi còn có chút “mẹo” về chủ đề này. Giờ thì cùng bắt đầu thử sức ngay nhé!

 String trong Java

Câu đố vui về Java String

Bài quiz này gồm 21 câu hỏi. Nếu trả lời đúng từ 15 câu trở lên, bạn có thể tự tin là mình đã nắm rất vững các khái niệm về String. Bạn có thể xem đáp án và giải thích chi tiết bằng cách nhấp vào nút “Xem đáp án” sau mỗi câu hỏi.

Bắt đầu ngay nào và chúc bạn may mắn!

1. Kết quả của các câu lệnh dưới đây là gì?

String s = "Java String Quiz";
System.out.println(s.charAt(s.toUpperCase().length()));

A. Chuyển đổi “Z” thành số nguyên 90 và in ra “90”

B. Lỗi runtime (RuntimeException)

C. In ra “z”

D. In ra “Z”

Đáp án đúng: B

Chương trình sẽ ném ra một lỗi RuntimeException.

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 16

Lý do là vì chỉ số (index) của chuỗi trong Java bắt đầu từ 0.

2. Kết quả của các câu lệnh dưới đây là gì?

String s = "Java String Quiz";
System.out.println(s.substring(5,3));

A. In ra “Str”

B. Lỗi runtime (RuntimeException)

C. Lỗi IndexOutOfBoundsException lúc runtime

D. Lỗi StringIndexOutOfBoundsException lúc biên dịch

Đáp án đúng: B

Chương trình sẽ ném ra một lỗi RuntimeException với thông báo:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 5, end 3, length 16

Lý do là vì chỉ số kết thúc (end index là 3) nhỏ hơn chỉ số bắt đầu (start index là 5).

3. Chọn tất cả các phương thức hợp lệ của lớp String trong các lựa chọn sau:

A. trim()

B. intern()

C. toLower()

D. split()

Đáp án đúng: A, B

Các phương thức hợp lệ của lớp String là: trim(), intern(), toLowerCase()split(String regex).

4. Kết quả của các câu lệnh dưới đây là gì?

String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");
System.out.print(s1 == s2);
System.out.print(s1 == s3);

A. truefalse

B. truetrue

C. falsefalse

D. falsetrue

Đáp án đúng: A

Khi chúng ta sử dụng dấu ngoặc kép để tạo một chuỗi (String), Java sẽ trước tiên tìm kiếm một chuỗi có cùng giá trị trong String pool. Nếu tìm thấy, nó sẽ trả về tham chiếu tới chuỗi đó; nếu không, nó sẽ tạo một chuỗi mới trong pool rồi trả về tham chiếu.

Tuy nhiên, khi sử dụng toán tử new, chúng ta buộc lớp String phải tạo một đối tượng chuỗi mới trong heap. Do đó, s1s2 sẽ tham chiếu đến cùng một chuỗi trong pool, còn s3 sẽ là một đối tượng khác nằm ngoài pool, vì vậy kết quả đầu ra sẽ phản ánh sự khác biệt này.

5. Những phát biểu nào sau đây là đúng khi nói về việc dùng String trong switch-case?

A. String được phép dùng trong switch-case từ phiên bản Java 1.5 trở lên.

B. String được phép dùng trong switch-case từ phiên bản Java 1.7 trở lên.

C. Cơ chế switch-case sử dụng phương thức equals(), vì vậy cần kiểm tra null để tránh NullPointerException.

Đáp án đúng: B, C

Đọc thêm tại java switch case string.

6. Những phát biểu nào sau đây là đúng về StringBufferStringBuilder?

A. StringBuilder không phải là thread-safe.

B. StringBuffer là thread-safe vì các phương thức của nó được synchronized.

C. StringBuilder được giới thiệu trong Java 1.4.

D. StringBufferStringBuilder là các lớp bất biến (immutable).

Đáp án đúng: A, B

Đối tượng StringBuffer là thread-safe vì các phương thức của nó được đồng bộ hóa (synchronized). Tuy nhiên, trong nhiều trường hợp, việc này tạo ra một gánh nặng hiệu năng. Do đó, StringBuilder đã được giới thiệu trong Java 1.5. StringBuilder không phải là thread-safe. Cả StringBufferStringBuilder đều là các lớp khả biến (mutable).

Đọc thêm tại String vs StringBuffer vs StringBuilder.

7. Lớp String được triển khai theo design pattern nào dưới đây?

A. Flyweight Design Pattern

B. Factory Pattern

C. Singleton Pattern

D. Không có cái nào ở trên

Đáp án đúng: A

Cơ chế String pool của Java là một ví dụ điển hình của Flyweight Design Pattern.

8. Kết quả của các câu lệnh dưới đây là gì?

String s1 = "abc";
String s2 = "def";
System.out.println(s1.compareTo(s2));

A. 0

B. true

C. -3

D. false

Đáp án đúng: C

Trích từ tài liệu về phương thức String compareTo():

Phương thức compareTo so sánh hai chuỗi theo thứ tự từ điển, dựa trên giá trị Unicode của từng ký tự trong chuỗi. Dãy ký tự mà đối tượng String hiện tại biểu diễn sẽ được so sánh theo thứ tự từ điển với dãy ký tự của chuỗi đối số.

Kết quả trả về là một số nguyên âm nếu chuỗi hiện tại đứng trước chuỗi đối số theo thứ tự từ điển, một số nguyên dương nếu đứng sau, và bằng không nếu hai chuỗi giống hệt nhau. Phương thức compareTo chỉ trả về 0 khi equals(Object) cũng trả về true.

Đây chính là định nghĩa của thứ tự từ điển (lexicographic ordering). Nếu hai chuỗi khác nhau, điều đó có thể do chúng có ký tự khác nhau tại một số chỉ số hợp lệ, có độ dài khác nhau, hoặc cả hai. Trong trường hợp chúng khác nhau tại một hay nhiều vị trí, gọi k là chỉ số nhỏ nhất mà tại đó hai chuỗi khác nhau; khi đó, chuỗi có ký tự tại vị trí k nhỏ hơn (xét theo toán tử <) sẽ đứng trước chuỗi còn lại trong thứ tự từ điển.

Trong tình huống này, compareTo sẽ trả về hiệu giữa hai ký tự tại vị trí k trong hai chuỗi, cụ thể là:

this.charAt(k) - anotherString.charAt(k)

Trong ví dụ của chúng ta, chuỗi "abc" đứng trước "def", do đó trả về một số nguyên âm. Chỉ số thấp nhất có ký tự khác nhau là 0, và a - d bằng -3.

9. Kết quả của chương trình dưới đây sẽ là gì?”

public class Test {
	public static void main(String[] args) {
		String x = "abc";
		String y = "abc";
		x.concat(y);
		System.out.print(x);
	}
}

A. abc

B. abcabc

C. null

Đáp án đúng: A

Phương thức x.concat(y) tạo ra một chuỗi mới nhưng kết quả này không được gán lại cho x. Vì vậy, giá trị của x không thay đổi.

10. Chương trình dưới đây sẽ có kết quả là gì?

public class Test {
	public static void main(String[] args) {
		String s1 = "abc";
		String s2 = "abc";
		System.out.println("s1 == s2 is:" + s1 == s2);
	}
}

A. false

B. s1 == s2 is:true

C. s1 == s2 is:false

D. true

Đáp án đúng: A

Kết quả sẽ là false vì trong Java, toán tử + (nối chuỗi) có độ ưu tiên cao hơn toán tử so sánh ==.

Do đó, biểu thức sẽ được tính toán như sau:

(“s1 == s2 is:” + s1) == s2

"s1 == s2 is:abc" == "abc"

Rõ ràng hai chuỗi này không bằng nhau, nên kết quả là false.

11. Kết quả của các câu lệnh dưới đây là gì?

String s = "Java"+1+2+"Quiz"+""+(3+4);
System.out.println(s);

A. Java3Quiz7

B. Java12Quiz7

C. Java12Quiz34

D. Java3Quiz34

Đáp án đúng: B

Trước hết, biểu thức trong dấu ngoặc được thực thi trước. Sau đó, tất cả đều là toán tử +, nên chúng được thực hiện từ trái sang phải.

Ta nhận được một chuỗi (String) sau mỗi lần nối, do đó kết quả đầu ra được tạo ra như sau:

“Java”+1+2+“Quiz”+“”+(3+4)

= “Java”+1+2+“Quiz”+“”+7

= “Java1”+2+“Quiz”+“”+7

= “Java12”+“Quiz”+“”+7

= “Java12Quiz”+“”+7

= “Java12Quiz”+7

= “Java12Quiz7”

12. Có bao nhiêu đối tượng String được tạo ra trong các câu lệnh dưới đây?

String s = "abc"; // statement 1
String s1 = new String("abcd"); // statement 2

A. 1

B. 2

C. 3

D. 4

Đáp án đúng: C

Trong câu lệnh 1, "abc" được tạo trong String pool.

Trong câu lệnh 2, trước hết "abcd" được tạo trong String pool. Sau đó, chuỗi này được truyền làm đối số cho toán tử new String và một chuỗi khác được tạo trong bộ nhớ heap.

Vì vậy, tổng cộng có 3 đối tượng String được tạo ra.

13. Kết quả của các câu lệnh dưới đây là gì?

String s1 = "abc";
String s2 = new String("abc");
System.out.print(s1==s2);
System.out.println(s1==s2.intern());

A. falsetrue

B. falsefalse

C. truetrue

D. truefalse

Đáp án đúng: A

s1 nằm trong String pool, trong khi s2 được tạo trong bộ nhớ heap.

Do đó, biểu thức s1 == s2 sẽ trả về false.

Khi phương thức s2.intern() được gọi, nó sẽ kiểm tra xem trong pool có chuỗi nào với giá trị "abc" hay không. Vì vậy, nó trả về tham chiếu của s1. Lúc này, cả s1s2.intern() đều trỏ đến cùng một đối tượng chuỗi.

Do đó, s1 == s2.intern() sẽ trả về true.

14. Chọn tất cả các interface được lớp String triển khai.

A. Serializable

B. Comparable

C. Constable

D. Cloneable

Đáp án đúng: A, B, C

String là một lớp có thể tuần tự hóa (serializable) và so sánh được (comparable). Constable là một giao diện (interface) mới được giới thiệu từ phiên bản Java 12.

15. Lý do nào khiến String trở thành ứng cử viên hoàn hảo để làm key cho Map.

A. String là bất biến

B. Stringfinal

C. String triển khai đúng đắn phương thức hashCode()equals()

D. hashCode của String được cache lại

Đáp án đúng: A, B, C, D

Việc triển khai đúng phương thức hashCode()equals() là điều bắt buộc đối với một key trong Map. Vì String là final và bất biến, nên không có khả năng dữ liệu của key bị thay đổi hoặc hỏng.

16. Kết quả của đoạn mã dưới đây là gì?

String s1 = new String("java");
String s2 = new String("JAVA");
System.out.println(s1 = s2);

A. JAVA

B. java

C. true

D. false

Đáp án đúng: A

Nó sẽ in ra "JAVA" vì đối số bên trong phương thức println() là một phép gán. Do đó, nó sẽ được xử lý như System.out.println("JAVA").

17. Kết quả của các câu lệnh dưới đây là gì?

String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));

A. false

B. true

C. ClassCastException lúc runtime

D. Lỗi lúc biên dịch

Đáp án đúng: A

Kết quả sẽ là falses2 không phải là một đối tượng kiểu String. Nếu bạn xem mã nguồn của phương thức String.equals(), bạn sẽ thấy nó có một bước kiểm tra instanceof để xác định xem đối tượng được truyền vào có phải là String hay không. Nếu không, nó sẽ trả về false ngay lập tức.

18. Kết quả của đoạn mã dưới đây là gì?

String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);

A. false

B. true

C. null

Đáp án đúng: A

Đây là một câu hỏi mẹo và kết quả sẽ là false. Phương thức intern() sẽ trả về tham chiếu của đối tượng String từ String pool, nhưng vì chúng ta đã không gán kết quả đó ngược lại cho s2, nên s2 vẫn giữ tham chiếu đến đối tượng trên heap. Do đó, s1s2 vẫn là hai tham chiếu khác nhau.

Nếu bạn sửa dòng 3 thành s2 = s2.intern();, kết quả sẽ là true.

19. Chọn tất cả các lớp kế thừa (extend) từ lớp String.

A. StringBuffer

B. StringBuilder

C. StringWriter

D. Không có lớp nào

Đáp án đúng: D

Đây là một câu hỏi mẹo. String là một lớp final, vì vậy bạn không thể kế thừa từ nó.

20. Những phát biểu nào sau đây là đúng về String trong Java?

A. Chúng ta có thể kế thừa lớp String giống như StringBuffer.

B. Lớp String được định nghĩa trong package java.util.

C. String là bất biến trong Java.

D. String là thread-safe trong Java.

E. String có phân biệt chữ hoa-chữ thường trong Java.

Đáp án đúng: C, D, E

Chúng ta không thể kế thừa lớp String vì nó được khai báo là final. StringBuffer không kế thừa từ String. Lớp String được định nghĩa trong gói java.lang. Chuỗi (String) là bất biến nên an toàn với luồng (thread-safe) trong Java. String phân biệt chữ hoa chữ thường, vì vậy "abc" không bằng "ABC".

21. Kết quả của các câu lệnh dưới đây là gì?

String s1 = null;
System.out.print(s1); // dòng 2
System.out.print(s1.toString()); // dòng 3

A. nullnull

B. null sau đó là NullPointerException

C. NullPointerException

Đáp án đúng: B

Dòng 2 sẽ in ra null vì phương thức print có kiểm tra null như sau:

if (s == null) { s = "null"; }

Dòng 3 sẽ ném ra ngoại lệ NullPointerException vì chúng ta đang cố gọi phương thức toString() trên một giá trị null.

Kết luận

Bài viết này đã trình bày hầu hết những điểm quan trọng về String trong bài quiz. Nếu bạn còn những khái niệm thú vị khác chưa được đề cập, hãy chia sẻ thêm trong phần bình luận và chia sẻ bài viết với người khác nếu bạn thấy hữu ích!

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất