JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看.docVIP

JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看.doc

-JAVA程序员JAVA工程师面试必看 JAVA面试题解惑系列(二)——到底创建了几个String对象? 关键字: java 面试题 string 创建几个对象 作者:臧圩人(zangweiren) 网址: 转载请注明出处! 我们首先来看一段代码: Java代码 String?str=new?String(abc);?? String str=new String(abc); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?相信大家对这道题并不陌生,答案也是众所周知的,2个。接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。 我们可以把上面这行代码分成String str、=、abc和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String(abc)了。那么,new String(abc)为什么又能被看成abc和new String()呢?我们来看一下被我们调用了的String的构造器: Java代码 public?String(String?original)?{ ?? ????//other?code?... ?? }?? public String(String original) { //other code ... } 大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种: 使用new创建对象。 调用Class类的newInstance方法,利用反射机制创建对象。 我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是abc。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本。 这种方式是String特有的,并且它与new的方式存在很大区别。 Java代码 String?str=abc;?? String str=abc; 毫无疑问,这行代码创建了一个String对象。 Java代码 String?a=abc; ?? String?b=abc;?? String a=abc; String b=abc; 那这里呢?答案还是一个。 Java代码 String?a=ab+cd;?? String a=ab+cd; 再看看这里呢?答案仍是一个。有点奇怪吗?说到这里,我们就需要引入对字符串池相关知识的回顾了。 在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。 我们再回头看看String a=abc;,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为abc的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。因此,我们不难理解前面三个例子中头两个例子为什么是这个答案了。 对于第三个例子: Java代码 String?a=ab+cd;?? String a=ab+cd; 由于常量的值在编译的时候就被确定了。在这里,ab和cd都是常量,因此变量a的值在编译时就可以确定。这行代码编译后的效果等同于: Java代码 String?a=abcd;?? String a=abcd; 因此这里只创建了一个对象abcd,并且它被保存在字符串池里了。 现在问题又来了,是不是所有经过“+”连接后得到的字符串都会被添加到字符串池中呢?我们都知道“==”可以用来比较两个变量,它有以下两种情况: 如果比较的是两个基本类型(char,byte,short,int,long,float,double,boolean),则是判断它们的值是否相等。 如果表较的是两个对象变量,则是判断它们的引用是否指向同一个对象。 下面我们就用“==”来做几个测试。为了便于说明,我们把指向字符串池中已经存在的对象也视为该对象被加入了字符串池: Java代码 public?class?StringTest?{ ??

文档评论(0)

中华书局 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档