首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

聊聊java中“==”跟equals的关系

2012-11-05 
聊聊java中“”和equals的关系。java中的“”和equals 相信一直纠结这很多初学者;他们到底是怎么一回事,到

聊聊java中“==”和equals的关系。
java中的“==”和equals 相信一直纠结这很多初学者;他们到底是怎么一回事,到底有什么区别?你总会感觉你刚弄懂点,然后出来一个题,又失败了,要彻底弄清楚他们之间的运行机制,最好的办法就是看他们的源码和API说明,首先大家看一下下面的这段代码:

(1)String s1 = "Monday";
         String s2 = "Monday";
         if (s1 == s2)
             System.out.println("s1 == s2");
         else
             System.out.println("s1 != s2");
     }
}

编译并运行程序,输出:s1 == s2

(2)     String s1 = "Monday";
         String s2 = "Monday";
         if (s1.equals(s2))
             System.out.println("s1 == s2");
         else
             System.out.println("s1 != s2");
     }
}

编译并运行程序,输出:s1 == s2

(3)    String s1 = new String("Monday");
         String s2 =  new String("Monday");
         String s3="Monday";
         if (s1 == s2){
             System.out.println("s1 == s2");
         }else{
             System.out.println("s1 != s2");
     }if(s1 == s3){
             System.out.println("s1 == s3");
        }else {
             System.out.println("s1 != s3");
           }
}

编译并运行程序,输出:s1 != s2; s1!= s3
(4)     String s1 = new String("Monday");
         String s2 =  new String("Monday");
         String s3="Monday";
         if (s1.equals(s2)){
             System.out.println("s1 == s2");
         }else{
             System.out.println("s1 != s2");
     }if(s1.equals(s3)){
             System.out.println("s1 == s3");
        }else {
             System.out.println("s1 != s3");
           }
}

编译并运行程序,输出:s1 == s2;s1 == s3



(5) Manager m1 = new Manager("jack",1400,"1994-5-8","NEC");
     Manager m2 = new Manager("jack",1400,"1994-5-8","NEC");
     if (m1.equals(m2))
             System.out.println("m1 == m2");
         else
             System.out.println("m1 != m2");
编译并运行程序,输出:m1 != m2

(6)  Manager m1 = new Manager("jack",1400,"1994-5-8","NEC");
     Manager m2 = new Manager("jack",1400,"1994-5-8","NEC");
     if (m1==m2)
             System.out.println("m1 == m2");
         else
             System.out.println("m1 != m2");
编译并运行程序,输出:m1 != m2

解析:对于(1)没有“new“一个对象,所以对象Monday放在字符串常量池里面,s1和s2指向的是同一个对象。==表示的是对象的地址,也就是变量值,所以他们做判断是值为true。
      对于(2)同样没有new,只不过是equals,它比较的是变量指向的对象的值是否相等,显然是相等的,所以他们的判断值也为true。
      对于(3)new两个了对象,该对象放在内存的堆中,表示两个不同的对象,因此他们栈中的地址肯定也是不一样的,所以判断值为假;
      对于(4)new了两个对象,因为equals比较两个对象的值,所以他们的判断也是true。
      对于(5)new了两个对象,同3!
      对于(6)这时,你可能蒙了,equals不是比较对象值吗,为什么现在不相等了呢?现在的它跟==毫无区别,比较的是地址。所以判断值也为假。



总结:相信你看了上面的有点蒙了,现在来个总结你就会了:
    (1)== 比较的是2个对象的地址,只要new了两个对象,那么他们的地址肯定不一样,对于String类,可以不new,这时他们的对象放在字符串常量池,内容相等的话,就是同一个对象,地址也就想同。
    (2)equals:两种情况:a 如果类型是String类,那么他比较的就是对象的值是否相同,只要对象的值相同,不管new没有new,做判断他们的值都为真,这时因为它覆盖了object类里的equals方法。b 如果不是String类型,那么它的功能就和==一样,比较的是对象的地址是否相同,如上面的(5)。







热点排行