java面试中经常被问到的问题有哪些?应届生必备这份Java常见面试题(三)_java自学_java相关资讯_成都java培训机构

java面试中经常被问到的问题有哪些?应届生必备这份Java常见面试题(三)

  • 作者:创始人
  • 发表时间:2022-01-13 09:59:41

java面试中经常被问到的问题有哪些?应届生必备这份Java常见面试题(三)

11.short s1 = 1; s1 = s1 + 1; 有错吗?short s1 = 1; s1 +=1 有错吗

答:前者不正确,后者正确。对于 short s1 = 1; s1 = s1 + 1;由于 1 int 类型,因此 s1+1 运算结果也是 int 型,需要强制转换类型才能赋值给 short 型。而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+=1;相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换

12.字符串"+"运行原理什么?

在源程序中使用了"+",但在编译时仍然将"+"转换成 StringBuilder。因此,我们可以得出结论,在 Java中无论使用何种方式进行字符串连接,实际上都使用的是 StringBuilder。虽然编译器将"+"转换成了StringBuilder

分析下面的代码

java面试中经常被问到的问题有哪些 

上面的代码感觉没有什么奇怪的现象,且从表面上看,对字符串和整型使用"+"号并没有什么区别

我们来看看上面代码的本质,介绍JDK自带 jad 工具,此工具能将 .class 文件进行反编译成 Java Byte Code ,执行命令jad -o -a -s d.java TestSimple.class

反编译后代码如下

image 

使用jad反编译的好处之一就是可以同时生成字节码和源代码。这样可以进行对照研究。从上面的代码很容易看出,虽然在源程序中使用了"+",但在编译时仍然将"+"转换成StringBuilder。因此,我们可以得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder

如果使用循环来连接字符串,那么产出的 Java Byte Code 就会有很大区别

image 

大家可以看到,虽然编译器将"+"转换成了StringBuilder,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环,就会创建一个StringBuilder对象(对于本例来说,是创建了10StringBuilder对象),虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。解决这个问题的方法就是在程序中直接使用StringBuilder来连接字符串,代码如下

image 

注意:

在使用StringBuilder时要注意,尽量不要"+"StringBuilder混着用,否则会创建更多的

StringBuilder对象StringBufferStringBuilder的功能基本一样,只是StringBuffer是线程安全的,而StringBuilder不是线程安全的。因此,StringBuilder的效率会更高.

java面试中经常被问到的问题有哪些?应届生必备这份Java常见面试题(三)。关注成都Java培训机构,带你了解更多相关问题。