这个问题一直困扰着初学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是如何开辟内存的

结果总是在你的预料之中。

 

posted on 2017-02-19 15:17  十八岁的老男人  阅读(184)  评论(0)    收藏  举报