1,==是运算符,它是比较两者存储地址是否相同。
2,equals()是Object类里的一个方法,它比较的是两者内容是否相同。并且equals()不能用于基本数据类型的比较,如,int,double,
下面我们通过这个例子来更深层的理解两者的不同:
在这之前我们要先搞懂下面两种定义方式的区别,
String s1="hhh";
String s2=new String("hhh");
我们知道String型的数据是存储在常量池里的,如果我们给一个String赋值为“hhh”时,常量池并不会马上开辟一个新的空间,而是先扫描常量池里有没有以前被赋值的“hhh”。如果有,那么String对象会指向已有的“hhh”地址,如果没有现成的“hhh”,才会开辟新的空间,存储“hhh”,并把存储地址传给String对象。这样可以节约大量宝贵的存储空间。
一般情况下我们都用第一种创建方式来给s1赋值,但是String s1='hhh';这个过程不会在堆里创建s1的空间,而是直接在常量池里开辟存储空间,存储"hhh",(因为String型是我们日常大量使用的,如果每建立一个String对象就在堆里开辟一个空间,那将非常浪费。)然后把常量池存储地址存储在栈里的s1里。
如果使用String s2=new String("hhh");就不一样了。使用了new就会在堆空间里开辟一个空间给s2对象,这时栈里的s2里存储的就是s2在堆空间里的地址了。而此时栈空间里的s1存储的是常量池的地址。
这两种方法的内存地址区别,如图, D01是s2对象地址,CL01是“hhh”在常量池里的地址。
我们再比较一下,
String s1="hhh";
String s2=new String("hhh");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
==输出的是false,
而equals()输出的是true。
很明显equals()只比较了s1和s2的内容,而==比的是地址。
如果是下面的定义方式,
String s1=new String("hhh");
String s2=new String("hhh");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
==是false,equals()是true。
String s1="hhh";
String s2="hhh";
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
==和equals()都是true