`

String a = new String("xyz");到底是几个对象?

 
阅读更多

String a = 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个对象

例如::

String a=new String("haha");
              String b=new String("haha");
              String aa="haha";
              String aaa="ha"+"ha";
              String c="ha";
             
             
              System.out.println(a==b);
              System.out.println(a==aa);
              System.out.println(a==aaa);
              System.out.println(a==c+"ha");
         System.out.println(aa==aaa);

 

输出结果:false
                       false
                       false
                       false
                       true

分享到:
评论
1 楼 xiaohuafyle 2012-04-03  
你这逻辑有问题呀
"首先在string池内找,找到?不创建string对象,否则创建, 这样就一个string对象"
应该是,这样就0个或1个对象才对吧

相关推荐

    String对象的内存分析

    接下来,我们通过几个例子来具体分析`String`对象的内存分配: 1. `String a = "abc"; String b = "abc";` 在这种情况下,"abc"首先会被放入常量池中。当创建`a`和`b`时,它们都指向常量池中的同一个"abc"对象,...

    Java问题宝典2012版

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

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

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

    C#面试笔试题目总结

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

    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 ...

    2022年JAVA面试题及答案.doc

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

    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面试宝典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) 等於多少? ...

    变态级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各大软件公司的面试题的集和

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

    神州租车面试题

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

    java面试宝典

    39、String s=new String(“xyz”);创建了几个String Object? 12 40、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 12 41、Java 的接口和C++的虚类的相同和不同...

    java面试宝典2012版.pdf

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

    net学习笔记及其他代码应用

    创建了几个String Object? 答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 38.abstract class和interface有什么区别? 答: 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于...

    2012-Java面试宝典new版

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

    中软国际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应届生面试题1.doc

    创建了两个 String 对象:一个是字符串常量池中的“xyz”,另一个是堆中 new 出来的 String 对象。 6. String 和 StringBuffer、StringBuilder 之间区别。(5 分) String 是不可变的,StringBuffer 和 ...

Global site tag (gtag.js) - Google Analytics