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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯兵兵 中级黑马   /  2012-2-26 12:43  /  3281 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java中equals和==的有哪些区别?

评分

参与人数 1黑马币 +5 收起 理由
老罗 + 5 太经典了,你不会不知道吧

查看全部评分

14 个回复

倒序浏览
嘿嘿。我来回答第一个技术问题!!
比如:String str1=new String(“abc”); String str1=new String(“abc”); 这两句都是在内存的堆内存中建立了对象,虽然值一样,但是却是两个不同的对象。 “==”是用来判断,是否是同一个对象。也就是判断的是其两边在内存中的地址是不是一样,而Equals判断的是,其值是否相同。也就是对象的内容是否一样。因此: System.out.println(str1==str2);其结果是false,而用System.out.println(str1.equals(str2));其结果就是true了。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 好吧,给你1分

查看全部评分

回复 使用道具 举报
嘿嘿,老罗说的对,这个问题问题真的很经典的,我说说我的理解,对于字符串变量来说,使用equals()和==是有区别的,==是比较两个变量本身的值,就是他们在内存中的首地址,而equals()比较字符串的内容,对于非字符串来说equals()与==没区别,都是比较在内存中的首地址,

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个问题要只从Java底层来说起:
==就是判断这两个相比较的是不是对同一个对的象引用(指针).而equal是看它们引用的对象是不是相同.两者是不一样的.
或许这样不是多明白,看过毕老师视频的都知道栈内存,和堆内存的机制;
其实要用就一句:只要是对象都用equals   8种类型就用==。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 很给力!

查看全部评分

回复 使用道具 举报
==   地址引用
equal 对象内容。
回复 使用道具 举报
恩,知道啦,谢谢大家的解释

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 淡定

查看全部评分

回复 使用道具 举报
我还没发表言论呢,你就知道了{:soso_e105:}
我也说一句:==不能被覆写啊,他只是运算符,不是函数啊...equals到底能做什么?
还不是你怎么覆写就怎么干!!开放的嘛,又没final,所以要具体equals具体判断。
回复 使用道具 举报
沈样 黑马帝 2012-2-26 18:45:34
8#
==比较地址,equals比较内容,你可以重写equals对象来确定比较的内容
回复 使用道具 举报
equals
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。


参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
另请参见:
hashCode(), Hashtable
这是文档

评分

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

查看全部评分

回复 使用道具 举报
看完什么都明白了
回复 使用道具 举报
简单点说,分两种情况:
1. 对于基本类型,没区别
2. 对于引用类型,==判断的是不是同一个,equals判断的是否相同
回复 使用道具 举报
王康 黑马帝 2012-2-27 10:49:43
12#
public class StringAPIDemo {
          public static void main(String[] args)
      {
              String str1="hello";        //String类型变量
              char c[]=str1.toCharArray();        //把字符串转换成字符数组
              for (int i=0;i<c.length ; i++)
              {
                      System.out.print(c+"\t");        //\t为制表符  h        e        l        l        o        
              }
              System.out.println("");        //换行
              String str2=new String(c);        //把数组转换成字符串
              String str3=new String(c,0,3);        //截取字符串str2,从下标0开始,截取3个字符长度的字符.
              System.out.println(str2);        //        hello
              System.out.println(str3);        //  hel
      }
}

java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
  他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
  对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 有代码,有真相

查看全部评分

回复 使用道具 举报
袁野 黑马帝 2012-2-28 16:18:33
13#
== 比较的数值(一般用于基本数据库类型) equals 比较的是地址( 一般用于引用数据类型)
回复 使用道具 举报
额,这个问题是javase中常见的一个问题。我们经常在判断条件里比较是用的非常多:
那么我就以我个人的看法和你谈谈吧:
equals是Object超类中的一个方法,这个方法的实现就是通过==号实现的,==号比较的是两个对象的地址是否相同,在代码中体现出来就是比较两个对象引用中保存的地址是否相同,==能够判断的只是两个对象引用是不是指向同一个地址也就是同一个对象,所以它的相等判断是局限的:

A a1 = new A();A a2 = a1;这个时候a1 == a2是否为true?答案是yes,因为两个对象引用保存的是同一个对象的地址;
A a1 = new A();A a2 = new A();这个时候a1 就不 == a2了,因为两个对象引用指向的是不同的对象.
正因为==号只能判断两个对象引用是否指向同一个对象,
所以决不能用它比较两个普通对象是否相等
,即使两个对象所有的实例域都相同,虽然这在现实中的语义是两个对象指的是同一个事物比如同一个人,
但是因为在代码中它们分配在不同的地址,所以用==号判断它们是不相等的.

回复 使用道具 举报
恩,ok啦,问题已经解决了{:soso_e100:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马