黑马程序员技术交流社区

标题: "=="和equals方法究竟有什么区别? [打印本页]

作者: 黑马杨晨    时间: 2012-8-27 21:50
标题: "=="和equals方法究竟有什么区别?
本帖最后由 黑马杨晨 于 2012-8-27 22:26 编辑

"=="和equals方法究竟有什么区别?
作者: 蒋映辉    时间: 2012-8-27 21:53
这问题啊  每期至少出现三次  看看以前的帖子吧....
作者: 追梦黑马    时间: 2012-8-27 21:54
==:是操作符

            (1)当==两边是基本数据类型时(byte、short、int、long、float、double、char、boolean),比较的是两边的变量的值是否相等。

            (2)当==两边是引用数据类型时(自定义的类,String),比较的是引用数据类型的对象的内存地址是否一样,即两边的变量是否引用的是同一个对象。

      

      equals:是方法

            equals是由对象调用的,调用格式:对象名.equals(比较的内容)。

Java中所有的类都默认继承了Object类。在Object类中定义了equals方法:

      public boolean equals(Object obj) {
            return (this == obj);
      }

            这个方法只有在比较的内容是对象自己本身时才会返回true,所以没有什么实用意义。

            当然,像equals这样重要的方法总是有用处的。在实际使用时,很多类中都重写了这一方法,重新定义了比较规则。如果我们想要比较的两个对象不是同一个对象,就应该重写equals方法,让对象按我们定义的相等的条件进行比较。

            注意:在重写equals方法的时候,要满足:自反性、对称性、传递性、一致性、非空性。



      通常情况下,==侧重于对数值的比较,equals侧重对对象的比较……


作者: 朱烈葵    时间: 2012-8-27 22:06
追梦黑马 发表于 2012-8-27 21:54
==:是操作符

            (1)当==两边是基本数据类型时(byte、short、int、long、float、double、cha ...

我先表明 我不知道你是男的还是女的,但是你回的帖子,确实有实力
作者: 方志亮    时间: 2012-8-27 22:07
关于equals与==的区别从以下几个方面来说:
1如果是基本类型比较,那么只能用==来比较,不能用equals
比如:
publicclass TestEquals {
publicstatic void main(String[] args)
{
int a =3;
int b =4;
int c =3;
System.out.println(a== b);//结果是false
System.out.println(a== c);//结果是true
System.out.println(a.equals(c));//错误,编译不能通过,equals方法
//不能运用与基本类型的比较
}
}
2对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。比如:
publicclass TestEquals {
publicstatic void main(String[] args)
{Integer n1 = new Integer(30);
Integern2 = new Integer(30);
Integern3 = new Integer(31);
System.out.println(n1== n2);//结果是false 两个不同的Integer对象,故其地址不同,
System.out.println(n1== n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false
System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true
System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31
}
}
这是Integer的实例,如果是其他的比如Double、Character、Float等也一样。
String(字符串)、StringBuffer(线程安全的可变字符序列)、StringBuilder(可变字符序列)。
介绍一下String的equals与==用法,请看下面的实例:
publicclass TestEquals {
publicstatic void main(String[] args) {
Strings1 = "123";
Strings2 = "123";
Strings3 = "abc";
Strings4 = new String("123");
Strings5 = new String("123");
Strings6 = new String("abc");
System.out.println(s1== s2);//(1)true
System.out.println(s1.equals(s2));//(2)true
System.out.println(s1== s3);//(3)flase
System.out.println(s1.equals(s3));//(4)flase
System.out.println(s4== s5);//(5)flase
System.out.println(s4.equals(s5));//(6)true
System.out.println(s4== s6);//(7)flase
System.out.println(s4.equals(s6));//(8)flase
System.out.println(s1== s4);//(9)false
System.out.println(s1.equals(s4));//(10)true
}
}

作者: 黑马杨晨    时间: 2012-8-27 22:23
蒋映辉 发表于 2012-8-27 21:53
这问题啊  每期至少出现三次  看看以前的帖子吧....

下次注意:P
作者: 梁志冰    时间: 2012-8-27 22:29
学习了!
作者: 梁志冰    时间: 2012-8-28 23:05
ice 发表于 2012-8-27 22:29
学习了!

请问如果申请改名?
作者: 程有愿    时间: 2012-8-29 08:21
“==”:
              a、对基本数据类型变量来说,它比较的是左右两边的值是否相等。
              b、对引用数据类型变量来说,它比较的是左右两边的引用地址是否相同。


“equals()”:
首先,该方法是定义在Object类中的,则java中每个类都可以调用该方法。
              a、对于Object类或没有覆盖equals()方法的类来说,它是判断调用equals()方法的引用与传递进来的引用是否一致,是否指向同一个对象,此时可以认为是等价于“==”的。
              b、对于String类中的equals()方法来说,它是对Object类中的equals()方法进行重写之后的,它判断的是当前字符串与传进来的字符串的内容是否一致。
              c、对于自定义类且覆盖equals()方法的类来说,它是对Object 类中的equals()方法进行重写之后的,它使用用户重写的代码来判断需要自定义比较的内容是否一致。

作者: 吴通    时间: 2012-8-29 08:56
Java中的equals(),==,compareTo()和compare()
1.        首先只有==可以用作两个基本类型数据之间的比较,当然是值比较。当用作两个对象比较时,比较的是对象引用,而不是值比较。
2.        其次任何对象都可以调用.equals()方法,因为这是从Object类继承下来的。Object.equals(Object obj)的缺省实现也是比较对象引用(显然它不知道如何比较值),但Java类库中的绝大多数类都已覆盖了equals()方法,实现了值比较。当然如果你自定义一个类而且没有覆盖equals()方法,当然比较的还是对象引用。
3.        然后compareTo()方法是Comparable接口唯一需要实现的方法。它的返回值不同于equals(),返回的是int值-1、0和1,而不是true和false。如果你的自定义类有自然顺序,那么最好也implements这个Comparable接口并实现compartTo()方法。事实上,Java类库中许多类都实现了这个接口,比如:String、Integer、Date、Time等等。
4.        最后compare()是Comparator接口的一个方法。最为常见的用法是自定义一个类实现Comparator接口,然后在调用Collection.sort()时作为参数传递。这样可以在compare()方法的实现中指定集合元素的排序规则。
equals与compareTo的分别:
equals返回true   or   false。
CompareTo的用法如下:
      如果   String   str1   =   "ddd1 ";
String   str2   =   "ddd ";
那么,str1.compareTo(str2)   返回的是   1,即str1和str2   的长度差。
      如果   String   str1   =   "ddD ";
String   str2   =   "ddd ";
那么,str1.compareTo(str2)   返回的是   -32,即str1和str2中   第一个不相等的字符   ‘D’   和   ‘d’   的ASCII码的差值。

更详细的,可以去看javadoc

equals 是比较两个值的大小 而且在不重写的情况下 是比较两个值内容是否相等 ==是判断地址是否相等(好像是这样)
而compare to一般用来 比较引用的对象的值 而且可以被重写 Java compareTo作用是对一个类中的属性以一定的方式进行组织,写好了可以让数据更有序./** * 实现Comparable接口,重写compareTo方法,返回值1,0,-1 * 覆写compareTo方法就是重建排序规则 */ public int compareTo(Object obj) { Person p = (Person) obj; if (p.score > this.score) { return 1; } else if (p.score < this.score) { return -1; } else { // 如果成绩相等则判断年龄 if (p.age > this.age) { return 1; } else if (p.age < this.age) { return -1; } else { return 0; } } }

作者: 刘俊佳    时间: 2012-8-29 09:36
本帖最后由 刘俊佳 于 2012-8-29 09:43 编辑

"=="和“equals”都有判断和比较对象是否相等的作用,但具体用法却不相同。==是运算符号,而equals则属于方法。当==两边的对象属于基本类型时,==的作用仅是比较对象的值是否相等,如果相等返回true,否则返回false;当两边的对象属于引用数据类型时,==的作用是判断对象的内存地址是否一致,如果同时指向同一地址,则返回true,否则返回false.
  equals两边对象只能属于引用数据类型,因为equals是方法,所以它是如何具体判断对象是否相等是根据程序而定的,equals是属于object类,默认是判断内存地址是否相同,但在object的子类中可以重写equals方法,如在String类中只是比较对象内容是否一致,一致则返回true,否则返回false
例如: String x1=“abc”;
String x2=“abc”;
x1.equals(x2) 返回的结果是true, 因为equals比较的是对象

而 x1==x2 是false 因为当两边的对象属于引用数据类型时,==的作用是判断对象的内存地址是否相同,s1和s2创建了不同的对象,所以内存地址肯定不同。

作者: 王舜民    时间: 2012-8-29 10:18
日经贴。。。。。
作者: 童兴龙    时间: 2012-8-29 10:46
== 是比较对象的引用。equals是Object的一个方法。所有类都继承Object的这个方法。它比较的也是对象的引用。但是String类重写了equals的这个方法。是比较字符串的内容。

当然你也应该按照自己的意愿重写equals方法。这样就可以按你自己的意愿进行比较。如果你想比较就是引用的话就用==就可以了,。特别注意的就是String类自己的比较方式。
所以注意下就可以了。
作者: 尤泽红    时间: 2012-8-29 14:29
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是
否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较
的两个对象是独立的。




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