String a="a"; String b="b"; a=a+b; 这里共创建了几个对象?

如题所述

这里共创建了3个对象。

"a"+"b"+"c"在编译期已经常量折叠为"abc",变量a获得是"abc"。

甲骨文jdk(1.7),javac会进行常量折叠,全字面量字符串相加是可以折叠为一个字面常量,而且是进入常量池的。这个问题涉及到了字符串常量池和字符串拼接。

只创建了一个对象,在字符串池只会有一个对象。因为它是一行定义的对象,编译时只会初始化一次字符串缓冲池的数据。如果是 String a="a";String b="b";String  c="c";String d=a+b+c;这里就创建了4个对象。

扩展资料

String 对象的实现:

String 对象的创建方式

1、通过字符串常量的方式

String str= "pingtouge"的形式,使用这种形式创建字符串时, JVM 会在字符串常量池中先检查是否存在该对象,如果存在,返回该对象的引用地址,如果不存在,则在字符串常量池中创建该字符串对象并且返回引用。

使用这种方式创建的好处是:避免了相同值的字符串重复创建,节约了内存

2、String()构造函数的方式

String str = new String("pingtouge")的形式,使用这种方式创建字符串对象过程就比较复杂,分成两个阶段,首先在编译时,字符串pingtouge会被加入到常量结构中,类加载时候就会在常量池中创建该字符串。

然后就是在调用new()时,JVM 将会调用String的构造函数,同时引用常量池中的pingtouge字符串,在堆内存中创建一个String对象并且返回堆中的引用地址。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-18
三个,string a="a" string b="b" 在字符串池中创建了两个对象一个是a 一个是b 而a=a+b则是直接在对内重新new了一个对象 位"ab"; 你要知道,直接string定义一个新对象是 例如string a ="a" 它的过程是 先在字符串池中找有没有相同的对象 找不到就创建一个,如果(我说如果)你在string a 之后又string b="a" 那么不会创建一个新的对象 而只是将b指向a而已;而a=a+b的话,你是改变的a的内容不管你有没有一样的,他就直接在堆内new一个string a=new string ("ab")
不知我的解说和你胃口否?
第2个回答  推荐于2017-09-29
两个或三个对象。前两句创建两个对象没有疑问,最后一句,如果"ab"字符串在之前已经使用过,那么会直接在内存池中使用,不创建新对象;如果没有使用过,则创建;本回答被提问者采纳
第3个回答  2012-05-18
三个,String a 创建了一个,String b创建了一个, a = a+b;改变了a的值 ,并生成了一个 a+b的对象
第4个回答  2012-05-18
两个,String类是自动生成对象的,分别就是a和b
a=a+b只是赋值,并没有生成对象追问

String 是一个定长字符串,值改变不会重新创建对象吗??

追答

String类的对象不是定长的,String a="a"相当于实例化a,并且赋值给a一个值"a",a=a+b只是重新赋值了,不会生成新对象

String a="a"; String b="b"; a=a+b; 这里共创建了几个对象?
这里共创建了3个对象。"a"+"b"+"c"在编译期已经常量折叠为"abc",变量a获得是"abc"。甲骨文jdk(1.7),javac会进行常量折叠,全字面量字符串相加是可以折叠为一个字面常量,而且是进入常量池的。这个问题涉及到了字符串常量池和字符串拼接。只创建了一个对象,在字符串池只会有一个对象。因...

string a = "a"; string b = "b"; a = b; 创建了几个对象
表面上看,只有两个字符串。string a = "a"; string b = "b"; a = b;这样创建了两个字符串变量:对象a指向字符串常量"a",对象b指向字符串常量"b",然后再把对象a指向"b"。但是,C#中String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符...

string a = "a"; string b = "b"; a = b; 创建了几个对象
string是不可变的。string a = "a"; string b = "b"; a = b;这样创建了两个字符串常量,对象a指向字符串常量"a",对象b指向字符串常量"b",然后再把a指向"b"。实际上只有两个字符串。

在java中,String a="a";String b="a";产生了几个对象???
String a="a" 可能创建一个对象或者不创建对象,如果"a"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("a").如果已经存在,a直接reference to 这个String池里的对象。String str1 = new String("ABC") 至少创建一个对象,也可能两个。因为用到new 关键字,会在he...

String a ="a"; String b ="b"; String c = a+b; System.out.println...
“ab”是新的匿名对象,所以返回的是false。java中==比较的是变量的地址,就好像C中的指针,指针地址一样就返回true的,你这是两个不同的String对象,肯定地址不同了。如果要比较内容就用equals方法。

String s=new String("a"+"b");这个java语句创建了几个变量 为什么
1、"a"是一个字符串对象;"b"也是一个字符串对象。2、”a“ + "b"通过连接生成一个新的字符串对象”ab“。3、通过new String("ab"),以”ab“字符串对象做为参数生成另外一个”ab“字符串对象,并赋值给变量s。所以,这里定义了一个变量,创建了4个对象,有2个是字符串对象值相同,但不是...

string a="abc";a="abcd";创建了几个对象
string a="abc";a="abcd";是一个。你可以调用输出连两个a的HashCode。是一样的值就表示只创建了一个对象。string a="abc";a="abcd";表示你创建了一个对象a并且给a赋值为abc,后又给a赋值为abcd,只是值变了,而开辟的空间没有变化。通过GetHashCode就可以看出来了。关于问题的补充你也可以...

Stirng s=new String("a" +"b");这个大家认为创建了几个对象?
这里总共创建了两个对象。如果像楼上说的那样:一个字符串对象a。那么我们用==比较,看他们是否相等。因为==比较的是地址,如果他们不相等,说明地址不一样,有新的对象被创建了。不过实际情况“a”=="a"结果为true。即像这样的使用:"a" +"b"并没有创建新的对象。 而new String("a")==new...

String a="a"+"b"; String b="ab"; 那个性能高?
"a"+"b"和"ab"都是常量,对编译器来说常量都会在编译过程中合并,即编译器会把String a="a"+"b";变成String a="ab";。所以编译出来的程序没有性能上的区别。如果是两个变量相加情况就不一样了。

String a = new String("abc");到底创建了几个对象呢?
又是这个问题 两个对象 堆中一个,字符串常量池中一个 引用在栈中,不算对象

相似回答