日期:2014-05-20  浏览次数:20776 次

一个面试题:String s = new String("xyz");创建了几个String Object?
一个java面试题:String   s   =   new   String( "xyz ");创建了几个String   Object?

请高手指点一二   ......

谢谢!

------解决方案--------------------
……仔细想了一下,中套了

应该是1个类型变量s,作为一个引用

2个String Object, xyz编译的时候就存在于常量池,另一个new的时候产生
------解决方案--------------------
da11393(String[] args)的第二次回答是对的。
第一个对象是字符串常量 "xyz "
第二个对象是new String( "xyz ")的时候产生的,在heap中分配内存给这个对象,只不过这个对象的内容是指向字符串常量 "xyz "
另外还有一个引用s,指向第二个对象。这是一个变量,在栈中分配内存。
------解决方案--------------------
两个!
"xyz "作为一个常量字符串首先被创建,它被保存在“串池”中。所谓串池,简单讲就是从程序运行开始,你创建的所有常量字符串被统一保存的地方。在串池中已经存在 "xyz "这个串的情况下,如果你需要一个内容相同的串,你不需要再次创建一个,而是直接用这个就可以,这样当然是为了节省空间。注意,一个字符串是无法被修改的,所以在程序的不同地方用不同变量引用同一个常量串没有任何危险,因为你只能读取它而不能修改它。
当然,使用new String也创建了一个对象, "xyz "作为传入构造方法的实际参数,其含义就是:我要创建一个串,它的内容和串池中的 "xyz "内容一致!
------解决方案--------------------
准确的说法,应该是:

类载入并初始化的时候,产生一个 "xyz "的字符串对象存于常量池中
代码运行到这一行的时候,又产生了一个字符串,存于堆中,是常量池中 "xyz "字符串的拷贝
------解决方案--------------------
2个对象。分别为:s , xyz
3个内在块。s一块,xyz一块,xyz存在字符池也有一块!