5

I was trying to understand how a java String was implemented.The jdk7 source code below shows a check for originalValue.length > size .I cant figure out how/when it would come true.I tried to use eclipse debugger on some java String creation statements,but this check was never true.Is it possible to devise a String argument which would make this check true?

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;
    }
...
}
0

2 Answers 2

3

Have a look at this piece of code:

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

The second constructor will match condition. The trick is in substring method. It does not make a real substring, but rather copies underlying array and just sets new boundaries to it. The idea of constructing a new string is to make a copy of a string, not just assign the same array. That`s actually why taking small substring from a big string might lead to OOM exception. Because to represent a small piece of information big array is used.

Sign up to request clarification or add additional context in comments.

3 Comments

is s2.length > 3 here ?
Yes, as it is the same char array underneath (not just an equal one).
In this case s2`s underling array will be of size two, not nine.
3

You can debug this. Value represents the underlying char[]. count represents the 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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.