黑马程序员技术交流社区
标题:
==和equals的区别
[打印本页]
作者:
青木郎
时间:
2014-3-21 13:25
标题:
==和equals的区别
"=="运算符专门用来比较两个变量的值是否相等,也就是比较两个变量缩所对应的内存中所存储的值是否相等。要比较两个基本数据类型的数据或者两个引用变量是否相等。只能用"==";
如果一个变量指向的数据类型是对象类型的,那么这就涉及到两个内存,对象本身一块内存(堆内存),变量一块内存(栈内存),例如Object obj = new Object();变量obj对应一块内存,new Object()占一块内存,此时obj对应内存中所存储的数据就是对象所占内存的首地址。 对于指向对象的变量,如果要比较两个变量是否指向同一个对象。即比较两个变量对应内存中所存储的数值是否相等。这时就要用"=="。
equals方法是比较两个独立对象的内容是否相同,例如下面代码:
String a = new String("qingmulang");
String b = new String("qingmulang");
两条new语句创建了两个对象,a,b两个变量分别指向其中一个对象。这是两个不同的对象,他们的首地址是不同的,即a和b所存储的数值是不相同的。所以:
reurn a==b;------>false;
return a.equals(b)---->true;
如果一个类没有自己定义一个equals方法,那么默认的equa方式是从Object继承来的就是"=="操作费,也就是比较两个变量是否指向同一个对象,这时候equals和"=="结果是相同的,如果比较两个独立对象结果总是返回false。
Objec类中equals方法如下
boolean equals(Object o)
{
return this == o;
}
希望对各位有帮助
作者:
linweiwen
时间:
2014-3-21 19:52
不错,收藏了,谢谢:)
作者:
syusikoku
时间:
2014-3-21 20:51
恩。其实equals里面判断两个对象是否相等就是使用==来进行判断的,我们要想判断字节码是否是同一伴使用这个也是可以的。
作者:
多一点
时间:
2014-3-21 21:49
==比的是内存中的地址;
equals比的是值,
作者:
老金vic
时间:
2014-3-21 22:05
class Equals {
public static void main(String[] args) {
Person p1 = new Person(new String("张三"), 21);
Person p2 = p1;
System.out.println(p1);
System.out.println(p2);
System.out.println("地址是否相同: " + (p1 == p2)); // 比较两个对象的地址, 判断是否是同一个对象
System.out.println("属性是否相同: " + p1.equals(p2)); // 需求: 比较两个对象的成员变量是否完全相同
}
}
class Person extends Object {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() { // Object类默认是返回"类名@地址", 建议每个类都重写它
return "Person [name=" + name + ", age=" + age + "]"; // 返回一个易于读懂的字符串
}
@Override
public boolean equals(Object obj) { // Object类的equals默认比较地址, 如果我们想比较成员变量, 就可以重写
if (this == obj) // 如果地址相同
return true; // 返回true, 不用比较了, 提高效率
if (!(obj instanceof Person)) // 如果obj不是Person类型
return false; // 返回false, 类型都不一样, 就不用继续比了
Person other = (Person)obj; // 为了访问Person类的成员变量, 所以把Object类型的obj强转为Person
if (this.name == null) { // 如果当前name为空
if (other.name != null) // 另一个对象name不为空
return false; // 返回false, 代表两个对象不一样
} else if (!this.name.equals(other.name)) // 如果name不同
return false; // 返回false, 代表两个对象不一样
if (this.age != other.age) // 如果age不同
return false; // 返回false, 代表两个对象不一样
return true; // 如果上面都没返回, 就返回true, 代表两个对象一样
}
/*
@Override
public boolean equals(Object obj) { // Object类的equals默认比较地址, 如果我们想比较成员变量, 就可以重写
Person other = (Person)obj; // 为了访问Person类的成员变量, 所以把Object类型的obj强转为Person
if (this.name != other.name) // 如果name不同
return false; // 返回false, 代表两个对象不一样
if (this.age != other.age) // 如果age不同
return false; // 返回false, 代表两个对象不一样
return true; // 如果上面都没返回, 就返回true, 代表两个对象一样
}
*/
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2