欢迎光临散文网 会员登陆 & 注册

知了堂Java|Java基础面试题(三)

2021-11-04 10:02 作者:汇智知了堂  | 我要投稿


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反编译的好处之一就是可以同时生成字节码和源代码。这样可以进行对照研究。从上面的代码 很容易看出,虽然在源程序中使用了"+",但在编译时仍然将"+"转换成StringBuilder。因此,我们可以 得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder 如果使用循环来连接字符串,那么产出的 Java Byte Code 就会有很大区别

上面的代码返编译后的 Java Byte Code 如下

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

注意: 在使用StringBuilder时要注意,尽量不要"+"和StringBuilder混着用,否则会创建更多的 StringBuilder对象 StringBuffer和StringBuilder的功能基本一样,只是StringBuffer是线程安全的,而StringBuilder 不是线程安全的。因此,StringBuilder的效率会更高

13.方法区存放什么东西 

  • 方法区又叫静态区,包含所有的class文件和static变量 

  • 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量 

  • 运行时常量池都分配在Java虚拟机的方法区之中

今天的分享就到这里啦,持续关注我们,学习更多Java干货知识。

知了堂Java|Java基础面试题(三)的评论 (共 条)

分享到微博请遵守国家法律