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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 平凡成就非凡 中级黑马   /  2014-3-12 17:29  /  1228 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

== 和equals 的区别?

5 个回复

倒序浏览
==可用于基本类型和引用类型,用于基本类型时候,是比较值是否相同。用于引用类型的时候,是比较对象是否相同。equals不能用基本数据类型,只比较对象中的内容是否相同。一个类没有定义equals方法,它默认继承Object里的方法。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。

equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。
在Object类源码中是这样写的。
public boolean equals(Object obj) {
return (this == obj);
}
他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
public boolean equals(Object anObject) {
if (this == anObject) {
     return true;
}
if (anObject instanceof String) {
     String anotherString = (String)anObject;
     int n = count;
     if (n == anotherString.count) {
  char v1[] = value;
  char v2[] = anotherString.value;
  int i = offset;
  int j = anotherString.offset;
  while (n-- != 0) {
      if (v1[i++] != v2[j++])
   return false;
  }
  return true;
     }
}
return false;
    }
String里的方法,如果==号比较不相等,还会进行一下值的比较。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
总结:

    ==是判断两个变量或实例是不是指向同一个内存空间
    equals是判断两个变量或实例所指向的内存空间的值是不是相同

实例:

    public static void main(String[] args) {  
    Integer num1=new Integer(23);  
    Integer num2=new Integer(23);  
    if(num1==num2){  
    System.out.println("地址相等");  
    }else if(num1.equals(num2)){  
    System.out.println("值相等");  
    }  
    }

输出为:值相等

eqauls 与 = =之异同

1)比较方式角度:

= =是面向过程的操作符;equals是面向对象的操作符

= =不属于任何类,equals则是任何类(在Java中)的一个方法;

我们可以:

(1)Primitive1 (基本类型)= = Primitive2(基本类型);

(2)Object Reference1(对象引用)= = Object Reference2(对象引用)

(3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))

这三种比较

但却不能Primitive1 (基本类型).equals( Primitive2(基本类型));

对于基本类型,没有面向对象中发送消息一说,自然也不会有

方法成员。

2)比较目的角度:

1) 如果要比较两个基本类型是否相等,请用= =;

2) 如果要比较两个对象引用是否相等,请用= =;

3) 如果要比较两个对象(逻辑上)是否一致,请用equals;

对两个对象(逻辑上)是否一致的阐释:

有人会问:在C++中, 比较两个对象相等不是也可以用==吗?我知道您是指运算符重载,但是很遗憾,Java中不支持运算符重载(java中亦有重载过运算符,他们是“+”,“+=”,不过也仅此两个,而且是内置实现的);所以,对象的是否相等的比较这份责任就交由 equals()来实现。

这个“逻辑上”其实就取决于人类的看法,实际开发中,就取决于用户的需求;

有人会有看法:“取决于人类的看法”太过宽泛和不严肃,如果某人要两件

风牛马不相及的事物也相等,equals是否也能作出这样的比较呢?我们说可以的

下面这个例子说明了这一点:

    class Horse {  
    String Type;  
    int Legs;  
    //相等的标准:腿的数目相等  
    public boolean equals(Object o){  
    if(this.Legs==((Cattle)o).Legs){  
    return true;  
    }  
    return false;  
    }  
    public Horse(String Type,int legs){  
    this.Type=Type;  
    this.Legs=legs;  
    }   
    }  
    class Cattle  
    {  
    String Type;  
    int Legs;  
    //相等的标准:腿的数目相等  
    public Cattle(String Type,int legs){  
    this.Type=Type;  
    this.Legs=legs;  
    }  
    public boolean equals(Object o){  
    if(this.Legs==((Horse)o).Legs){  
    return true;  
    }  
    return false;  
    }  
    }  
    public class EqualsTest{  
    public static void main(String[] args)  
    {   
    Cattle c=new Cattle("I'm the Cattle",4);  
    Horse h=new Horse("I'm the Horse",4);  
    if(c.equals(h)){  
    System.out.println(c.Type);  
    System.out.println(h.Type);  
    System.out.println("Cattle Equals Horse");  
    }  
    }  
    }

输出结果:

"I'm the Cattle"

"I'm the Horse"

"Cattle Equals Horse"

您瞧瞧:牛果真等于了马,为何相等?因为我们定义的相等标准是:腿的数目相等;您会说:“这太滑稽”,是滑稽,可这是人类的看法,计算机可没有滑稽的概念,当然也没有“不滑稽”的概念,我们定义了什么相等标准,他就踏踏实实的为我们实现了;

所以说:相等标准(即需求)一定要定好,否则,滑稽的事可就多了

第三节:equals()缘起:

equals()是每个对象与生俱来的方法,因为所有类的最终基类就是Object(除去Object本身);而equals()是Object的方法之一。

我们不妨观察一下Object中equals()的source code:

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

注意 “return (this == obj)”

this与obj都是对象引用,而不是对象本身。所以equals()的缺省实现就是比较

对象引用是否一致;为何要如此实现呢?前面我们说过:对象是否相等,是由我们的需求决定的,世界上的类千奇百怪(当然,这些类都是我们根据模拟现实世界而创造的),虽然Object是他们共同的祖先,可他又怎能知道他的子孙类比较相等的标准呢?但是他明白,任何一个对象,自己总是等于自己的,何谓“自己总是等于自己”呢,又如何判断“自己总是等于自己”呢?一个对象在内存中只有一份,但他的引用却可以有无穷多个,“对象自己的引用1=对象自己的引用2”,不就能判断“自己总是等于自己”吗?所以缺省实现实现自然也就是

“return (this == obj)”;

而到了我们自己编写的类,对象相等的标准由我们确立,于是就不可避免的要覆写

继承而来的public boolean equals(Object obj);

如果您有过编覆写过equals()的经验(没有过也不要紧),请您思考一个问题:

“两个对象(逻辑上)是否一致”实际上是比较什么?没错,或许您已脱口而出:

就是对象的属性(即field,或称数据成员)的比较。方法是不可比较的哦。(这个问题是不是有些弱智呢?哈哈)

第四节:对一个推论的思考

推论如下:一言以蔽之:欲比较栈中数据是否相等,请用= =;

欲比较堆中数据是否相等,请用equals;

因为(根)基本类型,(根)对象引用都在栈中; 而对象本身在堆中;

这句话又对又不对,问题出在哪,就是“数据”二字,先看栈中,数据或为基本类型,或为对象引用,用==比较当然没错;但是堆中呢?对象不是堆中吗?不是应该用equals比较吗?可是,我们比较的是堆中“数据”,堆中有对象,对象由什么构成呢?可能是对象引用,可能是基本类型,或两者兼而有之。如果我们要比较他们,该用什么呢,用”equals()”?不对吧,只能是”= =”!所以正确的结论是:欲比较栈中数据是否相等,请用= =; 欲比较堆中数据是否相等,请用equals;

因为(根)基本类型,(根)对象引用都在栈中(所谓“根”,指未被任何其他对象所包含);而对象本身在堆中。

到这,==和equals的区别介绍完了,希望对你有帮助。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
==是用于 数值之间的相等,而equals是字符串之间的相符,记住,是" 相符“而不是”相等“;比如字符串y与Y就是相符合的。
回复 使用道具 举报
==可用于基本类型和引用类型,用于基本类型时候,是比较值是否相同,而equals比较的是一个对象在内存中的地址值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马