String 的构造方法String(String original)

ZangXT 2008-10-04 11:34:14
看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.
v = new char[size];
System.arraycopy(originalValue, original.offset, v, 0, 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;
}

看文档和其他书一般是不建议我们使用这个构造方法的,因为没有必要.
代码里我不明白的是if (originalValue.length > size)这个分支,会有这种情况出现吗?count和字符数组的长度不总是相等的吗?
为什么要这么设计呢?
谢谢回答.
...全文
477 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellowql 2011-10-08
  • 打赏
  • 举报
回复
同意11楼和5楼的观点!
dreamhunter_lan 2008-10-06
  • 打赏
  • 举报
回复
不建议使用这构造方法是不想把String放在heap中,字符串放在DataSegment中就好了
内存泄漏 2008-10-04
  • 打赏
  • 举报
回复
因为里面有个offset.所以两者的值有可能不同..
無名VF 2008-10-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bao110908 的回复:]
这个与其中的 offset 有关,你找一下,应该可以找到这个构造:


Java codeString(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}



这个构造是在内部使用的,一般用在 substring 方法中,为了能让 substring 之后的字符串
能共享 substring 之前字符数组中的值,就弄了个 offset。

比如:字符串 "012345" 这个字符串的 offset 为 0,…
[/Quote]
....
西瓜 2008-10-04
  • 打赏
  • 举报
回复
正在努力学习中。。。
帮顶了。。。
justinavril 2008-10-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bao110908 的回复:]
也就是说在使用 substring 或者 trim 之后,其内部存储的值还是之前字符串的,
改变的只是 offset 偏移量和 count 字符数量。

也不知道我的理解是否正确,我也是刚才到源代码里翻来的,不对之处请指正。

现学了一下,感觉这个类挺复杂的,构造非常之多,竟有 16 个构造方法,光这些构
造就让人头大了,呵呵。
[/Quote]
估计是大企鹅也跟你一样,有钻研精神!
  • 打赏
  • 举报
回复
也就是说在使用 substring 或者 trim 之后,其内部存储的值还是之前字符串的,
改变的只是 offset 偏移量和 count 字符数量。

也不知道我的理解是否正确,我也是刚才到源代码里翻来的,不对之处请指正。

现学了一下,感觉这个类挺复杂的,构造非常之多,竟有 16 个构造方法,光这些构
造就让人头大了,呵呵。
justinavril 2008-10-04
  • 打赏
  • 举报
回复
嗯 估计是大企鹅把count和value弄混了...很少看见大企鹅提问啊...
  • 打赏
  • 举报
回复
这个与其中的 offset 有关,你找一下,应该可以找到这个构造:

String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}


这个构造是在内部使用的,一般用在 substring 方法中,为了能让 substring 之后的字符串
能共享 substring 之前字符数组中的值,就弄了个 offset。

比如:字符串 "012345" 这个字符串的 offset 为 0,count 为 6,value 值为 012345 的字符数组。
当调用 "012345".substring(2, 4) 时 offset 值为 2,count 为 2,value 值与 "012345" 共享同一个 value。

这时所产生的 "23" 字符串的 count 就为 2,而它的 value 仍然是 "012345"。
WIN_ANGEL 2008-10-04
  • 打赏
  • 举报
回复
个人感觉可能只是为了保险所以才那么写的吧 就好像有时候我们写程序的时候也会这样 凭判断和推算都感觉不会有这种情况 但是又不敢完全确定(比如说哥德巴赫猜想 随便想个数代入都可以成立 但是目前也只证明到“1+2” 因为不能完全证明“1+1”所以还不能说哥德巴赫猜想就是对的) 所以为了保险就貌似“画蛇添足”般的把判断条件写上 个人意见 我是一只小菜鸟~继续飞~
WIN_ANGEL 2008-10-04
  • 打赏
  • 举报
回复
帮顶一下~我是一只小菜鸟~飞啊飞~
ZangXT 2008-10-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bao110908 的回复:]
也就是说在使用 substring 或者 trim 之后,其内部存储的值还是之前字符串的,
改变的只是 offset 偏移量和 count 字符数量。

也不知道我的理解是否正确,我也是刚才到源代码里翻来的,不对之处请指正。

现学了一下,感觉这个类挺复杂的,构造非常之多,竟有 16 个构造方法,光这些构
造就让人头大了,呵呵。
[/Quote]
是这么回事,呵呵,谢谢了.
看其他的几个例子的时候知道char数组是共享的,到这里就没转过这个弯来.
我太笨了 .原来看代码里的注释,一开始还感觉是不是写类库的人也不确定?
如果是这种if条件执行的话,字符数组也复制了一遍,真麻烦.
设计类库要思考的问题太多了.
  • 打赏
  • 举报
回复
路过,学习一下!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧