Sự khác nhau giữa String và StringBuffer trong Java

Bạn học lập trình Java lâu chưa? Bạn đã code những phần mềm nào với Java mà phải xử lý các chuỗi? Bạn đã biết trong Java có một số lớp liên quan đến chuỗi ( xâu ) và xử lý chuỗi ( VD: String, StringBuilder, StringBuffer, StringTokenizer), có khi nào bạn đặt câu hỏi rằng đã có String sao lại phải có thêm StringBuffer? Hay bạn mặc nhiên dùng String mà không thèm đoái hoài gì đến StringBuffer?! Việc bạn không dùng StringBuffer có thể do bạn chưa hiểu được vì sao lại có lớp này trong Java. Vậy chúng ta cùng tìm hiểu về sự khác biệt giữa các lớp này nhé.

khoa-hoc-lap-trinh-java-1

StringBuffer trong Java

String và StringBuffer là hai class được sử dụng nhiều trong lập trình Java. Trong thực tế dù một chương trình Java nhỏ nhất như HelloWorld cũng phải sử dụng đến String class. String ở khắp mọi nơi, như chương trình HelloWord với main method sử dụng String làm tham số.

Mặc dù nhiều lập trình viên Java đã khá quen thuộc với String, nhưng cũng có không nhiều lập trình viên hiểu rõ về việc sử dụng đúng String class. Ví dụ như, String class là immutable ( tạm dịch là Không thay đổi ), do đó, việc sử dụng không đúng cách ( các thao tác nối chuỗi, in hoa, in thường, cắt chuỗi, … ) sẽ tạo ra rất nhiều các String object. Như vậy, chương trình Java sẽ không được tối ưu.

StringBuffer class thì ngược lại với String class, StringBuffer là mutable ( tạm dịch là Có thể thay đổi ). Mặc dù StringBuffer class không có nhiều tính năng như String class, nhưng nó rất hữu ích cho những thao tác nối chuỗi, cắt chuỗi, … với mục đích năng cao hiệu năng của chương trình. Như vậy, bạn sẽ thắc mắc rằng, giữa String và StringBuffer trong Java có gì khác nhau? Tại sao không kết hợp hai class này lại với nhau? …

Sự khác nhau giữa String và StringBuffer trong Java

Dưới đây là danh sách những điểm khác nhau giữa String và StringBuffer trong Java, bạn chỉ cần ghi nhớ những index này để sử dụng hai class này phù hợp trong chương trình Java của mình.

– Thứ nhất, như ở trên đã giới thiệu: String class là immutable và StringBuffer class là mutable. Điều này có nghĩa là mọi thao tác( ví dụ như cắt chuỗi, cộng chuỗi, in hoa, in thường, …) trên String sẽ tạo ra một class mới còn StringBuffer thì không.

– Method StringBuffer.append() được sử dụng để String concatenation trong Java.

– Khởi tạo một StringBuffer object trong Java rất dễ dàng, nó sử dụng một String object làm giá trị input. Và ngược lại, khởi tạo một String object trong Java cũng rất dễ dàng, sử dụng method toString() của StringBuffer class.

– StringBuffer và String trong Java là không cùng phân cấp. Nó có nghĩa là bạn không thể cast từ String sang StringBuffer và ngược lại. Nếu cứ cố tình, một exception sẽ được văng ra là ClassCastException.

– String literals được lưu trữ trong String Pool, trong khi StringBuffer không có một nơi lưu trữ tương tự, nó được lưu vào heap.

– Thực hiện nối chuỗi, String sẽ sử dụng toán phép +, trong khi StringBuffer sử dụng method StringBuffer.append() để làm việc này.

– Về hiệu năng thực thi nối chuỗi, StringBuffer có điểm tối ưu cao hơn so với String. Có nghĩa là StringBuffer thực hiện nhanh hơn so với String.

Với những điểm khác biệt trông thấy giữa String và StringBuffer trong Java, bạn sẽ có thể áp dụng tối ưu vào các chương trình Java của mình để đạt được điểm tối ưu hóa cao nhất. Ngoài ra, đây còn là một trong những câu hỏi Java Core mà hầu hết các nhà tuyển dụng đều hỏi ứng viên của mình.

Nhận xét