zoukankan      html  css  js  c++  java
  • 【转】String str = new String("abc")创建了多少个对象?

    原帖地址:http://www.cnblogs.com/dolphin0520/p/3778589.html

    这个问题在很多书籍上都有说到比如《Java程序员面试宝典》,包括很多国内大公司笔试面试题都会遇到,大部分网上流传的以及一些面试书籍上都说是2个对象,这种说法是片面的。

      如果有不懂得地方可以参考这篇帖子:

      http://rednaxelafx.iteye.com/blog/774673/

      首先必须弄清楚创建对象的含义,创建是什么时候创建的?这段代码在运行期间会创建2个对象么?毫无疑问不可能,用javap -c反编译即可得到JVM执行的字节码内容:

      

      很显然,new只调用了一次,也就是说只创建了一个对象。

      而这道题目让人混淆的地方就是这里,这段代码在运行期间确实只创建了一个对象,即在堆上创建了"abc"对象。而为什么大家都在说是2个对象呢,这里面要澄清一个概念  该段代码执行过程和类的加载过程是有区别的。在类加载的过程中,确实在运行时常量池中创建了一个"abc"对象,而在代码执行过程中确实只创建了一个String对象。

      因此,这个问题如果换成 String str = new String("abc")涉及到几个String对象?合理的解释是2个。

      个人觉得在面试的时候如果遇到这个问题,可以向面试官询问清楚”是这段代码执行过程中创建了多少个对象还是涉及到多少个对象“再根据具体的来进行回答。

    参考贴地址:http://rednaxelafx.iteye.com/blog/774673/

    问题1:

    String s = new String("xyz"); 

    在运行时涉及几个String实例?

    答案:两个,一个是字符串字面量"xyz"所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,另一个是通过new String(String)创建并初始化的、内容与"xyz"相同的实例。

    问题2:

    String s = new String("xyz");

    涉及用户声明的几个String类型的变量?

    答案:一个,就是String s。

    问题2:

    String s = null;  

    涉及用户声明的几个String类型的变量?

    Java里变量就是变量,引用类型的变量只是对某个对象实例或者null的引用,不是实例本身。声明变量的个数跟创建实例的个数没有必然关系,像是说:

    String s1 = "a";  
    String s2 = s1.concat("");  
    String s3 = null;  
    new String(s1); 

    这段代码会涉及3个String类型的变量, 
    1、s1,指向下面String实例的1 
    2、s2,指向与s1相同 
    3、s3,值为null,不指向任何实例 

    以及3个String实例, 
    1、"a"字面量对应的驻留的字符串常量的String实例 
    2、""字面量对应的驻留的字符串常量的String实例 
    String.concat()是个有趣的方法,当发现传入的参数是空字符串时会返回this,所以这里不会额外创建新的String实例) 
    3、通过new String(String)创建的新String实例;没有任何变量指向它。 

  • 相关阅读:
    UIButton中setTitleEdgeInsets和setImageEdgeInsets的使用
    关于自定义导航条UIBarButtonItem偏移的问题
    iOS端使用二维码扫描(ZBarSDK)和生成(libqrencode)功能
    CocoaPods安装和使用教程
    IOS中NSUserDefaults的用法(轻量级本地数据存储) (转)
    UIPickerView简单选择器的基本使用
    [原]Unity手游之路<三> 基于Unity+Java的聊天室源码
    [原]UML建模语言进阶
    [原]Java多线程编程学习笔记之九:使用wait/notify/notifyAll实现线程间通信的几点说明
    [原]MySQL的表分区
  • 原文地址:https://www.cnblogs.com/dawnyxl/p/9733031.html
Copyright © 2011-2022 走看看