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
分析下面的代码
上面的代码感觉没有什么奇怪的现象,且从表面上看,对字符串和整型使用"+"号并没有什么区别
我们来看看上面代码的本质,介绍JDK自带 jad 工具,此工具能将 .class 文件进行反编译成 Java Byte Code ,执行命令jad -o -a -s d.java TestSimple.class
反编译后代码如下
使用jad反编译的好处之一就是可以同时生成字节码和源代码。这样可以进行对照研究。从上面的代码很容易看出,虽然在源程序中使用了"+",但在编译时仍然将"+"转换成StringBuilder。因此,我们可以得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder
如果使用循环来连接字符串,那么产出的 Java Byte Code 就会有很大区别
大家可以看到,虽然编译器将"+"转换成了StringBuilder,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环,就会创建一个StringBuilder对象(对于本例来说,是创建了10个StringBuilder对象),虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。解决这个问题的方法就是在程序中直接使用StringBuilder来连接字符串,代码如下
注意:
在使用StringBuilder时要注意,尽量不要"+"和StringBuilder混着用,否则会创建更多的
StringBuilder对象StringBuffer和StringBuilder的功能基本一样,只是StringBuffer是线程安全的,而StringBuilder不是线程安全的。因此,StringBuilder的效率会更高.
java面试中经常被问到的问题有哪些?应届生必备这份Java常见面试题(三)。关注成都Java培训机构,带你了解更多相关问题。