首先介绍一下==号:
①它常用于比较数值类型,不做多解释。
②当它用于比较对象时,它比较的是个对象的地址值。
③当它比较字符串时,那么重点来了,要注意一下细节:
首先,举个例子:
String s1= "abc";
String s2="abc";
System.out.println(s1==s2);
此时的结果是个true。我来解释一下:
这就涉及到了内存中的常量池,常量池属于方法区的一部分,当运行到s1创建对象时,在编译时期,查看如果常量池中没有这个对象,就在常量池中创建一个对象”abc”,第二次创建"abc",这个对象的时候,也是在编译时期,查看是否存在改对象,很明显,已经存在,这个时候,就会还回改对象的地址,所以s1,s2变量中存放是同一个对象的地址。所以是相等的。能理解吧。
然后,第二个例子来了:
String s1= "abc";
String s3= "a"+"b"+"c";
System.out.println(s1==s3);
此时的结果也是true。现在是不是又疑惑了。根据第一个例子,按理应该是false。因为常量池存在“abc”的地址值了,但是咱们是 a b c 不应该是创建三个地址值,然后拼接嘛。
然后我查了下资料,了解后,原因是:比较字符串的时候,常量池经过优化,优化后的结果就是,当你拼接 字符串时确定值的时候,它会先给你拼接字符串,然后再去,常量池去匹配有没有相同的地址。有的话跟第一个例子同理。
然后我又测试了一下,不是固定值的时候:
String s1 = "abc";
String x = "b";
String s4= "a"+x+"c";
System.out.println(s1==s4);
此时的结果是false。
因为x不是确定值,可以改变,所以当不是确定值的是,常量池不会给你拼接之后去匹配,而是直接给你,创建一个新的,所以就是false
再来介绍一下equals:
首先,咱们从源码知道,equals()方法存在于Object类中,然而,源码中底层也是用的==号来实现的。但是通过学习,咱们都知道,java大多数类,都是重写了equals方法。
重写后的equals()方法一般都是比较两个对象的值(可以去看源码)。
如果没有重写equals()方法,那么底层也是通过 (等等号)来实现的。
所以equals方法我也不多做解释了,==号我已经解释的很清楚了。
最后,我自己总结了一下:
当你想去比较相等时:
①如果是数值型使用==号
②当比较字符串是否相等时,需要使用equals