Tại sao String bất biến trong Java? Giải thích chi tiết
3 phút đọc11/09/2025
Bao Tran
Web Developer
0 lượt xem
0 lượt xem
Reading Time: 3minutes
Tại sao String bất biến trong Java là một trong những câu hỏi phỏng vấn phổ biến. String là một trong những class được sử dụng nhiều nhất trong bất kỳ ngôn ngữ lập trình nào. Chúng ta biết rằng trong Java, String là bất biến (immutable) và final. Java runtime duy trì một String pool, điều này làm cho String trở thành một class đặc biệt.
Tại sao String bất biến trong Java?
Hãy cùng xem một số lợi ích của việc String là immutable, điều này sẽ giúp ta hiểu rõ hơn tại sao String lại bất biến trong Java.
String pool chỉ khả thi nhờ việc String là immutable trong Java. Bằng cách này, Java Runtime tiết kiệm được rất nhiều heap space, vì nhiều biến String khác nhau có thể cùng tham chiếu đến một String trong pool. Nếu String không phải là bất biến, thì String interning sẽ không thể tồn tại. Bởi vì khi một biến thay đổi giá trị, sự thay đổi đó sẽ ảnh hưởng đến tất cả các biến khác đang tham chiếu đến cùng một String.
Nếu String không phải là bất biến thì nó có thể gây ra mối đe dọa bảo mật nghiêm trọng cho ứng dụng. Ví dụ, trong quá trình kết nối cơ sở dữ liệu, username và password thường được truyền dưới dạng String để lấy kết nối. Trong socket programming, các thông tin như host và port cũng được truyền dưới dạng String. Nhờ việc String là immutable, giá trị của nó không thể bị thay đổi. Nếu không, một hacker có thể chỉnh sửa giá trị mà biến String đang tham chiếu, từ đó gây ra các lỗ hổng bảo mật trong ứng dụng.
Vì String là bất biến nên nó an toàn khi sử dụng trong môi trường multithreading. Một String instance duy nhất có thể được chia sẻ cho nhiều thread khác nhau. Điều này giúp tránh việc phải sử dụng đồng bộ hóa để đảm bảo thread-safety. Nói cách khác, String mặc định là thread-safe.
String được sử dụng trong Java ClassLoader, và tính chất không thay đổi giúp đảm bảo tính bảo mật, rằng đúng class sẽ được ClassLoader tải vào. Ví dụ, hãy tưởng tượng một tình huống khi bạn muốn load class java.sql.Connection, nhưng giá trị tham chiếu lại bị thay đổi thành myhacked.Connection. Class này có thể thực hiện những hành động không mong muốn trên cơ sở dữ liệu của bạn.
Vì String là bất biến nên hashcode của nó được lưu trữ (cached) ngay tại thời điểm khởi tạo và không cần phải tính toán lại nhiều lần. Điều này khiến String trở thành một lựa chọn lý tưởng để làm key trong Map, đồng thời giúp quá trình xử lý nhanh hơn so với các đối tượng khác dùng làm HashMap key. Đây chính là lý do String được sử dụng phổ biến nhất làm key trong HashMap.
Trên đây là một số lý do mà tôi có thể nghĩ ra, cho thấy những lợi ích của việc String là bất biến. Đây là một tính năng tuyệt vời của Java String class, và cũng chính điều này làm cho nó trở nên đặc biệt. Bạn có thể đọc thêm bài viết này để biết cách tự viết một immutable class.
Bạn có thể tham khảo thêm nhiều ví dụ về Java String trong GitHub Repository của chúng tôi.
Về tác giả
Bao TranWeb Developer
I’m passionate about web development and sharing my insights through articles, with over 8 years of experience. I hope these sharings inspire you and help build a strong web development community.
@#@
Tôi đam mê phát triển web và chia sẻ những hiểu biết của mình thông qua các bài viết, với hơn 8 năm kinh nghiệm. Tôi hy vọng những chia sẻ này sẽ truyền cảm hứng cho các bạn và giúp xây dựng một cộng đồng phát triển web mạnh mẽ.
Cập nhật thông tin mới nhấtNhận các thông tin mới nhất về mối đe dọa, báo cáo an ninh mạng từ CyStack về hòm thư điện tử của bạn
Thảo luận (0)
Đăng nhập để thảo luận
Bài viết liên quan
{"success":true,"head":"<title>Tại sao String bất biến trong Java? Giải thích chi tiết - CyStack Tutorial</title>\n<meta name=\"description\" content=\"Tại sao String bất biến trong Java là một trong những câu hỏi phỏng vấn phổ biến. String là một trong những class được sử dụng nhiều nhất trong bất kỳ ngôn\"/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-video-preview:-1, max-image-preview:large\"/>\n<link rel=\"canonical\" href=\"https://blog.cystack.org/tutorial/2025/09/11/tai-sao-string-bat-bien-trong-java/\" />\n<meta property=\"og:locale\" content=\"en_US\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"Tại sao String bất biến trong Java? Giải thích chi tiết - CyStack Tutorial\" />\n<meta property=\"og:description\" content=\"Tại sao String bất biến trong Java là một trong những câu hỏi phỏng vấn phổ biến. String là một trong những class được sử dụng nhiều nhất trong bất kỳ ngôn\" />\n<meta property=\"og:url\" content=\"https://blog.cystack.org/tutorial/2025/09/11/tai-sao-string-bat-bien-trong-java/\" />\n<meta property=\"og:site_name\" content=\"CyStack Tutorial\" />\n<meta property=\"article:tag\" content=\"vi\" />\n<meta property=\"article:section\" content=\"Java\" />\n<meta property=\"og:image\" content=\"https://s2.cystack.net/tutorial/11112412/tai-sao-string-bat-bien-trong-java.jpg\" />\n<meta property=\"og:image:secure_url\" content=\"https://s2.cystack.net/tutorial/11112412/tai-sao-string-bat-bien-trong-java.jpg\" />\n<meta property=\"og:image:width\" content=\"1200\" />\n<meta property=\"og:image:height\" content=\"630\" />\n<meta property=\"og:image:alt\" content=\"Tại sao String bất biến trong Java\" />\n<meta property=\"og:image:type\" content=\"image/jpeg\" />\n<meta property=\"article:published_time\" content=\"2025-09-11T11:29:59+07:00\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:title\" content=\"Tại sao String bất biến trong Java? Giải thích chi tiết - CyStack Tutorial\" />\n<meta name=\"twitter:description\" content=\"Tại sao String bất biến trong Java là một trong những câu hỏi phỏng vấn phổ biến. String là một trong những class được sử dụng nhiều nhất trong bất kỳ ngôn\" />\n<meta name=\"twitter:image\" content=\"https://s2.cystack.net/tutorial/11112412/tai-sao-string-bat-bien-trong-java.jpg\" />\n<meta name=\"twitter:label1\" content=\"Written by\" />\n<meta name=\"twitter:data1\" content=\"Bao Tran\" />\n<meta name=\"twitter:label2\" content=\"Time to read\" />\n<meta name=\"twitter:data2\" content=\"2 minutes\" />\n<script type=\"application/ld+json\" class=\"rank-math-schema\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https://blog.cystack.org/tutorial/#person\",\"name\":\"CyStack Tutorial\"},{\"@type\":\"WebSite\",\"@id\":\"https://blog.cystack.org/tutorial/#website\",\"url\":\"https://blog.cystack.org/tutorial\",\"name\":\"CyStack Tutorial\",\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https://s2.cystack.net/tutorial/11112412/tai-sao-string-bat-bien-trong-java.jpg\",\"url\":\"https://s2.cystack.net/tutorial/11112412/tai-sao-string-bat-bien-trong-java.jpg\",\"width\":\"1200\",\"height\":\"630\",\"caption\":\"T\\u1ea1i sao String b\\u1ea5t bi\\u1ebfn trong Java\",\"inLanguage\":\"en-US\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://blog.cystack.org/tutorial/2025/09/11/tai-sao-string-bat-bien-trong-java/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":\"1\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":\"2\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/category/java/\",\"name\":\"Java\"}},{\"@type\":\"ListItem\",\"position\":\"3\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/09/11/tai-sao-string-bat-bien-trong-java/\",\"name\":\"T\\u1ea1i sao String b\\u1ea5t bi\\u1ebfn trong Java? Gi\\u1ea3i th\\u00edch chi ti\\u1ebft\"}}]},{\"@type\":\"WebPage\",\"@id\":\"https://blog.cystack.org/tutorial/2025/09/11/tai-sao-string-bat-bien-trong-java/#webpage\",\"url\":\"https://blog.cystack.org/tutorial/2025/09/11/tai-sao-string-bat-bien-trong-java/\",\"name\":\"T\\u1ea1i sao String b\\u1ea5t bi\\u1ebfn trong Java? Gi\\u1ea3i th\\u00edch chi ti\\u1ebft - CyStack Tutorial\",\"datePublished\":\"2025-09-11T11:29:59+07:00\",\"dateModified\":\"2025-09-11T11:29:59+07:00\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/#website\"},\"primaryImageOfPage\":{\"@id\":\"https://s2.cystack.net/tutorial/11112412/tai-sao-string-bat-bien-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"breadcrumb\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/09/11/tai-sao-string-bat-bien-trong-java/#breadcrumb\"}},{\"@type\":\"Person\",\"@id\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"name\":\"Bao Tran\",\"url\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https://secure.gravatar.com/avatar/0cdd33c02ec4a531fcf557b9c1ccc276df0c69031b2382c959bcf335248e840c?s=96&d=mm&r=g\",\"url\":\"https://secure.gravatar.com/avatar/0cdd33c02ec4a531fcf557b9c1ccc276df0c69031b2382c959bcf335248e840c?s=96&d=mm&r=g\",\"caption\":\"Bao Tran\",\"inLanguage\":\"en-US\"}},{\"@type\":\"BlogPosting\",\"headline\":\"T\\u1ea1i sao String b\\u1ea5t bi\\u1ebfn trong Java? Gi\\u1ea3i th\\u00edch chi ti\\u1ebft - CyStack Tutorial\",\"keywords\":\"T\\u1ea1i sao String b\\u1ea5t bi\\u1ebfn trong Java,String,immutable\",\"datePublished\":\"2025-09-11T11:29:59+07:00\",\"dateModified\":\"2025-09-11T11:29:59+07:00\",\"articleSection\":\"Java\",\"author\":{\"@id\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"name\":\"Bao Tran\"},\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"description\":\"T\\u1ea1i sao String b\\u1ea5t bi\\u1ebfn trong Java l\\u00e0 m\\u1ed9t trong nh\\u1eefng c\\u00e2u h\\u1ecfi ph\\u1ecfng v\\u1ea5n ph\\u1ed5 bi\\u1ebfn. String l\\u00e0 m\\u1ed9t trong nh\\u1eefng class \\u0111\\u01b0\\u1ee3c s\\u1eed d\\u1ee5ng nhi\\u1ec1u nh\\u1ea5t trong b\\u1ea5t k\\u1ef3 ng\\u00f4n\",\"name\":\"T\\u1ea1i sao String b\\u1ea5t bi\\u1ebfn trong Java? Gi\\u1ea3i th\\u00edch chi ti\\u1ebft - CyStack Tutorial\",\"@id\":\"https://blog.cystack.org/tutorial/2025/09/11/tai-sao-string-bat-bien-trong-java/#richSnippet\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/09/11/tai-sao-string-bat-bien-trong-java/#webpage\"},\"image\":{\"@id\":\"https://s2.cystack.net/tutorial/11112412/tai-sao-string-bat-bien-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/09/11/tai-sao-string-bat-bien-trong-java/#webpage\"}}]}</script>\n"}