2022-09-25 12:22阅读: 21评论: 0推荐: 0

代码阅读题-字符串比较

已经知道的,字符串直接量会采用字符串常量池
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 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(21)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起