大家基本都知道:
1、==:
基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是它们的值。
复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
2、equals :
在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址。
但在一些类库中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,比较的是对象本身了。
在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的。
看如下代码:
public class Test {
public static void main(String[] args) {
String s1="abc";
String s2="abc";
String s3=new String("abc");
char []a= {'a','b','c'};
String s4=new String(a);
StringBuffer s5=new StringBuffer("abc");
StringBuffer s6=new StringBuffer("abc");
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s3.equals(s4));
System.out.println(s5.equals(s6));
}}
打印结果如下:
true
false
true
false
1、为什么第一为true呢?
说明s1和s2引用了同一个String对象,这就涉及到java中 常量池 的概念了。
程序在运行的时候会创建一个字符串缓冲池当使用,理解为常量池,每次创建一个常量引用时 都会先在池中寻找,如果没有 才会创建一个新的,并放入 池中;
S1和S2都是引用,所以他们同时指向了放在常量池的"abc"。所以他们指向的地址是相同的,即结果为 true
2、那第二个,S3不是也是"abc"吗?为啥是false呢??
这是因为,每次 new 的时候,都会在堆区创建一个新的对象,如上图。即 == 比较为 false。
3、第三个 为 true
通过查看源码,我们能看到,String 类 重写了equals方法,比较的是对象本身,即 true。
同时S4是是使用了String的构造函数,传入字符数组,返回字符串。
4、为什么第四个为 false???
这是因为在 StringBuffer 类并没有重写equals方法,所以它比较的仍是地址。