A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 青木郎 中级黑马   /  2014-3-21 13:25  /  1243 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

"=="运算符专门用来比较两个变量的值是否相等,也就是比较两个变量缩所对应的内存中所存储的值是否相等。要比较两个基本数据类型的数据或者两个引用变量是否相等。只能用"==";
如果一个变量指向的数据类型是对象类型的,那么这就涉及到两个内存,对象本身一块内存(堆内存),变量一块内存(栈内存),例如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;
}
希望对各位有帮助

4 个回复

倒序浏览
不错,收藏了,谢谢:)
回复 使用道具 举报
恩。其实equals里面判断两个对象是否相等就是使用==来进行判断的,我们要想判断字节码是否是同一伴使用这个也是可以的。
回复 使用道具 举报
==比的是内存中的地址;
equals比的是值,
回复 使用道具 举报
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, 代表两个对象一样
    }
        */
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马