Tổng kết về lớp String và tìm hiểu về hai lớp StringBuffer và StringBuilder trong Java



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:
java string


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:

  • 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 💓