代码阅读题-字符串比较
已经知道的,字符串直接量会采用字符串常量池
new String
会创建一个新的对象并分配内存地址
所以他俩==
返回是false
我起初是不知道这个intern()
方法是干嘛的
intern()
方法返回字符串对象的规范化表示形式
从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中
也就是说intern()
得到的始终是常量池中的值
public static void main(String[] args) { String s1 = new String("a")+new String("b"); String s2 = "ab"; // 检查s1在字符串常量池中是否存在,这肯定是存在的 String s3 = s1.intern(); System.out.println(s1==s2);// false System.out.println(s1.hashCode()==s2.hashCode());// true System.out.println(s1==s3);// false }
也就是说这边两个Sttring对象相加得到的仍然是一个新的String对象
那么如果先在字符串常量池中创建呢?结果是一样的,无论如何都会创建一个新String对象
而中间那个true是因为,String类的equals()
方法是被重写过的,比较字符串的值,而为了保持一致性
String s1 = new String("a")+new String("b"); String s4="a"+"b"; System.out.println(s1==s4);// false
再测试下intern()
方法,
System.out.println(s3==s2);
返回true,因为共用了常量池中的值
如果常量池中没有这个值呢?会new一个新对象出来,有新的内存地址
public static void main(String[] args) { String s1 = new String("a")+new String("b"); String s4="a"+"b"; String s2 = "ab"; // 检查s1在字符串常量池中是否存在,这肯定是存在的 String s3 = s1.intern(); System.out.println(s3==s1);// false System.out.println(s3==s2);// true }
为什么s3和s2相等?
而且就算没有s2,System.out.println(s3=="ab");
返回也是true
new了之后,在创建一个新对象的同时,也会往常量池中放入一个值,所以s3intern()
得到的始终是常量池中的值
本文作者:YaosGHC
本文链接:https://www.cnblogs.com/yaocy/p/16727627.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步