标题:关于String s=new String("abc");
只看楼主
xudongcsharp
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:129
专家分:156
注 册:2009-5-31
结帖率:53.33%
已结贴  问题点数:20 回复次数:4 
关于String s=new String("abc");
在网上无意间看见String s=new String("abc");这条语句有两个String Object产生,
我的理解是:由于string是一个final类,所有刚开始声明时系统会有一个默认的初始值null,
后来又有一个abc,固有两个对象,所以我们如果在反复操作字符串时使用StringBuffer或StringBuilder能节省很大的空间!
不知理解是否正确,请高人指点!谢谢

搜索更多相关主题的帖子: String abc new 
2010-05-03 19:45
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
得分:5 
楼主的理解是错误的,string是一个final类这是对的。刚开始声明时系统会有一个默认的初始值null不大正确。
对象声明并不会生成实例。比如String str;这个str是一个空对象并没有被实例化。
String s = "abc";是两个对象,因为在java中,字符串是一个final类,值是不可以改变的,"abc"就是一个实例对象。
赋值是再生成另外一个对象s,这个对象的值也是abc。
假如String s="abc"; String s2 = s;这就是3个对象了,分别为s,s2,"abc"。检验用==号就能判断是否为同个实例。
2010-05-03 22:46
lampeter123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:54
帖 子:2508
专家分:6424
注 册:2009-1-30
得分:5 
我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("abc")了。那么,new String("abc")为什么又能被看成"abc"和new String()呢?我们来看一下被我们调用了的String的构造器:

public String(String original) {   
    //other code ...   
}  

大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种:

使用new创建对象。
调用Class类的newInstance方法,利用反射机制创建对象。

我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本。

你的优秀和我的人生无关!!!!
    
    我要过的,是属于我自己的生活~~~
2010-05-04 08:26
baifenghan
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:258
专家分:952
注 册:2006-3-17
得分:10 
似乎大家说的都不是很对。其实是这样的:
如果在调用String s=new String("abc");之前并没有关于字符串"abc"的任何定义。那么确实会生成两个对象,
一个是在字符串静态池中,一个在堆中。字符串静态池是为了高效处理字符串而设置的。

但是如果是这样:
String s1 = "abc";
String s=new String("abc");// 那么这句就只生成了一个对象,在堆中生成了。因为前一句已经在静态池中生成了那个池中的字符串对象了。

反过来说:
String s=new String("abc");
String s1 = "abc";   //这一句实际上一个字符串对象也没有生成,只是将引用s1指向了字符串静态池中那个字符串对象。

我一会发一个帖子,专门解释下Java中的字符串,希望大家不管是面试还是平时,都不要再被字符串所迷惑。
2010-05-04 18:22
xudongcsharp
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:129
专家分:156
注 册:2009-5-31
得分:0 
感谢各位的回答!
正确答案应该是:两个,一个在字符串的常量池中,另一个在堆中。
2010-05-04 19:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-305252-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020413 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved