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年身体健康,去体验新城市的套路。
- 新年愿望,你幸福,我幸福,大家都幸福!
- 愿时光为你定格,永远停在快乐的那—刻。