Java之String之equals和intern区别

本文详细探讨了Java中String类的equals()、==和intern()方法的区别。equals()比较字符串内容,==判断对象引用,intern()则涉及字符串常量池。示例代码展示了它们在不同场景下的行为,强调了避免使用‘+’创建字符串以减少资源消耗。此外,文章还提醒注意字符串拼接的效率问题。
摘要由CSDN通过智能技术生成

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
    }

二、其他

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

  • 点亮一盏心灯,点亮爱,烛照光明前路!
  • 万家灯火,千里祈福,愿—切越来越好。
  • 你的离别已是蓄谋已久,又何必找借口。
  • 愿你遇良人,予你欢喜城,长歌暖浮生。
  • 愿您:大财、小财、意外财,财源滚滚。
  • 愿我三旬时,理想依然在,孤独别醒来。
  • 新的—年,仍有阳光满,路上温暖如初。
  • 愿2022年身体健康,去体验新城市的套路。
  • 新年愿望,你幸福,我幸福,大家都幸福!
  • 愿时光为你定格,永远停在快乐的那—刻。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和烨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值