黑马程序员技术交流社区

标题: ==和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