非可变性(Immutability)和对象引用(Object reference)

一些比较核心的Java问题常常会用来考验面试者的Java基本知识功底。这篇文章列出来了一些在个人书里面没有的面试题,经过这些面试题读者也能够梳理一下Java基础知识点。html

Q1.下面的代码片断会输出什么?java

1
2
3
4
String s = " Hello " ;
s += " World " ;
s.trim( );
System.out.println(s);

A1.正确输出是” Hello  World “。面试

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

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

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

顺着这个题目,你以为还能够考察哪些概念呢?spa

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

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

最好的解释方式是经过一个图表来讲明,以下:htm

若是须要输出先后没有空格的”Hello World”,那么应该将s.trim( )再赋值给”s”。这个赋值操做可让s指向新建立出来的字符串对象。

上面的代码也能够改写成以下方式:

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

StringBuilder不是一个线程安全的类,所以仅仅用做本地变量是没有问题的。若是你但愿用做实例变量,那么能够选择线程安全的StringBuffer类。想知道字符串操做背后的原理吗?能够点击这里:String concatenation

相关文章
相关标签/搜索