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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冷叙辰 中级黑马   /  2013-3-14 11:49  /  1332 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 冷叙辰 于 2013-3-14 18:51 编辑
  1. public class Student {
  2.         private String name;
  3.           private int age;
  4.           public Student(String name,int age)
  5.           {
  6.           this.name=name;
  7.           this.age=age;
  8.           }
  9.           public static void main(String[] args)
  10.           {
  11.           Student st1 = new Student("zhang",20);
  12.           Student st2 = new Student("zhang",20);
  13.           if(st1.equals(st2))
  14.                           System.out.print("相等");
  15.           else
  16.                         System.out.print("不相等");

  17.         }

  18. }
复制代码
为什么输出不相等?

6 个回复

倒序浏览
在超类Object中定义的equals(Object obj)方法,实现对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true。即st1和st2指向的是同一个对象,才返回true.在你的代码中,创建了两个对象,在对内存中就就产生了两个对象。st1里面装的是第一对象的内存地址值,st2里面装的是第二个对象的内存地址值。折射到现实生活中,意思就是两个同名同年龄的人,而不是同一个人。两个不同的人,当然不相等啊。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李洪因 于 2013-3-14 12:11 编辑

老问题,没有复写equals()方法:
  1. public class Student {
  2.     private String name;
  3.       private int age;
  4.       public Student(String name,int age)
  5.       {
  6.       this.name=name;
  7.       this.age=age;
  8.       }
  9.       public static void main(String[] args)
  10.       {
  11.       Student st1 = new Student("zhang",20);
  12.       Student st2 = new Student("zhang",20);
  13.       if(st1.equals(st2))
  14.                       System.out.print("相等");
  15.       else
  16.                     System.out.print("不相等");

  17.     }
  18.      public boolean equals(Object obj){
  19.               
  20.               
  21.               
  22.               if(obj==null) return false;
  23.               else
  24.               {
  25.                if(obj instanceof Student){
  26.                 Student c=(Student)obj;//强制转换
  27.                if(c.name==this.name && c.age==this.age ){
  28.                 return true;
  29.                }
  30.                }
  31.               }
  32.               return false;
  33.               
  34.              }
  35.             


  36. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
有意思!你是两个对象进行比较,你可以分别打出来这两个对象的值!他们是不一样的,两个内存地址。只有字符串的比较用equals。
回复 使用道具 举报
equals是指示其他某个对象是否与此对象相等。
Student st1 = new Student("zhang",20);
Student st2 = new Student("zhang",20)
st1和st2分别new了student 。 也就是说在堆内存中有两个student他们没别属于st1和st2,有两个地址值
这里的equals就是在比较st1、 st2在堆内存中的地址值。当然就不相等了

评分

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

查看全部评分

回复 使用道具 举报
任何类都有一个超类object,该类具有判断两对象是否相等方法equals(),规则是,如果两对象通过==判定后相等就相等,而==比较两对象的地址,如果需要更改比较规则,需要重写equals();
回复 使用道具 举报
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。

String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。
        因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马