So sánh giữa string string bulder và string buffer năm 2024
Câu trả lời là 1 đó. “Khiemnd xin chào các bạn.” Tại sao ư? Không như những gì bạn nghĩ đúng không? Vì String là immutable. Khi khởi tạo str thì giá trị “Khiemnd xin chào các bạn. ” được lưu vào Constant String Pool. Không thể thay đổi => thread safe (An toàn trong xử lý luồng). Nên hàm “concat” trong String dùng ở đây không có ý nghĩa gì. Show Đọc tới đây trong đầu bạn sẽ vân mông lung vì các bạn rất hay thao tác với String theo một kiểu nữa(Thực ra mình cũng vậy :d). Bình tĩnh, các bạn hãy xem đoạn code phía dưới. Cùng ý đồ bên trên. Nối chuỗi. package com.khiemnd5.controler; public class Test { }Output:? \=> Khiemnd xin chào các bạn. Cảm ơn các bạn đã ghé thăm blog 😀 Tại sao ư? Để mình giải thích nhé! Đầu tiên như đã nói str sẽ được lưu vào Constant String Pool. Để đó đã. Sau đó, str += “Cảm ơn các bạn đã ghé thăm blog”; thì java lại tạo ra vùng nhớ mới trong Pool. Giá trị vùng nhớ mới + giá trị vùng nhớ cũ thì nó tạo ra chuỗi đó thôi:d (Một vùng nhớ mới hoàn toàn chứa cả str cũ và str được nối vào). Bản chất giá trị vùng nhớ cũ vẫn là “Khiemnd xin chào các bạn.” chứ nó không hề bị override (ghi đè) nhé. 2. String Buffer hay StringBuilder sinh ra để giải quyết các vấn đề còn tồn tại của String. Khi khởi tạo thì giá trị sẽ được lưu vào heap. String thì là immutable. Còn StringBuilder hay StringBuffer là mutable (Có thể thay đổi giá trị_ giá trị là giá trị khởi tạo ban đầu với một khoảng vùng nhớ đã được cấp) Về cơ bản thì StringBuffer hay StringBuilder đểu có những phương thức giống nhau. Chỉ có khác ở chỗ. StringBuffer an toàn cho xử lý đồng bộ => thread safe. Nhưng lại chậm về mặt hiệu năng. StringBuilder thì ngược lại. Không xử lý luồng an toàn nhưng tốc độ lại nhanh. \=> Tùy vào tình huống sử dụng thực tế để áp dụng loại String nào cho hợp lý. 😀 Khi nối một chuỗi ngắn, đơn giản thì ko nhất thiết chúng ta cứ phải dùng StringBuilder hay Buffer làm gì. String vẫn làm tốt 😀 Có ba lớp trong Java để làm việc với dữ liệu văn bản: String , StringBuffer và StringBuilder . Mọi nhà phát triển đều gặp phải vấn đề đầu tiên khi bắt đầu học ngôn ngữ. Còn hai người còn lại thì sao? Sự khác biệt của chúng là gì và khi nào nên sử dụng lớp này hay lớp khác? Nói chung, sự khác biệt giữa chúng là nhỏ, nhưng tốt hơn hết bạn nên hiểu mọi thứ trong thực tế :) Lớp chuỗiLớp này đại diện cho một chuỗi các ký tự. Tất cả các chuỗi ký tự được xác định trong các chương trình, chẳng hạn như "Đây là Chuỗi" đều là các thể hiện của lớp Chuỗi. Chuỗi có hai tính năng cơ bản:
Nói chung, lớp String không thể có con (
0). Điều này mang lại cho lớp String một số lợi thế quan trọng:
Về cơ bản, việc nối chuỗi được thực hiện bởi lớp StringBuilder hoặc StringBuffer (tùy theo ý của trình biên dịch) và một phương thức
3(chúng ta sẽ nói về các lớp này sau). Nếu chúng ta thêm các thể hiện của lớp String với các thể hiện của các lớp khác thì lớp sau sẽ được rút gọn thành biểu diễn chuỗi:
Đây là một thuộc tính thú vị khác của lớp String: các đối tượng của bất kỳ lớp nào có thể được chuyển thành biểu diễn chuỗi bằng cách sử dụng phương thức
4được xác định trong lớp
5và được kế thừa bởi tất cả các lớp khác. Thông thường phương thức toString() trên một đối tượng được gọi ngầm. Ví dụ: khi chúng ta hiển thị một cái gì đó trên màn hình hoặc thêm một Chuỗi vào một đối tượng của lớp khác. Lớp String có thêm một tính năng nữa. Tất cả các chuỗi ký tự được xác định trong mã Java, chẳng hạn như "asdf", được lưu vào bộ nhớ đệm tại thời điểm biên dịch và được thêm vào cái gọi là nhóm chuỗi. Nếu chúng ta chạy đoạn mã sau:
Chúng ta sẽ thấy true trong bảng điều khiển vì các biến
6thực sự sẽ
7tham chiếu đến cùng một phiên bản của lớp String đã được thêm vào nhóm chuỗi tại thời điểm biên dịch. Nghĩa là, các phiên bản khác nhau của lớp có cùng giá trị sẽ không được tạo và bộ nhớ sẽ được lưu. Sai sót:Không khó để đoán rằng lớp String chủ yếu cần thiết để làm việc với các chuỗi. Nhưng trong một số trường hợp, những đặc điểm trên của lớp String có thể chuyển từ ưu điểm thành nhược điểm. Khi các chuỗi được tạo bằng mã Java, nhiều thao tác thường được thực hiện trên chúng:
Hãy nhìn vào mã này:
Thoạt nhìn có vẻ như chúng tôi chỉ dịch dòng “Wake up, Neo!” thành chữ hoa, loại bỏ khoảng trắng thừa khỏi chuỗi này và gói nó trong dấu ngoặc kép. Trên thực tế, do tính bất biến của lớp String, kết quả của mỗi thao tác là các thể hiện của chuỗi mới được tạo ra và các thể hiện của chuỗi cũ bị loại bỏ, tạo ra một lượng lớn rác. Làm thế nào để tránh lãng phí bộ nhớ? Lớp StringBufferĐể xử lý việc tạo rác tạm thời do sửa đổi đối tượng String, bạn có thể sử dụng lớp StringBuffer. Đây là
8một lớp học, tức là có thể thay đổi. Một đối tượng của lớp StringBuffer có thể chứa một tập hợp ký tự cụ thể, độ dài và giá trị của chúng có thể được thay đổi bằng cách gọi một số phương thức nhất định. Hãy xem lớp này hoạt động như thế nào. Để tạo một đối tượng mới, hãy sử dụng một trong các hàm tạo của nó, ví dụ:
Luyện tập:
Việc nối chuỗi thông qua StringBuffer trong Java được thực hiện bằng cách sử dụng
3. Nói chung, phương thức
3trong lớp StringBuffer bị quá tải theo cách nó có thể chấp nhận hầu hết mọi kiểu dữ liệu:
Phương thức này
3trả về đối tượng mà nó được gọi (giống như nhiều phương thức khác), cho phép nó được gọi theo một “chuỗi”. Ví dụ trên có thể viết như sau:
Lớp StringBuffer có một số phương thức để làm việc với chuỗi. Hãy liệt kê những cái chính:
6- sẽ trả về một chuỗi con bắt đầu từ vị trí
3
Danh sách đầy đủ các phương thức và hàm tạo có trong tài liệu chính thức . Các phương pháp trên hoạt động như thế nào? Hãy xem trong thực tế:
Thuận lợi:
Sai sót:Một mặt, an toàn luồng là một lợi thế của lớp, mặt khác, nó là một bất lợi. Các phương thức được đồng bộ hóa chậm hơn các phương thức không được đồng bộ hóa. Đây là lúc StringBuilder phát huy tác dụng. Hãy cùng tìm hiểu xem đây là loại lớp Java nào - StringBuilder, nó có những phương thức nào và các tính năng của nó là gì. Lớp StringBuilderStringBuilder trong Java là một lớp đại diện cho một chuỗi ký tự. Nó rất giống với StringBuffer về mọi mặt ngoại trừ tính an toàn của luồng. StringBuilder cung cấp API tương tự như StringBuffer. Hãy chứng minh điều này bằng một ví dụ quen thuộc, thay thế việc khai báo các biến từ StringBufer sang StringBuilder:
Sự khác biệt duy nhất là StringBuffer an toàn cho luồng và tất cả các phương thức của nó đều được đồng bộ hóa, trong khi StringBuilder thì không. Đây là tính năng duy nhất. StringBuilder trong Java nhanh hơn StringBuffer do không đồng bộ hóa các phương thức. Do đó, trong hầu hết các trường hợp, ngoại trừ trong môi trường đa luồng, tốt hơn nên sử dụng StringBuilder cho chương trình Java. Chúng tôi tóm tắt mọi thứ trong một bảng so sánh của ba lớp: Chuỗi so với StringBuffer so với StringBuilderSợi dây Bộ đệm chuỗi Trình tạo chuỗi Khả năng thay đổi
2(KHÔNG)
8(Đúng)
8(Đúng) Khả năng mở rộng`final`(KHÔNG) Bạn có thể nghiên cứu chủ đề này chi tiết hơn ở cấp độ thứ hai của nhiệm vụ Đa luồng Java trong khóa học JavaRush: |