+22

String, StringBuffer và StringBuilder trong java

1.Quan Hệ Thừa Kế

  • Khi làm việc với dữ liệu kiểu text trong Java cung cấp 3 class String, StringBuffer và StringBuilder.
  • Cơ bản về 3 class này như sau:
  • String là không thể thay đổi (immutable), và không cho phép có class con.
  • StringBuffer, StringBuilder có thể thay đổi (mutable)
  • StringBuilder và StringBuffer là giống nhau, nó chỉ khác biệt tình huống sử dụng có liên quan tới đa luồng (Multi Thread). => về tốc độ xử lý StringBuilder là tốt nhất, sau đó StringBuffer và cuối cùng mới là String.

2.String

  • Trong java, String là một class đặc biệt, nguyên nhân là nó được sử dụng một cách thường xuyên trong một chương trình, vì vậy đòi hỏi nó phải có hiệu suất và sự mềm dẻo. Đó là lý do tại sao String có tính đối tượng và vừa có tính nguyên thủy (primitive). Ví Dụ về tính nguyên thủy: Chúng ta hoàn toàn có thể khai báo: String s1 = "Hello word" Bạn cũng có thể sử dụng toán tử + để nối 2 string, toán tử này vốn quen thuộc và sử dụng cho các kiểu dữ liệu nguyên thủy như int, float, double. Tính đối tượng: Vì String là một class, vì vậy nó có thể được tạo ra thông qua toán tử new.
    String object = new String("Hello World");
    
  • Các đối tượng String được lưu trữ trên Heap, yêu cầu quản lý bộ nhớ phức tạp và tốn không gian lưu trữ. Hai đối tượng String có nội dung giống nhau lưu trữ trên 2 vùng bộ nhớ khác nhau của Heap.

Phương thức Equals vs ==

Phương thức equals() sử dụng để so sánh 2 đối tượng, với String nó có ý nghĩa là so sánh nội dung của 2 string. Đối với các kiểu tham chiếu (reference) toán tử == có ý nghĩa là so sánh địa chỉ vùng bộ nhớ lưu trữ của đối tượng.

  • Ví dụ:
String s1 = "Hello";
String s2 = "Hello"; 
String s3 = s1;  
String s4 = new String("Hello");  
String s5 = new String("Hello"); 
 
s1 == s1;         // true
s1 == s2;         // true
s1 == s3;         // true
s1 == s4;         // false
s4 == s5;         // false
 
s1.equals(s3);    // true, cùng nội dung
s1.equals(s4);    // true, cùng nội dung
s4.equals(s5);    // true, cùng nội dung.

Các phương thức của String

STT Methods Description
1 char charAt(int index) Trả về một ký tự tại vị trí có chỉ số được chỉ định.
2 int compareTo(Object o) So sánh một String với một Object khác.
3 int compareToIgnoreCase(String str)) So sánh hai chuỗi .
4 String concat(String str) Nối chuỗi
5 static String copyValueOf(char[] data) Trả về một chuỗi đại diện cho chuỗi ký tự trong mảng quy định.
6 boolean equals(Object anObject) So sánh với một đối tượng
7 int indexOf(int ch) Trả về chỉ số trong chuỗi này xuất hiện đầu tiên của ký tự cụ thể.
8 int indexOf(int ch, int fromIndex) Trả về chỉ số trong chuỗi này xuất hiện đầu tiên của ký tự được chỉ định, bắt đầu tìm kiếm từ chỉ số cụ thể đến cuối..
9 int length() Trả về độ dài chuỗi.
10 String[] split(String regex) Tách chuỗi này thành các chuỗi con, tại các chỗ khớp với biểu thức chính quy cho trước.
11 String substring(int beginIndex) TTrả về một chuỗi ký tự mới là một dãy con của dãy này. Từ chỉ số cho trước tới cuối
12 static String valueOf(primitive data type x) Returns the string representation of the passed data type argument.

Trên đây là 1 số phương thức hay dùng khi làm việc với String. Chi tiết xin xem tại: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

3.StringBuffer vs StringBuilder

  • StringBuilder và StringBuffer là khá giống nhau, điều khác biệt là tất cả các phương thức của StringBuffer đã được đồng bộ, nó thích hợp khi bạn làm việc với ứng dụng đa luồng, nhiều luồng có thể truy cập vào một đối tượng StringBuffer cùng lúc. Trong khi đó StringBuilder có các phương thức tương tự nhưng không được đồng bộ, vì vậy mà hiệu suất của nó cao hơn, bạn nên sử dụng StringBuilder trong ứng dụng đơn luồng, hoặc sử dụng như một biến địa phương trong một phương thức.
STT StringBuffer StringBuilder
1 StringBuffer là đồng bộ (synchronized) tức là luồng an toàn. Điều này có nghĩa là không thể có 2 luồng cùng truy cập phương thức của lớp StringBuffer đồng thời. StringBuilder là không đồng bộ (non-synchronized) tức là luồng không an toàn. Điều này có nghĩa là có 2 luồng cùng truy cập phương thức của lớp StringBuilder đồng thời.
2 StringBuffer không hiệu quả bằng StringBuilder. StringBuilder hiệu quả hơn StringBuffer.
  • Ví dụ về StringBufer:
public class BufferString {
    public static void main(String[] args) {
        StringBuffer buffer = new StringBuffer("Hello");
        buffer.append("Word");
        System.out.println(buffer);
    }
}
  • Ví dụ về StringBuider:
public class BuiderString {
    public static void main(String[] args) {
        StringBuffer buider = new StringBuffer("Hello");
        buffer.append("Word");
        System.out.println(buider);
    }
}

=> Cả 2 đều cho ra output là : HelloWord. Nhưng về tốc độ xử lý, chúng ta hãy đoạn code sau:

public class TestPerform{  
    public static void main(String[] args){  
        long startTime = System.currentTimeMillis();  
        StringBuffer buffer = new StringBuffer("Hello");  
        for (int i=0; i<100000; i++){  
            buffer.append("Word");  
        }  
        System.out.println("StringBuffer is: " + (System.currentTimeMillis() - startTime) + "ms");  
        startTime = System.currentTimeMillis();  
        StringBuilder buider = new StringBuilder("Hello");  
        for (int i=0; i<100000; i++){  
            buider.append("Word");  
        }  
        System.out.println("StringBuilder is: " + (System.currentTimeMillis() - startTime) + "ms");  
    }  
}  

=> Out put: StringBuffer is: 11ms StringBuilder is: 5ms Từ đó t có thể có nhận xét về tốc độ khi xử lý chuỗi của StringBuider sẽ nhanh hơn StringBuffer!

4. Lời kết.

Trên đây chúng ta có thể hiểu rõ hơn về String, StringBuider, StringBuffer. Tùy từng trường hợp mà ta có các cách sử dụng khác nhau sao cho phù hợp và để đảm bảo hiệu suất tốt nhất!..Thanks


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí