Như tiêu đề,anh chị nào giải thích cho e biết những điểm khác nhau của String,StringBuilder và StringBuffer trong Java với ạ.Em cảm ơn ạ
Những điểm khác nhau của String, StringBuilder và StringBuffer trong Java
-
String: là một kiểu dữ liệu text trong java. Một chuỗi String có thể dài vô tận (nếu HEAP đủ lớn).
- Đặc điểm của String là immutable, tức là String đã tạo ra thì không bao giờ thay đổi giá trị.
VD: String str1 = “ABC”; lệnh này tương đương với String str1 = new String(“ABC”);
-> Sẽ tạo ra 1 String Object với gia trị là ABC, Object này sẽ không bao giờ thay đổi giá trị bằng bất cứ cách nào.
Đó là tại sao tất cả các hàm của String như subString(), toLowerCase()… đều không thay đổi giá trị của nó, mà nó return 1 String mới.
Vậy chuyện gì sẽ xảy ra nếu chúng ta thêm đoạn code: String str1 = str1 + “D”;
Đầu tiên Java sẽ tạo ra 1 String Object mới với giá trị là D, sau đó với toán tử +, một String mới nữa sẽ được tạo ra với giá trị là tổng của chúng (ABCD).
-> biến str1 sẽ trỏ đến String Object mới này. String Object với giá trị “ABC” ban đầu vẫn còn tồn tại ở đó.
- Đặc điểm của String là immutable, tức là String đã tạo ra thì không bao giờ thay đổi giá trị.
-
StringBuilder, StringBuffer: Theo tính chất của String ở trên, vậy cứ khi nào bạn + 2 hay nhiều String, nó lại tạo ra rất nhiều Object mới. StringBuilder và StringBuffer sinh ra để giải quyết vấn đề này. Bạn sẽ chỉ tạo ra duy nhất 1 Object StirngBuilder hay StringBuffer, Java sẽ mặc định cấp phát 32 hay 64 bit cho nó (mình không nhớ rõ lắm). Mỗi khi bạn thao tác trên Object này (append, remove…) thì giá trị của Object thay đổi mà không tạo ra Object khác. Nếu vượt quá 32 bit, nó sẽ tự động extend vùng cấp phát theo sỗ mũ của 2 (32=2^5, 64=2^6, 128=2^7…).
Sự khác nhau duy nhất giữa StringBuilder và StringBuffer là tất cả các hàm của StringBuffer là Synchronize, StringBuilder thì không. Còn để giải thích Synchronize là gì thì bạn google hoặc hỏi ở chỗ khác nhé :d.
Tớ giải thích dài dòng, hi vọng bạn hiểu :d.
String trong Java rất hay và thú vị.
Ngoài String thì còn có Integer, Double, Long, … cũng đều là Immutable.
Tất nhiên Java nó không tự nhiện sinh ra kiểu Immutable Object, nó có mục đích cả.
Mục đích như thế nào thì t sẽ nói sau ở topic khác hehe =))
Vừa nãy em có đọc trên Javarevisited mà không hiểu rỏ lắm,giờ thì em thông rồi…Cảm ơn anh nhiều nha…
String s = “a” và String s = new String(“a”) không giống nhau nha bạn. Google String pool.
Mình đang không nói đến vấn đề String pool ở đây
Chán thật
Do StringBuffer không ghi đè method equals() của class Object Vậy muốn so sánh 2 đối tượng kiểu
StringBuffer thì phải làm sao anh @CuongNguyen
Em nên hiểu nó là 1 wraper class của String, nên so sánh 2 StringBuffer không có ý nghĩa gì cả.
Vì thế nó mới không ghi đè equals() method.
Nếu có so sánh thì so sánh giá trị String của nó:
stringBuffer1.toString().equals(stringBuffer2.toString())
anh ơi cho em hỏi là nếu “ABC” nó còn ở đó thì bằng cách nào mình lại được sử dụng nó, hay nó còn có thể làm được việc gì trong trường hợp nào ạ?
bạn nên tìm hiểu về object life cycle trong java. những cái căn bản này là cần thiết. khi một đối tượng không còn được tham chiếu nữa thì ta không còn cách nào tìm lại nó và nó sẽ dc xử lí bởi bộ dọn rác java - GC
em có biết đến cơ chế Garbage Collection của java rồi, thấy giới thiệu từ lúc mới học java nhưng chưa rõ trong trg hợp nào, thì ra là ở đây, em cảm ơn nha
không chỉ khi không còn được tham chiếu nó mới được dọn, mà khi ra khỏi" scope- phạm vi" của nó nó cũng sẽ bị dọn. vi dụ khi bạn tạo một đối tượng trong một phương thức, khi bạn triệu hồi phương thức xong nó cũng sẽ bị dọn đi . luu ý rặng dọn đi ở đây chỉ là trạng thái được thằng GC xác nhận là “rác” thôi chứ bạn không thể biết chính xác khi nào nó được loại bỏ, việc này được thực hiện bơi JVM bằng 1 low_ thread và có tính tuần tự
không có biến nào trỏ đến nó nữa thì garbage collection sẽ tự xóa nó để giải phóng bộ nhớ