12/08/2018, 14:30

Java String (P2)

Xin chào các bạn! Bài viết lần này sẽ tiếp nối bài viết resume về Java String của phần trước. Nếu chưa đọc qua phần trước, bạn có thể theo dõi tại đây: Java String (P1). Ở phần trước mình đã nêu ra cách tạo String, JVM sẽ quản lý bộ nhớ để lưu trữ và truy xuất đối tượng String của chúng ta như ...

Xin chào các bạn!

Bài viết lần này sẽ tiếp nối bài viết resume về Java String của phần trước. Nếu chưa đọc qua phần trước, bạn có thể theo dõi tại đây: Java String (P1).

Ở phần trước mình đã nêu ra cách tạo String, JVM sẽ quản lý bộ nhớ để lưu trữ và truy xuất đối tượng String của chúng ta như thế nào, và String là Immutable object(không thể thay đổi). Hãy tạm thời bỏ qua những thao tác cơ bản trên String như so sánh, nối chuỗi, substring, ... Phần này chúng ta sẽ thảo luận thêm về mutable String đó chính là StringBuffer và StringBuilder class.

StringBuffer Class Java StringBuffer class được sử dụng để khởi tạo đối tượng String mutable (có thể thay đổi được). StringBuffer class tương tự với String class ngoại trừ một điểm nó là mutable (có thể thay đổi được).

  • Note: Java StringBuffer class là đối tượng thread-safe có nghĩa là nhiều thread thì không thể truy cập nó đồng thời.*

Mutable string là gì?

String mà có thể thay đổi gía trị thì được biết đến là mutable string. StringBuffer và StringBuilder classes đều được sử dụng để tạo mutable string. Sau đây là một vài ví dụ về sử dụng StringBuffer:

  1. StringBuffer append()
class A{  
public static void main(String args[]){  
StringBuffer sb=new StringBuffer("Hello ");  
sb.append("Java");//now original string is changed  
System.out.println(sb);//prints Hello Java  
}  
}  
  1. StringBuffer insert()
class A{  
public static void main(String args[]){  
StringBuffer sb=new StringBuffer("Hello ");  
sb.insert(1,"Java");//now original string is changed  
System.out.println(sb);//prints HJavaello  
}  
}  
  1. StringBuffer replace()
class A{  
public static void main(String args[]){  
StringBuffer sb=new StringBuffer("Hello");  
sb.replace(1,3,"Java");  
System.out.println(sb);//prints HJavalo  
}  
}  
  1. StringBuffer delete()
  class A{  
  public static void main(String args[]){  
  StringBuffer sb=new StringBuffer("Hello");  
  sb.delete(1,3);  
  System.out.println(sb);//prints Hlo  
  }  
  }  
  1. StringBuffer reverse()
    class A{  
    public static void main(String args[]){  
    StringBuffer sb=new StringBuffer("Hello");  
    sb.reverse();  
    System.out.println(sb);//prints olleH  
    }  
    }  

StringBuilder Class Java StringBuilder class được sử dụng để khởi tạo đối tượng String mutable (có thể thay đổi được). StringBuffer class tương tự với StringBuffer class ngoại trừ một điểm nó là non-synchronized (nhiều thread có thể truy cập đồng thời được). Sau đây là một vài ví dụ về sử dụng StringBuilder:

  • Note: Java StringBuffer class là đối tượng non-synchronized có nghĩa là nhiều thread thì có thể truy cập nó đồng thời.*
  1. StringBuilder append()
    class A{  
    public static void main(String args[]){  
    StringBuilder sb=new StringBuilder("Hello ");  
    sb.append("Java");//now original string is changed  
    System.out.println(sb);//prints Hello Java  
    }  
    }  
  1. StringBuilder insert()
    class A{  
    public static void main(String args[]){  
    StringBuilder sb=new StringBuilder("Hello ");  
    sb.insert(1,"Java");//now original string is changed  
    System.out.println(sb);//prints HJavaello  
    }  
    }  
  1. StringBuilder replace()
    class A{  
    public static void main(String args[]){  
    StringBuilder sb=new StringBuilder("Hello");  
    sb.replace(1,3,"Java");  
    System.out.println(sb);//prints HJavalo  
    }  
    }  
  1. StringBuilder delete()
    class A{  
    public static void main(String args[]){  
    StringBuilder sb=new StringBuilder("Hello");  
    sb.delete(1,3);  
    System.out.println(sb);//prints Hlo  
    }  
    }  
  1. StringBuilder reverse()
    class A{  
    public static void main(String args[]){  
    StringBuilder sb=new StringBuilder("Hello");  
    sb.reverse();  
    System.out.println(sb);//prints olleH  
    }  
    }  

Khác biệt giữa String và StringBuffer

STT String StringBuffer
1 String là immutable StringBuffer là mutable
2 String chậm hơn và dùng nhiều bộ nhớ hơn khi bạn nối chuỗi bởi vì mỗi lần nó đều tạo instance mới StringBuffer nhanh hơn và dùng ít bộ nhớ hơn khi bạn nối chuỗi
3 String class overrides phương thức equals() của Object class. Do đó bạn có thể so sánh gía trị của 2 string bằng phương thức equals() StringBuffer class không override phương thức equals() của Object class

Test hiệu năng nối chuỗi của String và StringBuffer

public class ConcatTest{  
    public static String concatWithString()    {  
        String t = "Java";  
        for (int i=0; i<10000; i++){  
            t = t + "Tpoint";  
        }  
        return t;  
    }  
    public static String concatWithStringBuffer(){  
        StringBuffer sb = new StringBuffer("Java");  
        for (int i=0; i<10000; i++){  
            sb.append("Tpoint");  
        }  
        return sb.toString();  
    }  
    public static void main(String[] args){  
        long startTime = System.currentTimeMillis();  
        concatWithString();  
        System.out.println("Time taken by Concating with String: "+(System.currentTimeMillis()-startTime)+"ms");  
        startTime = System.currentTimeMillis();  
        concatWithStringBuffer();  
        System.out.println("Time taken by Concating with  StringBuffer: "+(System.currentTimeMillis()-startTime)+"ms");  
    }  
}  

Time taken by Concating with String: 578ms

Time taken by Concating with StringBuffer: 0ms

Khác biệt giữa StringBuffer và StringBuilder

STT StringBuffer StringBuilder
1 StringBuffer thì synchronized (thread safe). Có nghĩa là 2 thread không thể đồng thời gọi phương thức của StringBuffer StringBuilder thì non-synchronized (không thread safe). Có nghĩa là 2 thread có thể đồng thời gọi phương thức của StringBuilder
2 StringBuffer không hiệu qủa bằng StringBuilder. StringBuilder hiệu qủa hơn StringBuffer.

Test hiệu năng của StringBuffer và StringBuilder

public class ConcatTest{  
    public static void main(String[] args){  
        long startTime = System.currentTimeMillis();  
        StringBuffer sb = new StringBuffer("Java");  
        for (int i=0; i<10000; i++){  
            sb.append("Tpoint");  
        }  
        System.out.println("Time taken by StringBuffer: " + (System.currentTimeMillis() - startTime) + "ms");  
        startTime = System.currentTimeMillis();  
        StringBuilder sb2 = new StringBuilder("Java");  
        for (int i=0; i<10000; i++){  
            sb2.append("Tpoint");  
        }  
        System.out.println("Time taken by StringBuilder: " + (System.currentTimeMillis() - startTime) + "ms");  
    }  
}  

Time taken by StringBuffer: 16ms

Time taken by StringBuilder: 0ms

Qua 2 bài viết về Java String hy vọng phần nào đó sẽ hữu ích cho các bạn.

0