当前位置: 代码迷 >> Java相关 >> 关于String s=new String("abc");
  详细解决方案

关于String s=new String("abc");

热度:351   发布时间:2010-05-03 19:45:58.0
关于String s=new String("abc");
在网上无意间看见String s=new String("abc");这条语句有两个String Object产生,
我的理解是:由于string是一个final类,所有刚开始声明时系统会有一个默认的初始值null,
后来又有一个abc,固有两个对象,所以我们如果在反复操作字符串时使用StringBuffer或StringBuilder能节省很大的空间!
不知理解是否正确,请高人指点!谢谢

搜索更多相关的解决方案: String  abc  new  

----------------解决方案--------------------------------------------------------
楼主的理解是错误的,string是一个final类这是对的。刚开始声明时系统会有一个默认的初始值null不大正确。
对象声明并不会生成实例。比如String str;这个str是一个空对象并没有被实例化。
String s = "abc";是两个对象,因为在java中,字符串是一个final类,值是不可以改变的,"abc"就是一个实例对象。
赋值是再生成另外一个对象s,这个对象的值也是abc。
假如String s="abc"; String s2 = s;这就是3个对象了,分别为s,s2,"abc"。检验用==号就能判断是否为同个实例。

----------------解决方案--------------------------------------------------------
我们可以把上面这行代码分成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对象的方式的讨论――引号内包含文本。

----------------解决方案--------------------------------------------------------
似乎大家说的都不是很对。其实是这样的:
如果在调用String s=new String("abc");之前并没有关于字符串"abc"的任何定义。那么确实会生成两个对象,
一个是在字符串静态池中,一个在堆中。字符串静态池是为了高效处理字符串而设置的。

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

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

我一会发一个帖子,专门解释下Java中的字符串,希望大家不管是面试还是平时,都不要再被字符串所迷惑。

----------------解决方案--------------------------------------------------------
感谢各位的回答!
正确答案应该是:两个,一个在字符串的常量池中,另一个在堆中。
----------------解决方案--------------------------------------------------------
  相关解决方案