• Java之String之equals和intern区别



    一、equals、==、intern () 之间的区别

    • equals:是父类 Object 的方法,String 重类写了这一方法,判断是否是首先判断是否是同一对象,是的话返回 true。接着判断是否是 - - String 类型、如果是再判断是否值相同。
    • ==:判断两个对象是否是同一对象,即两个对象的指向是否相同。
    • intern ():其实并不是用来判断是否相等的用途,它是在非字符串常量池添加字面量,所以他通常和 new String () 结合使用,可以在非字符串常量池建立变量并且指向它。
        @Test
        void test1() {
    
            String a = new String("abc");
            String b = new String("abc");
            log.info(String.valueOf(a == b));//false
            log.info(String.valueOf(a.equals(b)));//true
            log.info(String.valueOf(a.intern() == b.intern()));//true
            log.info(String.valueOf(a.intern().equals(b)));//true
    
    
            String s1 = "ab";
            String s2 = "abcd";
            String s3 = "ab" + "cd";
            String s4 = s1 + "cd";
    
            log.info("---- 第一部分  ----");
            //当 String 由两个字面量相加的时候,会判断字符串常量池,所以全是 true。
            log.info(String.valueOf(s2 == s3));//true
            log.info(String.valueOf(s2 == s3.intern()));//true
            log.info(String.valueOf(s2.intern() == s3));//true
    
            // 1、当 String 是变量和字面量相加的时候,不会在字符串常量池进行判断,所以两个对象指向不同,false。
            // 2、对 s4 这个对象进行 intern () 操作时,它会在字符串常量池进行判断,如果有的话,那么他不添加,没有的话就添加,所以为 true。但是,记住即使 s4.intern () 不会改变 s4 的指向,他的指向还在非字符串常量池。如果想改变 s4 的指引的话,需要赋值。s4=s4.intern (); 所以说 intern () 应该跟 new String ()结合使用,即 String s4=new String ("abcd").intern () 要不还需要有赋值的操作。
            // 3、还是如二所说,s4 的指向还是非字符串常量池,所以不相等。
            System.out.println("---- 第二部分 ----");
            log.info(String.valueOf(s2 == s4));//false
            log.info(String.valueOf(s2 == s4.intern()));//true
            log.info(String.valueOf(s2.intern() == s4));//false
    
            System.out.println("---- 第三部分 ----");
            log.info(String.valueOf(s3 == s4));//false
            log.info(String.valueOf(s3 == s4.intern()));//true
            log.info(String.valueOf(s3.intern() == s4));//false
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    二、其他

    在字符串尽量少使用 String ss=“ab”+“cd” 这样的操作,因为这样的操作如同新建了 StringBuilder,然后进行 append,这好像并没有什么不妥,但是要记住,当你要遍历时,每次都会新建一个 StringBuilder,这样很浪费资源。

    • 点亮一盏心灯,点亮爱,烛照光明前路!
    • 万家灯火,千里祈福,愿—切越来越好。
    • 你的离别已是蓄谋已久,又何必找借口。
    • 愿你遇良人,予你欢喜城,长歌暖浮生。
    • 愿您:大财、小财、意外财,财源滚滚。
    • 愿我三旬时,理想依然在,孤独别醒来。
    • 新的—年,仍有阳光满,路上温暖如初。
    • 愿2022年身体健康,去体验新城市的套路。
    • 新年愿望,你幸福,我幸福,大家都幸福!
    • 愿时光为你定格,永远停在快乐的那—刻。
  • 相关阅读:
    SSH(安全外壳协议)简介
    Spring源码解析——IOC属性填充
    22年第二批次PMP考试倒计时9天
    es中的匹配显示问题
    Android studio安卓生成APK文件安装包方法
    Windows编写批处理脚本.bat启动jar文件
    Promise解决异步
    京东三面:我要查询千万级数据量的表,怎么操作?
    Multisim14.0仿真(十)同相放大器
    SpringBoot Redis使用篇
  • 原文地址:https://blog.csdn.net/weixin_46146718/article/details/127789282