String类是如何初始化的?

bugxing 2010-10-15 09:13:19
String s="abc";
String s1=new String("abc");
以上两句是调用哪种构造函数完成初始化的呢?
...全文
362 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵磊丶 2012-07-18
  • 打赏
  • 举报
回复
楼主有结论了么
panhuaicheng 2010-10-16
  • 打赏
  • 举报
回复
Java文档里有,很详细,可以自己去看哈
bugxing 2010-10-16
  • 打赏
  • 举报
回复
高手支个招呢
bugxing 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 waiter081 的回复:]
自己去哪个src源文件吧!再或者单步调试看看!
[/Quote]


如何单步调试源代码呢?
比如我想调试,String类中String(String original)构造函数时,应该如何操作呢
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;
}
Panxi_He 2010-10-16
  • 打赏
  • 举报
回复
一个是常量,一个是对象
bugxing 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wangyuxi1989 的回复:]
引用楼主 bugxing 的回复:
String s="abc";
String s1=new String("abc");
以上两句是调用哪种构造函数完成初始化的呢?

String s="abc":
在栈中先创建一个字符串引用s,然后在字符串常量池里找有没有abc,如果找到就将s指向这个abc(引用),如果没有就新创建一个abc并将s指向它
String s1=new Strin……
[/Quote]

你可能误解了我的意思,大概是我没有描述清楚
原本我是想看看String中的compareTo方法是如何实现的,源码如下:

public int compareTo(String anotherString) {
int len1 = count;
int len2 = anotherString.count;
int n = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;

if (i == j) {
int k = i;
int lim = n + i;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
} else {
while (n-- != 0) {
char c1 = v1[i++];
char c2 = v2[j++];
if (c1 != c2) {
return c1 - c2;
}
}
}
return len1 - len2;
}

接着我就想搞清楚compareTo方法中使用的String类的变量初值是多少,如count,value,offset
我开始查看构造函数是如何初始化这些变量的,结果发现完全没能搞明白,

所以就有了本贴开始处提问的String s="abc";是如何初始化的
也就是想知道用哪个构造函数,怎么给count,value,offset这些变量赋值的
wangyuxi1989 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 bugxing 的回复:]
String s="abc";
String s1=new String("abc");
以上两句是调用哪种构造函数完成初始化的呢?
[/Quote]
String s="abc":
在栈中先创建一个字符串引用s,然后在字符串常量池里找有没有abc,如果找到就将s指向这个abc(引用),如果没有就新创建一个abc并将s指向它
String s1=new String("abc"):
在栈中先创建一个字符串引用s,然后在堆中创建一个初始值为abc的String对象,最后将s指向这个对象
区别就在于s和s1使用"=="操作符
用第一种方法创建的两个abc的String对象实际指向同一个abc,所以==判断引用是否指向同一个对象结果为true
第二种方法创建两个abc的String对象是在堆中分别开辟空间创建的两个对象,用==判断引用是否指向同一个对象结果为false
用第一种方式创建String对象有利于节省内存空间,在一定程度上也能提高运行速度(在堆中开辟空间会加重程序负担)
zhanghs886 2010-10-15
  • 打赏
  • 举报
回复
两个的内存指向不一样吧……
bugxing 2010-10-15
  • 打赏
  • 举报
回复
String s2=new String(s);
调用String(String original)完成初始化,

那 这两种类型是如何初始化的呢?
String s="abc";
String s1=new String("abc");

其实是在查看String源代码时,搞不明白,String类的变量是如初始化的,才发觉原来连上面的问题也没明白
waiter081 2010-10-15
  • 打赏
  • 举报
回复
自己去哪个src源文件吧!再或者单步调试看看!
yyp025 2010-10-15
  • 打赏
  • 举报
回复
String s1=new String("abc");--为初始化一个对象,新分配一块内存
String s="abc";--若之前创建了"abc"这个变量,将共享该内存。

62,615

社区成员

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

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