`
wlbbswl
  • 浏览: 170578 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

String s = new String( "xyz "); 创建了几个对象?

阅读更多
哈哈,要理解这个,就要知道string类的工作原理。

你知道在java中除了8中基本类型外,其他的都是类对象以及其引用。所以 "xyz "在java中它是一个String对象.对于string类对象来说他的对象值是不能修改的,也就是具有不变性。


看:
String   s= "Hello ";
s= "Java ";
String   s1= "Hello ";
String   s2=new   String( "Hello ");

啊,s所引用的string对象不是被修改了吗?之前所说的不变性,去那里了啊?

你别着急,让我告诉你说发生了什么事情:
在jvm的工作过程中,会创建一片的内存空间专门存入string对象。我们把这片内存空间叫做string池。

String   s= "Hello ";当jvm看到 "Hello ",在string池创建string对象存储它,并将他的引用返回给s。
s= "Java ",当jvm看到 "Java ",在string池创建新的string对象存储它,再把新建的string对象的引用返回给s。而原先的 "Hello "仍然在string池内。没有消失,他是不能被修改的。

所以我们仅仅是改变了s的引用,而没有改变他所引用的对象,因为string对象的值是不能被修改的。

String   s1= "Hello ";jvm首先在string池内里面看找不找到字符串 "Hello ",找到,返回他的引用给s1,否则,创建新的string对象,放到string池里。这里由于s= "Hello "了,对象已经被引用,所以依据规则s和s1都是引用同一个对象。所以   s==s1将返回true。(==,对于非基本类型,是比较两引用是否引用内存中的同一个对象)

String   s2=String( "Hello ");jvm首先在string池内里面看找不找到字符串 "Hello ",找到,不做任何事情,否则,创建新的string对象,放到string池里面。由于遇到了new,还会在内存上(不是string池里面)创建string对象存储 "Hello ",并将内存上的(不是string池内的)string对象返回给s2。所以s==s2将返回false,不是引用同一个对象。

好现在我们看题目:
String   s   =   new   String( "xyz ");
首先在string池内找,找到?不创建string对象,否则创建,   这样就一个string对象
遇到new运算符号了,在内存上创建string对象,并将其返回给s,又一个对象

所以总共是2个对象

======================================================================
"xyz "本身作为字符常量,在汇编语言中应该作为常量放在数据段,Java有一个类似数据段的constant   pool保存这个常量,在classloader加载这个类的时候就把 "xyz "和这个类的其他一些信息放在constant   pool
new   String( "xyz ")根据常量 "xyz "在heap上创建String对象
s只不过是stack上的一个引用,指向heap上的String对象
所以,一共两个对象
分享到:
评论

相关推荐

    Java问题宝典2012版

    创建了几个String Object? 二者之间有什么区别? 25 34、String 和StringBuffer的区别 25 35、如何把一段逗号分割的字符串转换成一个数组? 26 36、数组有没有length()这个方法? String有没有length()这个方法? 26 ...

    String对象的内存分析

    对于`c`,`new String("xyz")`会创建一个新的`String`对象在堆中。同样,`d`也会在堆中创建一个新的`String`对象,尽管常量池中已有"xyz"。 3. `String s1 = new String("xyz"); String s2 = new String("xyz"); ...

    JAVA面试题String产生了几个对象

    JAVA面试题String产生了几个对象 JAVA面试题String产生了几个对象?这个问题是很多Java开发者面试中常见的问题,本文将通过示例代码详细介绍String s = new String("xyz");产生了几个对象。 首先,需要了解Java中...

    java面试题

    第一,谈谈final, finally, finalize的区别。 第二,Anonymous Inner Class (匿名内部类) 是否可以extends...创建了几个String Object? 第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

    java 面试常问的问题 如何回答

    创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? String有没有length()这个方法? 24 ...

    java_ms.rar_Math Class_java collection

     第九,String s = new String("xyz") 创建了几个String Object?   第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?   第十一,short s1 = 1 s1 = s1 + 1 有什么错? short s1 = 1 s1 += 1 有什么...

    java各大软件公司的面试题的集和

    创建了几个String Object? 第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 面试题都是很变态的,要做好...

    C#面试笔试题目总结

    创建了几个 String Object? 两个对象。一个是 xyz,一个是指向 xyz 引用的 s。 22. GC 是什么?为什么要有 GC? GC 是垃圾回收器。因为有了 GC 就省去了程序员手工编码释放内存。 23. 能用 foreach 遍历访问的...

    2022年JAVA面试题及答案.doc

    JAVA 面试题及答案.doc 该资源提供了一份 JAVA 面试题集,涵盖了 JAVA 语言的多个...* 该语句创建了两个 String 对象:一个是 String 常量池中的“xyz”,另一个是new String("xyz") 创建的对象。 ...(以下省略)

    Java面试宝典2017.zip

    一. Java基础部分 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto?...创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别

    java笔试题目以及部分答案

    创建了几个 String Object? String s = new String("xyz"); 创建了两个 String Object,一个是字符串常量池中的对象,另一个是堆中的对象。 10. Math.round(11.5) 等於多少? Math.round(-11.5) 等於多少? ...

    神州租车面试题

    创建了几个String Object? 分析:这道题考察了String对象的创建机制。在Java中,String对象可以通过new关键字创建,也可以通过字面值的方式创建。当我们使用new关键字创建String对象时,JVM会在堆中创建一个新的...

    变态级JAVA程序员面试32问

    创建了几个String Object?  第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?  第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?  第十二,sleep() ...

    java面试宝典2012版.pdf

    创建了几个String Object? 二者之间有什么区别? 34、String 和StringBuffer的区别 35、如何把一段逗号分割的字符串转换成一个数组? 36、数组有没有length()这个方法? String有没有length()这个方法? 37、下面这...

    中软国际Java程序员笔试题及答案.doc

    创建了几个 String Object? * 两个对象,一个是“xyz”,一个是指向“xyz”的引用对象 s。 12. Math.round(11.5) 等於多少?Math.round(-11.5) 等於多少? * Math.round(11.5) 返回 12,Math.round(-11.5) 返回...

    java面试宝典

    Strings=newString(“xyz”);创建了几个String Object? 二者之间有什么区别?** 这行代码创建了一个`String`对象。通过`new String("xyz")`方式创建的字符串,会在堆内存中创建一个对象,并且字符串常量池中也会...

    Java 应届生面试题

    * 创建了几个 String 对象?如果 String 常理池中已经创建了该对象,则不会继续创建,只创建了一个对象 new String("xyz");否则,将创建两个对象。 六、String、StringBuffer 和 StringBuilder 之间的区别 * 执行...

    2012-Java面试宝典new版

    `创建了几个`String`对象? 二者之间有什么区别? **答案**: 这行代码创建了两个`String`对象:一个是堆内存中的新对象,另一个是字符串常量池中的对象。“xyz”这个字符串文本在字符串常量池中只存在一份,而`s`...

Global site tag (gtag.js) - Google Analytics