• 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年身体健康,去体验新城市的套路。
    • 新年愿望,你幸福,我幸福,大家都幸福!
    • 愿时光为你定格,永远停在快乐的那—刻。
  • 相关阅读:
    【Qt控件之QListWidget】介绍及使用,利用QListWidget、QToolButton、和布局控件实现抽屉式组合控件
    主成分分析(PCA)介绍
    信号量机制类型:整型和记录型
    mysql悲观锁是行锁还是表锁?
    2022.11.12 英语背诵
    abortControllerMap: Map<string, AbortController>
    问题复盘|在使用 Gson 时,报 Failed to parse date [““] 错误
    C++Primer第五版 第十四章习题答案(1~5)
    学信息系统项目管理师第4版系列28_组织级项目管理和量化项目管理
    MySQL基础之多表操作(多表查询,事务,索引)
  • 原文地址:https://blog.csdn.net/weixin_46146718/article/details/127789282