美文网首页
常见Java面试题 – 第一部分:非可变性(Immutabili

常见Java面试题 – 第一部分:非可变性(Immutabili

作者: 怡红快绿 | 来源:发表于2018-08-02 15:08 被阅读0次

    下面的代码段会输出什么

    String s = " Hello ";
    s += " World ";
    s.trim( );
    System.out.println(s);
    

    正确输出是" Hello World "。明明执行了trim()方法,为什么没有删除头尾空白符的字符串?

    由于字符串前后都有空格,因为有些人可能会认为结果是”Hello World”。那么,这个题目想要考察的是什么呢?

    1. 字符串对象(String Object)是非可变的(immutable),这个题目容易迷惑人的地方在s.trim( )这一行。

    2. 理解对象引用和不可达对象会由垃圾回收器收集。

    顺着这个题目,你觉得还可以考察哪些概念呢?

    1. 例如,上面的代码中一共会生成几个字符串对象,什么时候这些对象会变成不可达对象从而被垃圾回收器回收。

    2. 又比如,上面的代码的效率如何?

    最好的解释方式是通过一个图表来说明,如下:


    image.png

    如果需要输出前后没有空格的”Hello World”,那么应该将s.trim( )再赋值给”s”。这个赋值操作可以让s指向新创建出来的字符串对象。

    上面的代码也可以改写成如下方式:

    StringBuilder sb = new StringBuilder(" Hello ");
    sb.append(" World ");
    System.out.println(sb.toString().trim( ));
    

    StringBuilder不是一个线程安全的类,因此仅仅用作本地变量是没有问题的。如果你希望用作实例变量,那么可以选择线程安全的StringBuffer类。想知道字符串操作背后的原理吗?可以点击这里:String concatenation

    本文内容出自常见Java面试题 – 第一部分:非可变性(Immutability)和对象引用(Object reference)

    英文原文: Java Success,编译:ImportNew - 郑雯

    译文链接:http://www.importnew.com/2217.html


    扩展阅读:

    相关文章

      网友评论

          本文标题:常见Java面试题 – 第一部分:非可变性(Immutabili

          本文链接:https://www.haomeiwen.com/subject/fhtsvftx.html