这个问题一直困扰着初学java时的自己,以至于到现在有时候还不是很坚定自己是真知道,所以就总结一下吧。
目录:
1.总述
2.实例代码
****************************1.总述*****************************
对于基本类型:==比较的是值是否相等。
在java中声明一个基本类型变量并赋给它初始值,系统会在堆栈中(栈)开辟内存空间,这个变量存储的就是值。设计者认为这样做更加高效,事实的却如此。
对于引用类型(对象):==比较的是对象的引用。equals比较的是对象的内容(暂且这样描述,因为不确定这样描述是否真的合适)。
使用new关键字创建一个对象,系统会在堆中给新创建的对象分配内存空间(比在栈中存储需要更多的时间),对象的引用在栈中,引用中存储的是指向对象的地址。
****************************2.实例代码**************************
注意看示例代码第一行的注释
1 //基本类型示例 2 public class Test { 3 public static void main(String[] args) { 4 int i = 5; 5 int n = 5; 6 int s = 15; 7 System.out.println(i == n); 8 System.out.println(i == s); 9 System.out.println(n == s); 10 } 11 } 12 /*运行结果 13 true 14 false 15 false 16 */
基本类型不多做解释,理解了他的内存分配以及存储机制,然后自己动手试一下即可。
1 //引用类型之java类库中提供的类 2 public class IntegerTest { 3 public static void main(String[] args) { 4 Integer n1 = new Integer(47); 5 Integer n2 = new Integer(47); 6 System.out.println(n1 == n2); 7 System.out.println(n1.equals(n2)); 8 } 9 } 10 /*运行结果 11 false 12 true 13 */
引用类型之java类库中提供的类。总述中描述了,对象的引用中存储的是指向对象的地址,那么很明显new了两个对象,n1中存储的是指向n1对象的地址,n2存储的
是指向n2对象的地址,很显然不是同一个对象,那么n1、n2存储的地址是不一样的。所以n1==n2运行的结果为false.而对于equals方法来说,它比较的是对象的内容
很显然,上面创建的两个Integer对象是相同的。所以n1.equals(n2)运行结果是true。
1 //创建自己的类 2 public class User { 3 int age; 4 } 5 6 public class UserTest { 7 public static void main(String[] args) { 8 User u1 = new User(); 9 User u2 = new User(); 10 u1.age = 26; 11 u2.age = 26; 12 System.out.println(u1 == u2); 13 System.out.println(u1.equals(u2)); 14 } 15 } 16 /*运行结果 17 false 18 false 19 */
看到这是不是又陷入困惑了。。。
首先看u1==u2,这个结果有了之前的"引用类型之java类库中提供的类"这个示例,应该在预料之中。
u1.equals(u2)这个结果有些匪夷所思了。这是由于equals的默认行为是比较引用的,所以得到的结果与==一样就是正确的。
而java类库中的大多数类都重写了equals方法,让他比较对象的内容,所以要想让equals返回的结果是对象内容的比较需要在自己定义的类中重写equals方法。
1 //创建自己的类,重写equals方法 2 public class User { 3 int age; 4 5 public boolean equals(Object obj){ 6 if(obj instanceof User){ 7 return age == ((User)obj).age; 8 } 9 return false; 10 } 11 } 12 13 public class UserTest { 14 public static void main(String[] args) { 15 User u1 = new User(); 16 User u2 = new User(); 17 u1.age = 26; 18 u2.age = 26; 19 System.out.println(u1 == u2); 20 System.out.println(u1.equals(u2)); 21 } 22 } 23 /*运行结果 24 false 25 true 26 */
这里主要讲解==与equals的用法,并非是讲解equals如何重写,所以有关equals如何重写以及遵循哪些要求请参照相关内容。
还有一点特别声明一下,当你使用String来做示范时,可能会与上面示范的例子有些冲突,这是由于String的存储方式决定的,只要搞懂了String是如何开辟内存的
结果总是在你的预料之中。
浙公网安备 33010602011771号