String và StringBuffer

1. Xét tính không thay đổi được:
Tính không thay đổi được của String
Như ta đã biết, String là một đối tượng trong Java. Những đối tượng này không thể thay đổi được. Điều đó có nghĩa là giá trị của chúng một khi đã được khởi tạo thì không thể thay đổi. Ví dụ:
String msg = "Hello"; //msg trỏ tới vùng nhớ 1 có giá trị là "Hello"
 msg += " world";  //msg trỏ tới vùng nhớ 2 có giá trị là "Hello world"

như ví dụ trên, String "Hello" không bị thay đổi. Thay vào đó, một String mới được tạo với giá trị là "Hello world" và msg được gán bằng String mới này.
String literal
Trong Java, String literal được lưu liên tiếp trong bộ nhớ. Nếu ta khởi tạo 2 String với cùng một giá trị mà không dùng từ khóa new thì sẽ chỉ có một đối tượng String được tạo. Ví dụ:
String s1 = "hello";  //s1 trỏ tới vùng nhớ 1 có giá trị là "hello"
 String s2 = "hello";  //s2 cũng trỏ tới vùng nhớ 1 có giá trị là "hello"

Ở đây, s1 và s2 cùng trỏ tới một đối tượng String trong bộ nhớ. Như ta đã nói ở trên, đối tượng String là không thay đổi được. Bởi vậy, nếu ta thay đổi giá trị của s1 thì một đối tượng String mới sẽ được tạo còn đối tượng String ban đầu mà s2 trỏ tới thì sẽ không thay đổi

StringBuffer
StringBuffer là một đối tượng có thể thay đổi được. Điều này có nghĩa là nội dung của String này có thể được thay đổi. Ví dụ:
StringBuffer s = new StringBuffer("123");
 s.append("456"); //vùng nhớ s trỏ tới sẽ có giá trị 123456

Bạn hãy xét ví dụ sau và cho nhận xét:
String s = new String("123");
 s.concat("456");


2. Xét về tốc độ thực hiện việc cộng 2 String
Ta có thể kết luận ngay: Khi thực hiện phép toán cộng 2 xâu thì StringBuffer nhanh hơn String.
Với String, ta cộng 2 xâu như sau:
String str = new String("Hello ");
 str += "world!";

trong khi đó với StringBuffer:
StringBuffer str = new StringBuffer("Hello ");
 str.append("world!");

Bạn không tin? Ta sẽ xem mã Byte-Code của Java để chứng minh điều này:
Với String, mã Byte-Code sẽ như sau:
0 new #7 
3 dup 
4 ldc #2 
6 invokespecial #12 
9 astore_1
10 new #8 
13 dup
14 aload_1
15 invokestatic #23 
18 invokespecial #13 
21 ldc #1 
23 invokevirtual #15 
26 invokevirtual #22 
29 astore_1

trong đó, đoạn code từ 0-9 thực hiện việc lệnh:
String str = new String("Hello ")

còn đoạn code từ 10-26 lại thực hiện lệnh:
str += "world!";

Với StringBuffer, mã Byte-Code sẽ như sau:
0 new #8 
3 dup
4 ldc #2 
6 invokespecial #13 
9 astore_1
10 aload_1 
11 ldc #1 
13 invokevirtual #15 
16 pop

trong đó, đoạn code từ 0-9 thực hiện lệnh:
StringBuffer str = new StringBuffer("Hello ");

còn đoạn code từ 10-16 lại thực hiện lệnh:
str.append("world!");

Bạn có thấy thú vị không?

Nhận xét

Bài đăng phổ biến từ blog này

Kinh nghiệm tạo biểu đồ Use Case

PHÉP TOÁN XOR

Phần mềm hỗ trợ vẽ bản đồ tư duy trên máy tính

Power Designer 12.5