“String s = new String(“xyz“);创建了多少个String实例”?

 

引用
问题:
Java代码   收藏代码
  1. String s = new String("xyz");  
创建了几个String Object?

 

答案:两个(一个是“xyz”,一个是指向“xyz”的引用对象s)

 

 

 

 

据说这是《java面试宝典》上的一道题,对java不熟悉的朋友可能就被唬住了,我曾经也是其中之一。

而事实上,这是一道本身就经不起推敲的问题,或许这也是容易让很多人疑惑的原因吧。

先说这个问题的槽点:答案将String变量和String对象(实例)混淆、问题没有具体说明是在类加载时还是代码运行时,应该分开讨论、问题没有针对具体的运行环境。

 

结论1:题目问的是String Object,应认为是问创建了几个String对象,String对象和String变量是两个概念。String变量是String s,这个s就是一个用户声明的String类型的变量,这里没有final,所以s可以指向任意的String对象,这里它指向了new出来的一个String对象。ps:String类的对象一旦创建,内容就不可变更,用户对String变量重新赋值只是让它指向另一个String对象。

 

结论2:类加载时,符合规范的JVM实现应该在类加载的过程中创建并驻留一个String实例作为常量来对应"xyz"字面量;具体是在类加载的resolve阶段进行的。这个常量是全局共享的,只在先前尚未有内容相同的字符串驻留过的前提下才需要创建新的String实例。也就是说如果在类加载到这段之前没有对应“xyz”字面量的常量String对象,加载到这里会创建一个String对象。

 

结论3:在代码执行时,这里new关键字会创建一个String对象。

 

结论4:结论3前提是符合规范的JVM。实际上有些JVM会有好的优化,不同的JVM和不同的运行参数可能会有不同结果。例如HotSpot在开启逃逸分析和空间分配消除功能后,发现如果这个new String("xyz")没有什么用,那么在执行至此时并不会创建String对象。

 

总结:问题不靠谱,面试的时候可以直接甩结论,笔试的话可以按原答案回答吧,但是搞不好会有人专门挑书上有毛病的问题来问,所以追求完美的答案应该是这样的:会创建一个String类型的变量s。在类加载到此处之前没有出现“xyz”字面量的话,加载此处会创建一个对应“xyz”的String常量对象。在符合规范的JVM上,执行到此处new关键字会创建一个String对象。

来一段代码检查下你是否真的懂了,想一下输出什么

    public static void main(String[] args) {
        String a = "hello world!";
        String b = "hello world!";
        String c = new String(a);
        String d = new String("hello world!");
        
        boolean ab = a==b;
        boolean ac = a==c;
        boolean ad = a==d;

        boolean bc = b==c;
        boolean bd = b==d;

        boolean cd = c==d;

        System.out.println("ab:"+ab+";ac:"+ac+";ad:"+ad);
        System.out.println("bc:"+bc+";bd:"+bd);
        System.out.println("cd:"+cd);
    }

ab:true;ac:false;ad:false
bc:false;bd:false
cd:false

Process finished with exit code 0

你答对了吗?

 

水平有限,如果疏漏错误,请批评指正。

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值