String s1 = new String("abc");String s2 = new String("abc");产生了几个对象

zzu_sun 2011-11-29 11:40:19
String s1 = new String("abc");
String s2 = new String("abc");
这中间产生了几个对象?
...全文
1287 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
hclovehf 2013-09-13
  • 打赏
  • 举报
回复
产生了3个对象.
逍遥jc 2013-09-13
  • 打赏
  • 举报
回复
引用 19 楼 mengxiangyue 的回复:
两个 String s1 = "abc"; String s2 = "abc"; 这样实际的对象就有一个 只是产生了两个变量都指向同一个对象
String s1 = "abc"; String s2 = "abc"; 这个和new String("abc") 不一样啊。
whos2002110 2013-09-13
  • 打赏
  • 举报
回复
引用 30 楼 open4u 的回复:
[Quote=引用 17 楼 xierong2011 的回复:] java中String s = new String("abc")创建了几个对象?! 答案是两个,现在我们具体的说一下: String s = new String("abc"); 首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。 所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字…… [/Quote] 17楼的第二点说法有些问题,首先,并不是所有字符串都会放在常量池中,能放在常量池中的字符串,必须是以字符串常量的身份进入的。如: String str = "abc"; 此时,常量池中自然会有“abc”,而且是在编译阶段进行的。 而String s1 = new String("abc"); 这里的“abc”和常量池并没有什么关系。因为此时的"abc",存在于堆中,并不是常量池里的那个。更不会是从常量池复制过来的。
任何位置双引号表示出的字符串都会在编译器放到常量池中
失忆的鱼 2013-09-13
  • 打赏
  • 举报
回复
引用 17 楼 xierong2011 的回复:
java中String s = new String("abc")创建了几个对象?! 答案是两个,现在我们具体的说一下: String s = new String("abc"); 首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。 所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字池中,文字池的一个好处就是可以把相同的字符串合并,占用一个空间,我们可以用==判断一下两个引用变量是否指向了一个地址即一个对象

public class Demo02 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s1 ="abc";
        String s2 = "abc" ;
        if( s1 == s2 ) System.out.println("s1,s2 refer to the same object");
        else System.out.println("trouble");
    }
}
输出结果为: 可以看出指向了一个对象,即文字池中保存了一个对象。 二、String s = new String("abc")实际上是"abc"本身就是文字池中的一个对象,在运行 new String()时,把文字池即pool中的字符串"abc"复制到堆中,并把这个对象的应用交给s,所以创建了两个String对象,一个在pool中,一个在堆中。下面看这个程序,创建了几个对象。

public class Demo03 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s1 = new String("abc") ;
        String s2 = new String("abc") ;
        if( s1 == s2 ){ //不会执行的语句}
       System.out.println("在堆中创建了一个对象");

    }
        else{
        System.out.println("在堆中创建了两个对象");    
        }
        }
}
输出结果为: 可知在堆中创建了两个对象,但是在文字池中有一个对象,所以共创建了三个对象。 三、再看下一个例子:

public class Demo04 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s = new String("abc");
        s = "cba";
        System.out.println(s); 
    }

}
输出结果为: String s = new String("abc")并不是给s赋值,而是把字符串"abc"的引用交给s持有,现在把s指向字符串"cba","cba"的引用地址把"abc"的引用地址覆盖,所以输出结果为cba 这方面的问题,终结了! 呵呵
涨姿势了!
  • 打赏
  • 举报
回复
引用 17 楼 xierong2011 的回复:
java中String s = new String("abc")创建了几个对象?! 答案是两个,现在我们具体的说一下: String s = new String("abc"); 首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。 所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字池中,文字池的一个好处就是可以把相同的字符串合并,占用一个空间,我们可以用==判断一下两个引用变量是否指向了一个地址即一个对象

public class Demo02 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s1 ="abc";
        String s2 = "abc" ;
        if( s1 == s2 ) System.out.println("s1,s2 refer to the same object");
        else System.out.println("trouble");
    }
}
输出结果为: 可以看出指向了一个对象,即文字池中保存了一个对象。 二、String s = new String("abc")实际上是"abc"本身就是文字池中的一个对象,在运行 new String()时,把文字池即pool中的字符串"abc"复制到堆中,并把这个对象的应用交给s,所以创建了两个String对象,一个在pool中,一个在堆中。下面看这个程序,创建了几个对象。

public class Demo03 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s1 = new String("abc") ;
        String s2 = new String("abc") ;
        if( s1 == s2 ){ //不会执行的语句}
       System.out.println("在堆中创建了一个对象");

    }
        else{
        System.out.println("在堆中创建了两个对象");    
        }
        }
}
输出结果为: 可知在堆中创建了两个对象,但是在文字池中有一个对象,所以共创建了三个对象。 三、再看下一个例子:

public class Demo04 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s = new String("abc");
        s = "cba";
        System.out.println(s); 
    }

}
输出结果为: String s = new String("abc")并不是给s赋值,而是把字符串"abc"的引用交给s持有,现在把s指向字符串"cba","cba"的引用地址把"abc"的引用地址覆盖,所以输出结果为cba 这方面的问题,终结了! 呵呵
xiexie!
  • 打赏
  • 举报
回复
String s1="abc";
String s2="abc";
s1与s2是同一个对象的两个引用。
String s11="a"+"b"+"c";
String s22="a"+"b"+"c";
S11与S22也是只创建了一个一个对象,因为在字符串初始化时,会进行编译优化---》
S11="abc",S22=“abc”;
所以s1=s2=s3=s4实际上他们都是一个对象。也只有一个对象
String s3=new String();
String s4=new String();
S3!=S4,当明确用了一个new关键字时,就会创建一个新的对象。
S3与S4是两个不同的对象了。
string s5=new string("abc");
string s6=new string("abc");
s5 与s6 是两个不同的对象,“abc”这样的常量字符串相当于返回了一个这个字符串对象的一个引用,
所以相同的字符串常量实际上都是一个相同的对象。

用了一个new关键字必定产生一个新的对象,看String类的源码发现,只要字符串的内容发生了变化,
那么在这个方法返回的时候 必定用了一个new关键字。
Jobernowl 2011-12-01
  • 打赏
  • 举报
回复
至少三个就是了 s1、s2是肯定的 new String(“abc”) 也是对象啊 只是很快被垃圾回收罢了 至于两个一样的new String(“abc”)会不会互相覆盖就不清楚了 如果会覆盖那java还是很智能的
jingluo 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 funfenffun 的回复:]

引用 13 楼 pl3121605999 的回复:

3个或者2个,,,“abc”如果这个对象 存在在常量池中那么就是2个。。如果不存在则是3个。。

+1
[/Quote]
++
yuch506 2011-12-01
  • 打赏
  • 举报
回复
3个,这个好老的问题啊
zhu_9527 2011-12-01
  • 打赏
  • 举报
回复
3个。。。。
何時該釋然 2011-11-30
  • 打赏
  • 举报
回复
17楼 很牛叉 啊
JAVAkuroro 2011-11-30
  • 打赏
  • 举报
回复
一共3个 常量池1个 堆中2个 这问题都问烂了 理解了String池的原理就很好答了
lliiqiang 2011-11-30
  • 打赏
  • 举报
回复
3个
以字符串常量池中的"abc"对象为模板复制了两个内容与之一样的String对象
龙腾冰 2011-11-29
  • 打赏
  • 举报
回复
首先你要知道String是引用型数据,不要和基本数据搞混了,new了几个就会在创建几个
zzu_sun 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 pdy235 的回复:]
产生2个对象
[/Quote]
能详细说下吗?
稻荷 2011-11-29
  • 打赏
  • 举报
回复
产生2个对象
zzu_sun 2011-11-29
  • 打赏
  • 举报
回复
String s1 = new String("abc");
问这个产生了几个对象 我说两个
然后String s1 = new String("abc");
String s2 = new String("abc");
这两个放在一块产生了几个对象
zqfddqr 2011-11-29
  • 打赏
  • 举报
回复
估计楼主是想问一共产生了多少 String对象吧
yiliang1990 2011-11-29
  • 打赏
  • 举报
回复
2个....
hzc543806053 2011-11-29
  • 打赏
  • 举报
回复
2个,
加载更多回复(21)

62,616

社区成员

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

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