[英]java String constructor logic
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? 我试图了解
java String
是如何实现的。下面的jdk7 source
代码显示了对originalValue.length > size
的检查。我无法弄清楚它是如何实现的。我试图在一些java String创建时使用eclipse调试器语句,但这个检查从来都不是真的。是否有可能设计一个String参数,使这个检查成立?
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.
这就是为什么从大字符串中获取小子串可能导致OOM异常的原因。 Because to represent a small piece of information big array is used.
因为代表一小块信息使用大数组。
You can debug this. 你可以调试这个。
Value
represents the underlying char[]
. Value
表示底层char[]
。 count
represents the view
count
代表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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.