博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于String==和String.intern()的面试题,一文读懂
阅读量:3943 次
发布时间:2019-05-24

本文共 1561 字,大约阅读时间需要 5 分钟。

1.new String时是在堆上创建字符串对象,同时在常量池创建值一样的对象,但是这两个对象互不相干,如果常量池里已经有了同样的值的对象,只会在堆里新建对象

在这里插入图片描述

2.通过字面量复制创建字符串(如:String str=”twm”)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串;若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串。

在这里插入图片描述
3.调用 intern() 方法时,intern方法会先去查询常量池中是否有已经存在,如果存在,则返回常量池中的引用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果在常量池找不到对应的字符串,就在常量池中生成一个对原字符串的引用。

在这里插入图片描述

st4 = new string(“a”)+new string(“b”);
st5=st4.intern() 此时还是会在常量池里生成一个ab,即使原来已经有ab了,此时生成的ab指向st4的内存地址

在这里插入图片描述

在这里插入图片描述

4.常量字符串的“+”操作,编译阶段直接会合成为一个字符串。如string str=”JA”+”VA”,在编译阶段会直接合并成语句String str=”JAVA”,于是会去常量池中查找是否存在”JAVA”,从而进行创建或引用。

5.常量字符串和变量拼接时或者变量与变量拼接时会调用stringBuilder.append()在堆上创建新的对象,而不会同时在常量池里新建对象

在这里插入图片描述

String str1 = “哈哈”

String str2=str1+“呵呵”
String str3=“哈哈呵呵”
System.out.println(str2 == str3);
false

常见试题解答

有了对以上的知识的了解,我们现在再来看常见的面试或笔试题就很简单了:
Q:下列程序的输出结果:
String s1 = “abc”;
String s2 = “abc”;
System.out.println(s1 == s2);
A:true,均指向常量池中对象。

Q:下列程序的输出结果:

String s1 = new String(“abc”);
String s2 = new String(“abc”);
System.out.println(s1 == s2);
A:false,两个引用指向堆中的不同对象。

Q:下列程序的输出结果:

String s1 = “abc”;
String s2 = “a”;
String s3 = “bc”;
String s4 = s2 + s3;
System.out.println(s1 == s4);
A:false,因为s2+s3实际上是使用StringBuilder.append来完成,会生成不同的对象。

Q:下列程序的输出结果:

String s1 = “abc”;
final String s2 = “a”;
final String s3 = “bc”;
String s4 = s2 + s3;
System.out.println(s1 == s4);
A:true,因为final变量在编译后会直接替换成对应的值,所以实际上等于s4=”a”+”bc”,而这种情况下,编译器会直接合并为s4=”abc”,所以最终s1==s4。

Q:下列程序的输出结果:

String s = new String(“abc”);
String s1 = “abc”;
String s2 = new String(“abc”);
System.out.println(s == s1.intern());
System.out.println(s == s2.intern());
System.out.println(s1 == s2.intern());
A:false,false,true。

转载地址:http://nuowi.baihongyu.com/

你可能感兴趣的文章
iOS性能优化-TableView
查看>>
iOS定位-利用CoreLocation.framework获取当前城市
查看>>
iOS控件之UITextView字数控制以及占位符的实现
查看>>
iOS图片轮播器(第三方SDCycleScrollView)
查看>>
Mansory 基本用法
查看>>
iOS之CocoaPods 简明安装教程
查看>>
iOS常用代码块
查看>>
iOS常用宏命令大全
查看>>
YYKit - YYModel 使用方法
查看>>
OC网络封装工具
查看>>
iOS-浅谈block
查看>>
Socket介绍
查看>>
swift-闭包产生的循环引用以及解决办法
查看>>
gitbook安装与使用
查看>>
Apache服务器搭建方法
查看>>
Mac终端常用命令
查看>>
常用算法-冒泡排序代码实现
查看>>
swift 中的 感叹号 问号 和 双问号用法详解
查看>>
C代码:二分法求三次方程近似根
查看>>
swift-自己封装的一个网络工具
查看>>