当前位置:编程学习 > JAVA >>

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

String s1 = new String("abc");
String s2  = new String("abc");
这中间产生了几个对象? --------------------编程问答-------------------- --------------------编程问答-------------------- http://so.csdn.net/search?t=thread&q=String%20%E5%87%A0%E4%B8%AA%E5%AF%B9%E8%B1%A1 --------------------编程问答-------------------- 这问题这么有意思么?随便写几个吧:

String.class
Serializable.class
Comparable.class
CharSequence.class
[c.class
int.class
long.class
Arrays.class

String里用了好多类,这常量池一解析下来N多个Class对象,数不胜数 --------------------编程问答--------------------
引用 2 楼 ticmy 的回复:
http://so.csdn.net/search?t=thread&q=String%20%E5%87%A0%E4%B8%AA%E5%AF%B9%E8%B1%A1

比较详细 --------------------编程问答-------------------- 2个, --------------------编程问答-------------------- 2个.... --------------------编程问答-------------------- 估计楼主是想问一共产生了多少 String对象吧 --------------------编程问答-------------------- 今天面试问道了,问上面两个一共产生了几个对象 --------------------编程问答-------------------- String s1 = new String("abc");
问这个产生了几个对象 我说两个
然后String s1 = new String("abc");
String s2 = new String("abc");
这两个放在一块产生了几个对象 --------------------编程问答-------------------- 产生2个对象 --------------------编程问答--------------------
引用 10 楼 pdy235 的回复:
产生2个对象

能详细说下吗? --------------------编程问答-------------------- 首先你要知道String是引用型数据,不要和基本数据搞混了,new了几个就会在创建几个 --------------------编程问答-------------------- 3个或者2个,,,“abc”如果这个对象 存在在常量池中那么就是2个。。如果不存在则是3个。。 --------------------编程问答-------------------- 二、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("在堆中创建了两个对象");    
        }
        }
}
输出结果为:
可知在堆中创建了两个对象,但是在文字池中有一个对象,所以共创建了三个对象。
--------------------编程问答-------------------- 3个,堆里有两个,缓冲池里维护一个 --------------------编程问答--------------------
引用 13 楼 pl3121605999 的回复:
3个或者2个,,,“abc”如果这个对象 存在在常量池中那么就是2个。。如果不存在则是3个。。

+1 --------------------编程问答--------------------
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
这方面的问题,终结了! 呵呵 --------------------编程问答-------------------- 面试:产生两个或者三个,面试官就很高兴。回答要是:产生那么两三个吧,面试官就怀疑。为什么 --------------------编程问答-------------------- 两个
String s1 = "abc";
String s2 = "abc";
这样实际的对象就有一个
只是产生了两个变量都指向同一个对象
--------------------编程问答--------------------
引用 17 楼 xierong2011 的回复:
java中String s = new String("abc")创建了几个对象?!
答案是两个,现在我们具体的说一下:
String s = new String("abc");
首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。
所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字……

怎么这么强??? --------------------编程问答-------------------- 3个,字符串池中一个即“abc”还有2个分别是s1,s2 --------------------编程问答-------------------- 17楼很详细!!!写的太好了. --------------------编程问答-------------------- 只要是new 就回去堆上分配内存
s1  s2指向不同的地址  肯定不相等喽
==比较的是引用
equals方法  object的定义也是默认比较的引用
由于string重写了equlas方法  
只要里面的值相等  s1.equals(s2)就为true了 --------------------编程问答-------------------- --------------------编程问答-------------------- 17楼正解。
原来字符串池里的也是一个对象,受教了。 --------------------编程问答-------------------- 必然两个,只要new就要在内存中开辟空间 --------------------编程问答--------------------
引用 17 楼 xierong2011 的回复:
java中String s = new String("abc")创建了几个对象?!
答案是两个,现在我们具体的说一下:
String s = new String("abc");
首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。
所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字……
--------------------编程问答-------------------- 两个.. --------------------编程问答-------------------- 如果你认为堆中的才叫对象,那么2个。如果你认为变量声明以外的都是对象,那么就3个。 --------------------编程问答--------------------
引用 17 楼 xierong2011 的回复:
java中String s = new String("abc")创建了几个对象?!
答案是两个,现在我们具体的说一下:
String s = new String("abc");
首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。
所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字……


17楼的第二点说法有些问题,首先,并不是所有字符串都会放在常量池中,能放在常量池中的字符串,必须是以字符串常量的身份进入的。如:
String str = "abc";
此时,常量池中自然会有“abc”,而且是在编译阶段进行的。
而String s1 = new String("abc");
这里的“abc”和常量池并没有什么关系。因为此时的"abc",存在于堆中,并不是常量池里的那个。更不会是从常量池复制过来的。

--------------------编程问答-------------------- 两个或者是三个,这个说起来挺好玩的,也是大家乐于长谈的问题啊 --------------------编程问答-------------------- 3个
以字符串常量池中的"abc"对象为模板复制了两个内容与之一样的String对象 --------------------编程问答-------------------- 一共3个 常量池1个 堆中2个 这问题都问烂了 理解了String池的原理就很好答了 --------------------编程问答-------------------- 17楼  很牛叉 啊  --------------------编程问答-------------------- 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关键字。 --------------------编程问答-------------------- 3个。。。。 --------------------编程问答-------------------- 3个,这个好老的问题啊 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 16 楼 funfenffun 的回复:
引用 13 楼 pl3121605999 的回复:

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

+1

++ --------------------编程问答-------------------- 至少三个就是了  s1、s2是肯定的 new String(“abc”)  也是对象啊  只是很快被垃圾回收罢了  至于两个一样的new String(“abc”)会不会互相覆盖就不清楚了  如果会覆盖那java还是很智能的 --------------------编程问答--------------------
引用 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! --------------------编程问答-------------------- 产生了3个对象. --------------------编程问答--------------------
引用 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
这方面的问题,终结了! 呵呵

涨姿势了! --------------------编程问答--------------------
引用 30 楼 open4u 的回复:
[Quote=引用 17 楼 xierong2011 的回复:]
java中String s = new String("abc")创建了几个对象?!
答案是两个,现在我们具体的说一下:
String s = new String("abc");
首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。
所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字……


17楼的第二点说法有些问题,首先,并不是所有字符串都会放在常量池中,能放在常量池中的字符串,必须是以字符串常量的身份进入的。如:
String str = "abc";
此时,常量池中自然会有“abc”,而且是在编译阶段进行的。
而String s1 = new String("abc");
这里的“abc”和常量池并没有什么关系。因为此时的"abc",存在于堆中,并不是常量池里的那个。更不会是从常量池复制过来的。


任何位置双引号表示出的字符串都会在编译器放到常量池中 --------------------编程问答--------------------
引用 19 楼 mengxiangyue 的回复:
两个
String s1 = "abc";
String s2 = "abc";
这样实际的对象就有一个
只是产生了两个变量都指向同一个对象


String s1 = "abc";
String s2 = "abc";
这个和new String("abc") 不一样啊。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,