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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邢义敏 中级黑马   /  2013-3-5 16:06  /  1596 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邢义敏 于 2013-3-5 21:49 编辑
  1. class V{
  2. }
  3. public class OverWriteEquals {
  4. public static void main(String[] args) {
  5. String s1="123";//实例化两个对象,内容相同
  6. String s2="123";
  7. System.out.println(s1.equals(s2));//使用equals()方法比较s1、s2对象
  8. V v1=new V();//实例化两个V类对象
  9. V v2=new V();
  10. System.out.println(v1.equals(v2));//使用equals()方法比较s1、s2对象
  11. }

  12. }
复制代码
运行结果:
true
false


我想问的是,equals()方法不是比较内容的吗,为什么v1.equals(v2)的值为false呢?

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

4 个回复

倒序浏览
equals是超类Object的方法,String中复写过它,所以是比较内容的,
你自己定义的类是没有复写的,调用的就是Object中的,那是比较地址的.
回复 使用道具 举报
equals方法:如果比较的是字符串类型的,则比较的是内容;如果非字符串类型则比较的是地址。
String s1="123";//实例化两个对象,内容相同
String s2="123";
System.out.println(s1.equals(s2));//使用equals()方法比较s1、s2对
这个比较的是字符串“123”,所以相等。

V v1=new V();//实例化两个V类对象
V v2=new V();
System.out.println(v1.equals(v2));//使用equals()方法比较s1、s2对象
这个比较的非字符串类型,比较内容为空,比较的是地址,而这两个地址不一样,所以为false.


评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
这里的equals(Object obj)实际上调用的是object类的equals方法,其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false。而你的代码中v1和v2是通过两个new语句构造的两个不同的对象,所以结果为false
回复 使用道具 举报
恩呢,比较的是地址呢,只要new出来的对象都会在内存中分配一个存储空间给它,两个不同的内存空间作比较,当然为false;
对于,如下:
String s1="123";
String s2="123";
System.out.println(s1.equals(s2));   //结果为false。
java运行环境有一个字符串池。比如String str="123"时,会首先查看字符串池中是否存在字符串"123",如果存在则直接将"123"赋给str,如果不存在则会先在字符串池中新建一个字符串"123",然后再将其赋给str,所以说s1和s2指向同一个对象;
再有:
String s1=new String("123");
String s2=new String("123");
System.out.println(s1==s2);      //false ,此时创建了三个对象(
字符串池中1个,堆中2个)
这时用==判断就可知,虽然两个对象的"内容"相同(equals()判断),但两个引用变量所持有的引用不同,new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马