Chào bạn đến với phanlamcoder.blogspot.com!
Ở bài viết này chúng ta sẽ tổng kết về lớp String và tìm hiểu về hai lớp StringBuffer và StringBuilder trong Java:
Như đã nói trong bài Tìm hiểu về đối tượng String,
lớp String Literal là immutable (không thể thay đổi) :
String a = "
Yzenny97"; //tạo ra instance
chứa “Yzenny97” nằm trong String Pool và a sẽ tham
chiếu đến nó.
String b = "
Yzenny97"; //sẽ ko tạo ra instance khác mà b sẽ tham chiếu đến instance ở trên
/*
nghĩa là vì 2 chuỗi này giống nhau nên chương trình
chỉ khởi tạo 1 instance và a,b sẽ tham
chiếu đến nó
*/
a = “JavaString”; //tạo ra instance
mới chứa “JavaString” nằm trong String Pool và a sẽ tham chiếu đến instance này, khi đó instance
chứa “Yzenny97” vẫn còn tồn tại( vì thế biến b vẫn không
thay đổi)
Ghi chú: Các đối tượng String được lưu trữ trong một
khu vực bộ nhớ đặc biệt gọi là String
Constant Pool.
Bonus: Đối tượng String tạo
bằng từ khóa new sẽ lưu trong vùng nhớ heap chứ không phải Pool
như String Literal.
Vì String Literal là không thể thay đổi và làm chậm chương
trình hơn(do khi muốn sửa đổi nội dung nó phải tạo nhiều instance) nên Java cung
cấp thêm 2 lớp đó là: StringBuffer và StringBuilder. 2 lớp này không so sánh chuỗi bằng Equals() được vì nó không ghi đè lên phương thức này
của lớp Object.
Hai lớp này cơ bản là
giống nhau, chỉ khác ở chỗ StringBuffer chỉ
cho 1 luồng tham chiếu, còn StringBuilder cho
nhiều luồng tham chiếu cùng lúc.
Các phương thức chính:
Các phương thức chính:
- append() : nối chuỗi
- reverse(): đảo chuỗi
- insert(int offset, String s) : chèn chuỗi s vào vị trí offset
- replace(int startIndex, int endIndex, String str) : thay thế chuỗi
- delete(int startIndex, int endIndex): xóa chuỗi
Về hiệu suất thực thi
lệnh giữa String và StringBuffer:
public class Test1{
public static String concatWithString() {
String t = "Java";
for (int i=0; i<10000; i++){
t = t + "YZenny";
}
return t;
}
public static String concatWithStringBuffer(){
StringBuffer sb = new StringBuffer("Java");
for (int i=0; i<10000; i++){
sb.append("YZenny ");
}
return sb.toString();
}
public static void main(String[] args){
long startTime = System.currentTimeMillis();
concatWithString();
System.out.println("Thoi gian tieu ton boi noi chuoi voi String: "+(System.currentTimeMillis()-startTime)+"ms");
startTime = System.currentTimeMillis();
concatWithStringBuffer();
System.out.println("Thoi gian tieu ton boi noi chuoi voi StringBuffer: "+(System.currentTimeMillis()-startTime)+"ms");
}
}
Chương
trình trên sẽ cho kết quả dạng:
Thoi gian tieu ton boi noi chuoi voi String: 578ms
Thoi gian tieu ton boi noi chuoi voi StringBuffer: 0ms
Kiểm tra HashCode của
lớp String và StringBuffer trong Java
Như bạn có thể thấy
trong chương trình dưới đây, lớp String trả về giá trị Hashcode mới khi bạn nối
chuỗi nhưng StringBuffer trả về cùng giá trị Hashcode.
public class Test2{
public static void main(String args[]){
System.out.println("Kiem tra Hashcode cua String:");
String str="java";
System.out.println(str.hashCode());
str=str+" YZenny ";
System.out.println(str.hashCode());
System.out.println("Kiem tra Hashcode cua
StringBuffer:");
StringBuffer sb=new StringBuffer("java");
System.out.println(sb.hashCode());
sb.append("YZenny ");
System.out.println(sb.hashCode());
}
}
Chương trình trên sẽ cho
kết quả dạng:
Kiem tra Hashcode cua String:
3254818
229541438
Kiem tra Hashcode cua StringBuffer:
118352462
118352462
Làm tương tự như
trên, ta có thể so sánh được hiệu suất thực thi của StringBuilder và
StringBuffer.
Chúc các bạn học tốt!
Góp ý tại mục bình luận bên dưới 💓