黑马程序员技术交流社区
标题:
"=="和equals
[打印本页]
作者:
黑马-胡占朝
时间:
2011-7-28 01:22
标题:
"=="和equals
==是专门用来比较同一类型的变量的,而equals则是用来比较两个对象的可以这样理解吧?:)
作者:
匿名
时间:
2011-7-28 01:26
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
作者:
匿名
时间:
2011-7-28 01:50
使用==来判断两个变量是否相等,如果2个变量是[color=Red]基本类型的变量[/color],且都是数值型(不一定要求数据类型严格相同),则只要两个变量的值相等,使用==判断就返回true
但对于两个引用类型的变量,必须他们指向一个对象,==才会返回true,==不可比较类型上没有父子关系的两个对象
如下:[code=java]package cn.itcast.zhanjc;
/**
* Description:
*
*/
public class TestEqual
{
public static void main(String[] args)
{
int it = 65;
float fl = 65.0f;
//将输出true
System.out.println("65和65.0f是否相等?" + (it == fl));
char ch = 'A';
//将输出true
System.out.println("65和'A'是否相等?" + (it == ch));
String str1 = new String("hello");
String str2 = new String("hello");
//将输出false
System.out.println("str1和str2是否相等?" + (str1 == str2));
//将输出true
System.out.println("str1是否equals str2?" + (str1.equals(str2)));
}
}[/code]所以很多时候,程序判断两个引用变量是否相等的时候,是希望一种类似于值相等的判断规则,并不要求这两个引用是不是指向一个对象,例如上面程序中的两个字符串对象,需要他们引用字符串对象包含的字符串序列即可相等,这就需要equals。
注:Object类提供的equals方法和==方法符合没有区别,如下为Object中equals方法,可见他和==无区别[code=java] public boolean equals(Object obj) {
return (this == obj);
}[/code]所以我们在使用这个方法采用自定义的相等标准,重写这个方法
我们在重写equals方法的时候,会判断需要比较的对象和调用这个方法的对象是否相等时时在这两个对象是同一个类的实例的基础上
但是由于instanceof运算份特殊性,当前面对象是后面类的实例或者他子类的实例都将返回true,所以我们最好用[color=Red]两个类的字节码来判断是否为同一个类的实例[/color],并且当两个对象是同一个对象的时候直接返回true,[code=java]package cn.itcast.zhanjc;
//定义一个Person类
class Person
{
private String name;
private String idStr;
public Person(){}
public Person(String name , String idStr)
{
this.name = name;
this.idStr = idStr;
}
//下面省略name和idStr的setter和getter方法。
.........
//重写equals方法,提供自定义的相等标准
public boolean equals(Object obj)
{
//待比较的两个对象是同一个对象,直接返回true
if(this == obj)
{
return true;
}
//只有当obj是Person对象
if (obj != null && obj.getClass() == Person.class)
{
Person personObj = (Person)obj;
//并且当前对象的idStr与obj对象的idStr相等才可判断两个对象相等
if (this.getIdStr().equals(personObj.getIdStr()))
{
return true;
}
}
return false;
}
}[/code]
作者:
匿名
时间:
2011-7-28 22:08
“==”他用于表示同一对象,内从地址相同,“equal”用于表示判断两个对象师父相等。
作者:
匿名
时间:
2011-7-28 23:00
标题:
回复
public class Example1 {
public static void main(String[] args) {
String s1=new String("abc");
String s2=new String("abc");
// s1=s2;
System.out.println("用 == 比较结果");
System.out.println(s1==s2);
//false
}
}
既然两个 String 对象内容同为 "abc" 为什么先打出 false 呢。那是由于 "==" 比较的是两个对象的引用 (references),并不是他们的内容,怎么才能比较内容是否相等呢?去掉 s1=s2 一句的注释符结果就不同了,因为他们的引用相同了。
我们要使用 equals(Object) 方法,由于 equals(Object) 方法为 Object 类中定义的方法,所用按照默认方式定义过的类均是其子类。 也就是说 Object 类为所有类的超类 (super class,也叫父类、基类等),在Object 中的 equals(Object) 方法其标准形式为 public boolean equals(Object obj) 返回类型为 boolean ,即 true/false 与 "==" 返回类型一样。Object 类中定义的 equals(Object) 方法是直接使用 "==" 比较的两个对象,所以在没有覆盖 (override,或称改写、重写) equals(Object) 方法的情况下,equals(Object) 与 "==" 一样是比较的引用。如下例 (结果在注释中):
public class Example4 {
public static void main(String[] args) {
Example4 e=new Example4();
Example4 e4=new Example4();
System.out.println("用 equals(Object) 比较结果");
System.out.println(e.equals(e4)); //结果为 false
System.out.println("用 == 比较结果");
System.out.println(e==e4); //结果为 false
}
}
equals(Object) 方法与 "==" 相比的特殊之处就在于它可以覆盖,所以我们可以通过覆盖的办法让它不是比较引用而是比较数据内容。当然 JDK 中也有覆盖过 equals(Object) 方法的类,如 java.lang.String,它就覆盖了从 Object 继承来的的 equals(Object) 方法,用以比较字符串内容是否相同。看看下面这个例子:
public class Example1 {
public static void main(String[] args) {
String s1=new String("abc");
String s2=new String("abc");
System.out.println("用 == 比较结果");
System.out.println(s1==s2);//false
System.out.println("用equals(Object) 比较结果");
System.out.println(s1.equals(s2));//true
}
}
例中用 equals(Object) 比较结果为 true。用 == 比较结果为 false。String.equals(Object) 方法直接比较了两个字符串的内容,如果相同则返回 true ,否则返回 false。你可以尝试把其中一个 "abc" 改成 "abcde",看看结果有何变化。
作者:
匿名
时间:
2011-7-28 23:01
此为[color=Red]重复贴[/color],很久以前有前辈提问过了,以下为链接
[url]http://bbs.itheima.com/viewthread.jsp?tid=232&highlight=equals%2B[/url]
强烈建议,提问之前可以用论坛右上角的搜索功能搜索一下,没有从恢复的再提问。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2