黑马程序员技术交流社区

标题: == 与equals [打印本页]

作者: 张源锋    时间: 2013-4-2 18:03
标题: == 与equals
  1.         @Test
  2.         public void test5(){
  3.                 String str = new String("abc");
  4.                 String str1 ="abc";
  5.                 boolean b1 = str==str1;
  6.                 boolean b2 = str.equals(str1);
  7.                 System.out.println(b1+" | "+b2);
  8.         }
复制代码
结果
  1. false | true
复制代码
求==与equals的区别

作者: 黑马-郑玉元    时间: 2013-4-2 18:12
通常情况下!==比较的是地址!equals比较的是内容!但是object类里面的equals方法比较的还是地址,自定义的类,如果要比较其内容就要重写equals方法!上述题目当中,你new的对象和那个直接赋值在不同地址中,所以==是false,equals是true!
作者: 抽烟男孩    时间: 2013-4-2 18:16
本帖最后由 抽烟男孩 于 2013-4-2 18:21 编辑

针对以上代码,如果是==需要两个String对象的引用(表示的内存地址块相同),而equal仅仅需要其内容即字符串相同。
因为如果是==的话它还包括对象的序列号和一些object属性。
作者: kelline    时间: 2013-4-2 18:19
== 是用来比较在内存地址的  而equals  则是比较实际的内容
比如你的代码中:
String str = new String("abc");  -- 通过new实例化出的对象, 他会存放在内存中开辟的空间
                String str1 ="abc";  --  通过赋值在堆内存中开辟出的空间

他们的内存地址是不同的,  所以当使用  == 来进行判断的时候, 会false

而equals  是用来比较放在内存中的值的, 因为他们都是abc , 所以返回值是true
作者: 庞立森    时间: 2013-4-2 18:32
equals比较的是内容,因为都是"abc"所以是true,==比较的是地址值,new这个关键字表示在内存里面开辟一个新的内存空间,他的地址值和原来的是不一样的,所以是false
一般情况下,我们会去自己重写equals方法来满足我们个人的要求
作者: HM张勇    时间: 2013-4-2 18:34
Equals方法比较的是内容是否相等

==用来比较两个对象是否相等。它比较的是地址是否相同。
作者: 赵海洋    时间: 2013-4-2 18:35
以上代码中,==比较的是内存地址,两个str的内存地址显然不同。而代码中equals是String方法中的equals,不是Object的,所以可以直接比较内容,即字符串的内容是不是相等,所以返回值一个是false,一个是true。
作者: 原满    时间: 2013-4-2 18:56
==用来比较对象的引用是否相等,此例中str==str2比较的是str 与str2 的内存地址 str与str2的内存地址值不同所以返回false
equals方法是Object类提供的一个实例方法,String对象的equals 方法重写了Object的equals()方法,可以用来判断两个字符串的值是否相等,此例中显然str与str2的值都是"abc" 所以str.equals(str1)返回true




作者: 范鹏飞    时间: 2013-4-2 19:04
如果是基本类型的话,可以用==判断,判断的是值。
引用类型的如果用==判断,判断的是地址值,new出来的两个对象,虽然对象本身相同,但是地址值肯定是不同的,所以是false。
用equals判断的是对象本身的内容,这就是true。
作者: yangyinhui    时间: 2013-4-2 19:04
对于实例对象而言,==比较的依然是内存地址(所以你可以看出无论什么情况,==一直比较的都是内存地址),而equals()默认重写Object类的equals()方法(比较地址)。但是一般我们会自己重写equals(),让它比较值是否相等
针对你的问题:首先str==str1;比较的是内存地址很显然他们的内存地址是不同的"str"是new出来的对象,"str1"是一个字符串。
str.equals(str1);
作者: yangyinhui    时间: 2013-4-2 19:09

针对你的问题:首先str==str1;比较的是内存地址很显然他们的内存地址是不同的"str"是new出来的对象,"str1"是一个字符串。
str.equals(str1);它们比的是内容,很显然他们都是"abc".在这段代码中==比较的是内存地址,equals比较的是内容。
作者: 李力    时间: 2013-4-2 20:00
"=="是比较内存的地址;一般equals是比较两对象的实际内容是否相同!。但是equals的默认行为是比较引用一般用到时会自己重写覆盖!
作者: 李红志    时间: 2013-4-2 20:09
简单理解就是==要求比equasl高,后者只要求值相等,前者要求是同一个对象即值和位置都相同。
作者: 王川    时间: 2013-4-2 20:46
==比较是否相同(地址相同),equals比较是否相等




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2