30/09/2018, 18:24

String và array đều là object trong java, vậy tại sao khi truyền vào hàm thì có thể thay đổi đc giá trị của array còn string thì vẫn không thay đổi?

String và array đều là object trong java. Vậy tại sao khi mình truyền vào các hàm thì có thể thay đổi đc giá trị của array còn string thì vẫn không thay đổi. Có phải do String là object không thay đổi không?
Cám ơn ae ghé top :))

TTmagic viết 20:31 ngày 30/09/2018

Bạn xem thêm topic này: 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 ở đó.

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.

viết 20:31 ngày 30/09/2018

cám ơn bạn String is immutable object

... viết 20:24 ngày 30/09/2018

Mình có đọc qua bài viết nào đó quên mất link, trong đó nói chỉ có thể thay đổi giá trị String nếu nó là thuộc tính của class, tương tự như thế này:

Ideone.com

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.

viết 20:25 ngày 30/09/2018

ví dụ của bạn đưa, String không thay đổi mà.

Bài liên quan
0