问题描述:

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;

}

...

}

网友答案:

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.

网友答案:

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
相关阅读:
Top