2013-08-17 29 views
5

Tôi đã cố gắng hiểu cách java String được triển khai. Mã số jdk7 source bên dưới hiển thị séc cho originalValue.length > size. Tôi không thể biết cách/khi nào nó thành sự thật. Tôi đã cố gắng sử dụng trình gỡ lỗi nhật thực trên một số chuỗi java câu lệnh tạo, nhưng kiểm tra này không bao giờ đúng. Có thể đưa ra một đối số String để kiểm tra này đúng không?java String constructor logic

public final class String{ 
    /** The value is used for character storage. */ 
    private final char value[]; 

    /** The offset is the first index of the storage that is used. */ 
    private final int offset; 

    /** The count is the number of characters in the String. */ 
    private final int count; 

    /** Cache the hash code for the string */ 
    private int hash; // Default to 0 

    /** 
    * Initializes a newly created {@code String} object so that it represents 
    * the same sequence of characters as the argument; in other words, the 
    * newly created string is a copy of the argument string. Unless an 
    * explicit copy of {@code original} is needed, use of this constructor is 
    * unnecessary since Strings are immutable. 
    * 
    * @param original 
    *   A {@code 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; 
    } 
... 
} 

Trả lời

3

Hãy nhìn vào đoạn mã này:

String s1 = "123456789"; 
String s2 = new String(s1.substring(0, 2)); 

Các constructor thứ hai sẽ phù hợp với điều kiện. Bí quyết là trong phương pháp chuỗi con. Nó không tạo ra một chuỗi con thực sự, mà đúng hơn là sao chép mảng cơ bản và chỉ đặt các ranh giới mới cho nó. Ý tưởng xây dựng một chuỗi mới là tạo một bản sao của một chuỗi, không chỉ gán cùng một mảng. Đó là lý do tại sao lấy chuỗi con nhỏ từ một chuỗi lớn có thể dẫn đến ngoại lệ OOM. Bởi vì để đại diện cho một mảng nhỏ thông tin mảng lớn được sử dụng.

+0

là s2.length> 3 ở đây? – Karthikeyan

+0

Có, vì nó là cùng một mảng char bên dưới (không chỉ là một bằng nhau). – oddparity

+0

Trong trường hợp này mảng s2 's underling sẽ có kích thước hai, không chín. – Mikhail

3

Bạn có thể gỡ lỗi này. Value đại diện cho cơ bản char[]. count đại diện cho view

String s = new String("Hello "); //value= [H, e, l, l, o, , , ] count=8 

String os = s.trim(); //value= [H, e, l, l, o, , , ] count=5 
Các vấn đề liên quan