2012-10-16 16 views
6

Sau đây là một constructor của Chuỗi lớplàm thế nào có thể 'originalValue.length> size' xảy ra trong hàm tạo String?

public String(String original) { 
int size = original.count; 
char[] originalValue = original.value; 
char[] v; 
if (originalValue.length > size) { 
    // The array representing the String is bigger than the new 
    // String itself. Perhaps this constructor is being called 
    // in order to trim the baggage, so make a copy of the array. 
     int off = original.offset; 
     v = Arrays.copyOfRange(originalValue, off, off+size); 
} else { 
    // The array representing the String is the same 
    // size as the String, so no point in making a copy. 
    v = originalValue; 
} 
this.offset = 0; 
this.count = size; 
this.value = v; 
} 

Nhưng, tôi tự hỏi có bao

if (originalValue.length > size) 

có thể xảy ra? Nhận xét cho biết 'cắt hành lý', hành lý hành lý là gì?

+3

Nhìn vào các hàm tạo và phương thức khác của lớp Chuỗi này. Có cách nào để tạo ra một chuỗi với một không gian được phân bổ lớn hơn trong mảng hơn là những gì cần thiết cho nội dung thực tế? –

Trả lời

4

Hãy xem chuỗi con và bạn sẽ thấy điều này có thể xảy ra như thế nào.

Lấy ví dụ String s1 = "Abcd"; String s2 = s1.substring(3). Ở đây s1.size() là 1, nhưng s1.value.length là 4. Điều này là do s1.value là giống như s2.value. Điều này được thực hiện bởi các lý do hiệu suất (chuỗi con đang chạy trong O (1), vì nó không cần phải sao chép nội dung của chuỗi gốc).

Sử dụng chuỗi con có thể dẫn đến rò rỉ bộ nhớ. Giả sử bạn có một Chuỗi dài thực sự và bạn chỉ muốn giữ một phần nhỏ của nó. Nếu bạn chỉ sử dụng chuỗi con, bạn sẽ thực sự giữ nguyên nội dung chuỗi gốc trong bộ nhớ. Làm String snippet = new String(reallyLongString.substring(x,y)), ngăn bạn lãng phí bộ nhớ sao lưu một mảng char lớn không còn cần thiết nữa.

Xem thêm What is the purpose of the expression "new String(...)" in Java? để được giải thích thêm.

+1

Trong 'Chuỗi s1 =" abcd "; Chuỗi s2 = s1.substring (3) ', s1, s2 thực sự giữ cùng một mảng giá trị' {'a', 'b', 'c', 'd'} '. Sự khác biệt giữa chúng là ** offset ** và ** count **. String (String.substring (...)) phương pháp có thể tránh rò rỉ bộ nhớ khi cố gắng để có được chuỗi con của một lớn. Cảm ơn ~ – sun

Các vấn đề liên quan