1. 首页
  2. Java

Java面试必备:字符串深度解析

Java

在Java面试中,字符串相关的知识是面试者比较青睐的,特别是在不同的情况下到底创建了几个对象,很多人理解的并不透彻,例如String str=new String(“abc”)为什么会创建两个对象,很多人只是知道,但是不知道为什么,接下来我已一个全面的例子作为开场,透彻的介绍String。
掌握下面的几点,所有的字符串面试题就不在是什么问题了:
注:本文以JDK8说明,至于JVM在每个版本的变化会在JVM面试库中详细介绍,在这就不展开了。
第一点:字符串创建有两种方式:字面量和利用new关键字
第二点:字符串使用非常的频繁,从空间和性能方面考虑,JVM实例化字符串时进行了优化:添加了字符串常量池。
第三点:字符串常量池中的内容是类加载完成以后创建的,而字符串常量池保存的是字符串对象的引用,具体实例对象存放在堆中。
第四点:如果只是字面量进行拼接,JVM会将它们优化成一个字面量。
第五点:如果拼接中存在字符串变量,JVM会将它们优化成StringBuilder进行拼接,然后通过StringBuilder.toString()获取。
第六点:new关键字会在堆上创建一个新的对象。
第七点:intern()方法:返回常量池该字符串的引用
intern的作用:
1:如果字符串常量池中存在字符串对象的引用,则直接返回这个对象的引用
2:如果字符串常量池中不存在字符串对象的引用,则首先在堆中创建对象,然后将这个对象的引用存放在常量池中。
上面的这七点如果真正掌握了,我相信下面的面试就很容易了。
面试1:下面的一句代码创建了几个对象
答案:创建了两个对象。
解析:此题主要考察了第三点和第六点。
1)创建的第一个对象(第三点):在类加载时,首先判断字符串常量中是否存在”abc”对象的引用,没有则创建一个”abc”对象,然后把这个对象的引用存放在字符串常量池中。
2)创建的第二个对象(第六点):new关键字会在堆中创建一个新的对象。
面试2:下面的代码会输出什么
答案:true,false
解析:此题主要考察了第三点,第四点和第六点
1)true:str2在编译期JVM会优化成”abc”,然后判断字符串常量池中是否存在”abc”对象的引用,因为str1已经创建,所以str2从字符串常量池中获取”abc”对象的引用。所以str1和str2都是指向同一地址的引用。
2)false:上面我们知道str1指向的时字符串常量池中”abc”的引用,而str3指向的时new String()创建的新对象的引用,所以str1和str3指向的不是同一个地址的引用。
面试3:下面的代码会输出什么
答案:false
解析:此题主要考察第三点和第五点
1)str1指向的时字符串常量池中”abc”对象的引用。
2)str3在编译时,JVM会将str3优化成如下代码。
从上面代码中可以看出str3指向的时对象StringBuilder()对象的引用,所以str1和str3指向不同对象,所以false.
面试4:下面代码会输出什么
答案:true
解析:考察第三点和第七点
1)如果字符串调用intern()方法,它会查看字符串常量池中是否存在”abc”的引用,存在直接返回它的引用。所以str1和str3指向同一个对象的地址。
面试5:为什么不要在循环中去拼接字符串
答案:因为字符串拼接在编译时期JVM会将其优化成StringBuilder对象进行拼接,如果循环次数非常大的话,创建的StringBuilder对象非常的多,甚至可能会导致内存溢出的情况。
Java面试必备:字符串深度解析

本文来自投稿,不代表程序员编程网立场,如若转载,请注明出处:http://www.cxybcw.com/28870.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code