Viblo Learning
+5

Java String (P1)

Xin chào các bạn!

String là một kiểu dữ liệu rất cơ bản và thường xuyên được sử dụng trong Java, nhưng cũng có lẽ vì nó quá cơ bản và dễ sử dụng nên đôi khi ta có thể không để ý hoặc quên mất những đặc tính của nó 😄. Qua bài viết này mình sẽ điểm lại một số đặc tính rất dễ bị quên lãng của Java String.

Java String

Trong java, String cơ bản là một đối tượng đại diện cho chuỗi các ký tự được xắp xếp theo một trật tự nhất định. Ví dụ:

char[] ch={'j','a','v','a','s','t','r','i','n','g'};
String s=new String(ch);

thì tương tự với

String s="javastring";

Lớp Java String cung cấp rất nhiều phương thức để thực hiện các thao tác trên chuỗi như compare(), concat(), equals(), split(), length(), replace(), compareTo(), intern(), substring(), ...

Lớp java.lang.String implements Serializable, Comparable và CharSequence interfaces.

string-implements.png

CharSequence Interface

CharSequence interface được sử dụng để đại diện cho chuỗi các ký tự được xắp xếp theo một trật tự nhất định. Nó được thực thi bởi các lớp String, StringBuffer and StringBuilder. Có nghĩa là, chúng ta có thể tạo String trong Java bằng cách sử dụng 3 lớp kể trên.

charsequence.png

Java String là immutable object, tức là nó không thể thay đổi giá trị. Bất cứ khi nào chúng ta thay đổi giá trị một String, một instance mới sẽ được tạo ra. Đối với đối tượng String có thể thay đổi, bạn có thể sử dụng các lớp StringBuffer và StringBuilder.

Chúng ta sẽ thảo luận về immutable String sau. Bây giờ là lúc để xem làm thế nào để tạo được String object (Cái này dùng suốt đơn giản quá 😛)

Làm sao để tạo được String object? (Ặc, cái này cũng phải viết vào đây sao?)

Chúng ta có 2 cách để tạo String object.

1)String literal.

2)Bằng từ khóa new

1) String literal

Java String literal được tạo bởi cách khai báo dùng dấu ngoặc kép. Ví dụ:

     String s="java string";

Mỗi khi bạn tạo một String literal, JVM sẽ kiểm tra trong String constant pool trước. Nếu String đã tồn tại trong pool, một tham chiếu đến String trong pool sẽ được trả về cho bạn. Nếu String chưa tồn tại trong pool, đơn giản là một instance mới của String sẽ được tạo và đặt vào pool, sau đó tham chiếu đến String trong pool sẽ được trả về. Nghe thì có vẻ hơi loằng ngoằng, nhưng chờ chút, hãy nhìn hình minh họa dưới đây bạn sẽ OK ngay thôi 😄.

Ví dụ:

    String s1="Welcome";
    String s2="Welcome";//sẽ không khởi tạo instance mới

string.png

Ở ví dụ trên, chỉ duy nhất 1 object String sẽ được tạo ra. Đầu tiên JVM sẽ không tìm thấy object string với giá trị "Welcome" nào trong string constant pool, vì vậy nó sẽ tạo một object string mới. Sau đó, nó sẽ tìm thấy object string với giá trị "Welcome" trong pool, vì vậy nó sẽ không tạo mới object nào, mà đơn thuần chỉ trả về tham chiếu đến cùng instance đã nằm trong pool.

Lưu ý String object được lưu trong một vùng bộ nhớ đặc biệt được biết đến là string constant pool

Vậy tại sao Java lại phải sử dụng đến khái niệm string literal nhỉ??? Đơn giản thôi, để làm cho bộ nhớ của Java hiệu quả hơn (vì không có đối tượng mới được tạo ra nếu nó đã tồn tại trong string constant pool).

2) Bằng từ khóa new

    String s=new String("Welcome");//tạo ra 2 object và 1 biến tham chiếu

Trong trường hợp này, JVM sẽ tạo ra một string object mới trong bộ nhớ heap(không phải trong pool) và một literal string "Welcome" sẽ được tạo trong string constant pool. Biến tham chiếu sẽ tham chiếu đến string object mới trong bộ nhớ heap(không phải trong pool).

Immutable String trong Java

Ở trên có đề cập đến Immutable String, giờ ta sẽ cùng thảo luận xem nó là gì? và vì sao lại như vậy nhé.

Vậy trước hết hãy cùng làm rõ Immutable là gì? Immutable đơn giản chỉ là unmodifiable or unchangeable (không thể thay đổi).

Ví dụ về String Immutable:

class Testimmutablestring{
    public static void main(String args[]){
       String s="Sachin";
       s.concat(" Tendulkar");//Nối Tendulkar vào sau Sachin
       System.out.println(s);//Chỉ in ra Sachin bởi vì string là immutable object
     }
}

Hãy nhìn vào hình minh họa dưới đây, mọi vấn đề sẽ được làm rõ: ở đây Sachin không được thay đổi nhưng một object mới được tạo với giá trị thay đổi.

string2.png

Bạn có thể nhìn thấy có 2 object string được tạo ra, nhưng biến tham chiếu vẫn trỏ vào "Sachin" chứ không trỏ vào "Sachin Tendulkar", đó chính là vì String là Immutable object(không thể thay đổi).

Nhưng nếu chúng ta gán tham chiếu rõ ràng tới object mới được tạo, nó sẽ trỏ đến "Sachin Tendulkar" object như ví dụ dưới.

class Testimmutablestring1{
    public static void main(String args[]){
        String s="Sachin";
        s=s.concat(" Tendulkar");
        System.out.println(s);//in ra Sachin Tendulkar
    }
}

Lưu ý ở đây là object Sachin sau tất cả thì vẫn không bị thay đổi.

Vậy tại sao string object là immutable trong java? Bởi vì java sử dụng khái niệm string literal. Giả sử có 5 biến tham chiếu, tất cả đều trỏ đến object string "sachin". Nếu 1 tham chiếu nào đó thay đổi được giá trị của object, nó sẽ ảnh hưởng đến tất cả các tham chiếu còn lại cùng trỏ đến object string đó => "hỏng bét 😄".

Cảm ơn các bạn đã đọc P1 trong 2 phần resume về Java String. P2 sẽ có trong tháng tới 😄 😛.


All Rights Reserved