专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java字符串面试题深度分析

Java字符串面试题深度分析

更新时间:2020-08-06 15:54:16 来源:动力节点 浏览1948次

Java面试中,字符串相关的知识是面试者比较青睐的,特别是在不同的情况下到底创建了几个对象,很多人理解的并不透彻,例如String str=new String("abc")为什么会创建两个对象,很多人只是知道,但是不知道为什么,接下来我已一个全面的例子作为开场,透彻的介绍String。

java字符串面试题

掌握下面的几点,所有的字符串面试题就不在是什么问题了:

注:本文以JDK8说明,至于JVM在每个版本的变化会在JVM面试库中详细介绍,在这就不展开了。

第一点:字符串创建有两种方式:字面量和利用new关键字

//1:字面量创建字符串对象
String str1 = "abc";
//2:利用new关键字创建字符串对象
String str2 = new String("abc");

第二点:字符串使用非常的频繁,从空间和性能方面考虑,JVM实例化字符串时进行了优化:添加了字符串常量池。

第三点:字符串常量池中的内容是类加载完成以后创建的,而字符串常量池保存的是字符串对象的引用,具体实例对象存放在堆中。

第四点:如果只是字面量进行拼接,JVM会将它们优化成一个字面量。

String str = "a"+"b";

//JVM会对上面的拼接进行优化,优化后
String str = "ab";

第五点:如果拼接中存在字符串变量,JVM会将它们优化成StringBuilder进行拼接,然后通过StringBuilder.toString()获取。

String str1 = "ab";
String str2 = str1+"c";

//上面字符串拼接存在字符串变量str1,JVM会对其优化
String str1 = "ab";
StringBuilder sb = new StringBuilder();
sb.append(str1).append("c");
String str2 = sb.toString();

第六点:new关键字会在堆上创建一个新的对象。

第七点:intern()方法:返回常量池该字符串的引用

intern的作用:

1:如果字符串常量池中存在字符串对象的引用,则直接返回这个对象的引用

2:如果字符串常量池中不存在字符串对象的引用,则首先在堆中创建对象,然后将这个对象的引用存放在常量池中。

上面的这七点如果真正掌握了,我相信下面的面试就很容易了。

面试1:下面的一句代码创建了几个对象

String str = new String("abc");

答案:创建了两个对象。

解析:此题主要考察了第三点和第六点。

1)创建的第一个对象(第三点):在类加载时,首先判断字符串常量中是否存在"abc"对象的引用,没有则创建一个"abc"对象,然后把这个对象的引用存放在字符串常量池中。

2)创建的第二个对象(第六点):new关键字会在堆中创建一个新的对象。

面试2:下面的代码会输出什么

String str1 = "abc";
String str2 = "a"+"b"+"c";
String str3 = new String("abc");
System.out.println(str1==str2);
System.out.println(str1==str3);

答案:true,false

解析:此题主要考察了第三点,第四点和第六点

1)true:str2在编译期JVM会优化成"abc",然后判断字符串常量池中是否存在"abc"对象的引用,因为str1已经创建,所以str2从字符串常量池中获取"abc"对象的引用。所以str1和str2都是指向同一地址的引用。

2)false:上面我们知道str1指向的时字符串常量池中"abc"的引用,而str3指向的时new String()创建的新对象的引用,所以str1和str3指向的不是同一个地址的引用。

面试3:下面的代码会输出什么

String str1 = "abc";
String str2 = "ab";
String str3 = str2+"c";
System.out.println(str1==str3);

答案:false

解析:此题主要考察第三点和第五点

1)str1指向的时字符串常量池中"abc"对象的引用。

2)str3在编译时,JVM会将str3优化成如下代码。

StringBuilder sb = new StringBuilder();
sb.append(str2).append("c");
String str3 = sb.toString();

从上面代码中可以看出str3指向的时对象StringBuilder()对象的引用,所以str1和str3指向不同对象,所以false.

面试4:下面代码会输出什么

String str1 = "abc";
String str2 = "ab";
String str3 = (str2+"c").intern();
System.out.println(str1==str3);

答案:true

解析:考察第三点和第七点

1)如果字符串调用intern()方法,它会查看字符串常量池中是否存在"abc"的引用,存在直接返回它的引用。所以str1和str3指向同一个对象的地址。

面试5:为什么不要在循环中去拼接字符串

答案:因为字符串拼接在编译时期JVM会将其优化成StringBuilder对象进行拼接,如果循环次数非常大的话,创建的StringBuilder对象非常的多,甚至可能会导致内存溢出的情况。

java字符串面试题

以上就是动力节点java培训机构的小编针对“Java字符串面试题深度分析”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>