代码阅读题-字符串比较

已经知道的,字符串直接量会采用字符串常量池
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()得到的始终是常量池中的值

posted @ 2022-09-25 12:22  YaosGHC  阅读(25)  评论(0)    收藏  举报