Java面试题:java字符串字面量

Java面试题:java字符串字面量

北大青鸟长沙麓谷校区      2022-05-05 09:56:01     47

Java面试题:java字符串字面量,掌握下面的几点,所有的字符串面试题就不在是什么问题了:注:本文以JDK8说明,至于JVM在每个版本的变化会在JVM面试库中详细介绍

课程价格 请咨询

上课时段: 授课校区:

详细介绍

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

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

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

    //1:字面量创建字符串对象

    Stringstr1="abc";

    //2:利用new关键字创建字符串对象

    Stringstr2=newString("abc");

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

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

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

    Stringstr="a"+"b";

    //JVM会对上面的拼接进行优化,优化后

    Stringstr="ab";

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

    Stringstr1="ab";

    Stringstr2=str1+"c";

    //上面字符串拼接存在字符串变量str1,JVM会对其优化

    Stringstr1="ab";

    StringBuildersb=newStringBuilder();

    sb.append(str1).append("c");

    Stringstr2=sb.toString();

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

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

    intern的作用:

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

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

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

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

    Stringstr=newString("abc");

    答案:创建了两个对象。

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

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

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

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

    Stringstr1="abc";

    Stringstr2="a"+"b"+"c";

    Stringstr3=newString("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指向的时newString()创建的新对象的引用,所以str1和str3指向的不是同一个地址的引用。

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

    Stringstr1="abc";

    Stringstr2="ab";

    Stringstr3=str2+"c";

    System.out.println(str1==str3);

    答案:false

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

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

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

    StringBuildersb=newStringBuilder();

    sb.append(str2).append("c");

    Stringstr3=sb.toString();

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

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

    Stringstr1="abc";

    Stringstr2="ab";

    Stringstr3=(str2+"c").intern();

    System.out.println(str1==str3);

    答案:true

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

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

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

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

 以上就是北大青鸟长沙麓谷校区java培训机构的小编针对“Java面试题:java字符串字面量”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

Java面试题

学分高考提醒您:交易时请核实对方资质,对于过大宣传或承诺需谨慎!任何要求预付定金、汇款等方式均存在风险,谨防上当。