常见Java面试题(一):非可变性(Immutability)和对象引用(Object reference)

阅读更多

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

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

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

 

A1.正确输出是" Hello World "。

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

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

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

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

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

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

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

 
常见Java面试题(一):非可变性(Immutability)和对象引用(Object reference)_第1张图片
 

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

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

 

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

StringBuilder不是一个线程安全的类,因此仅仅用作本地变量是没有问题的。如果你希望用作实例变量,那么可以选择线程安全的StringBuffer类。

 

原文:http://www.importnew.com/2217.html

  • 常见Java面试题(一):非可变性(Immutability)和对象引用(Object reference)_第2张图片
  • 大小: 65.3 KB
  • 查看图片附件

你可能感兴趣的:(immutable,java面试)