String s = "123"+"456"+"789"; "123"+"456"时会传两个对象到String类中,然后会有一个临时对像保存"123456" 然后"123456"+"789"同样在产生3个对象,一个临时对象赋值给s 一共7个对象
0个。 String s = new String("");才是真正的创建一个字符串对象。 String s = "123"+"456"+"789";只是声明了一个变量。 但是这道题的问题是:创建了几个对象
[Quote=引用 25 楼 qray0511 的回复:]引用 10 楼 herosongkai 的回复: 那么String s = new String("123")创建几个对象 2个 String s = "123"+"456"+"789";创建了几个对象? 1个吧 是这样吧
应该是创建一个对象。 因为你只是声明了一个String对象s。
确实是一个,刚刚看到,放在String池了
题目出的不好,创建的"对象"有可能会有好几个,比如String中的 private final char value[]; private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0]; public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();但是就String本身而言,"123"+"456"+"789"会直接编译成"123456789"
String s = "123456789"; 而这个字符串只在“String 池”中保留一个
2个 String s = "123"+"456"+"789";创建了几个对象?
1个吧
然后String s="123",又重新创建对象?
"123"+"456"时会传两个对象到String类中,然后会有一个临时对像保存"123456"
然后"123456"+"789"同样在产生3个对象,一个临时对象赋值给s
一共7个对象
String s = new String("");才是真正的创建一个字符串对象。
String s = "123"+"456"+"789";只是声明了一个变量。
但是这道题的问题是:创建了几个对象
那么String s = new String("123")创建几个对象
2个 String s = "123"+"456"+"789";创建了几个对象?
1个吧
是这样吧
因为你只是声明了一个String对象s。
private final char value[];
private static final ObjectStreamField[] serialPersistentFields =
new ObjectStreamField[0];
public static final Comparator<String> CASE_INSENSITIVE_ORDER
= new CaseInsensitiveComparator();但是就String本身而言,"123"+"456"+"789"会直接编译成"123456789"
第二、是1个对象还是0个对象被创建,要看string池中是不是已经存在123456789,有的话就是只创建了一个变量引用,没有的话,就是先创建这个对象,然后创建一个引用。
所以,说是0是1都有可能。
这个是创建了两个对象,一个引用变量
分别是String池中的"123", new String() 放在堆中的一个Object,还有一个就是s的引用变量,放在栈中。
public class Test{
public static void main(String [] args){
String s = "123"+"456"+"789";//创建了几个对象?
}
}就这个具体类说明。
"123" "456" "789"这三个String常量,都是对象。从这里"123".equals("xxx");可以看出"123"是对象。
常量池中没有他们,他们会被存放到常量池中。
s只是一个对象的引用,不是对象本身。他存放在栈中。
String是不可变字符串,在执行 + 运算的时候会新生成一个对象,并不是在原对象上追加。
“123”+“456”会新生成一个“123456”对象,常量池中没有他,同样它也会被存放到常量池中。
然后“123456”+“789”又会生成一个“123456789”对象,一样存放到池中。
所以一共应该有5个对象:"123" "456" "789" "123456" "123456789"。
以上是个人意见,应该是没错的。但是如果错了请不要骂我。
new String("123")是一个
简单的说,没有看到new就没有创建实例对象。。s是一个引用对象over
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: Hello.java
public class Hello
{ public Hello()
{
} public static void main(String args[])
{
String s = "123456789";
}
}
这个是用JAD凡编译后的结果,可以看出,确实是创建了1个对象
仍然坚持5个对象。
String s=new String("123");
就是产生了两个对象。一个“123”在池中,另外一个就算new出来的那个在堆中。
字符串并不一定要自己显示的new才会产生对象。"123".equalse("xxx");这说明"123"是可以调用String类的方法的,可以现出“123”是对象。
自己明明什么都不明白还瞎搅和,je上面就有专门一篇讲String和常量池的,自己去搜了看看去,别这误导别人。
“123” 和new String("123");
区别是,如果字符串缓冲池中已经有"123" 第一种方法会直接将引用指向"123",并不创建新的对象。
而new String("123")是明确从堆中新建一个String对象,堆中的new 程序员并不能操作,
即使你让它=null 也只是讲引用指像空,原来的new String("123")还在堆中。
堆中的对象只能通过jvm的垃圾回收器来自动回收。
http://topic.csdn.net/u/20100610/16/df1002e4-3dd3-4190-9629-efed820687a1.html?51466
反编译后String s = "123"+"456"+"789"; =》String s = "123456789";
坛子里有有一僵尸帖做过详细介绍