黑马程序员技术交流社区

标题: equals和== [打印本页]

作者: 程有愿    时间: 2012-7-3 08:56
标题: equals和==
equals不是判断对象在栈中的内容是否相等,而==则是判断对象在堆中的类存是否相等,但我看到在毕老师中
的视频里有段代码   
class Person
{}
class Test
{  public static void main(String[] args)
{
       Person p1=new Persom();
       Person  p2=new Person();
   System.out.println("Person:"+p1.equals(p2));
}
}
结果为false   这个是为什么呢,p1=null,p2=null才对啊,结果应该为true才对,求解释
作者: 陈淑飞    时间: 2012-7-3 09:09
此题目被提烂了,楼主可以搜下贴子里关键字。也可以查下帮助文档。
equals方法,若没有被重写的话,那就是直接从Object类中继承下来的,而继承下来的是对比两个对象是否完全相同,是否是同一对象。
见文档:

作者: 邵阳    时间: 2012-7-3 09:10
本帖最后由 邵阳 于 2012-7-3 09:14 编辑

建议楼主看看帖子http://bbs.itheima.com/forum.php ... id=0&pre_pos=5&ext=

简单理解为:‘==’只负责基本数据类型比较,和引用对象地址比较,而equals则是比较两个对象间的内容是否一样"。(当然这个说法比较片面)

“==”:
              a、对基本数据类型变量来说,它比较的是左右两边的值是否相等。
              b、对引用数据类型变量来说,它比较的是左右两边的引用地址是否相同。


“equals()”:
首先,该方法是定义在Object类中的,则java中每个类都可以调用该方法。
              a、对于Object类或没有覆盖equals()方法的类来说,它是判断调用equals()方法的引用与传递进来的引用是否一致,是否指向同一个对象,此时可以认为是等价于“==”的。
              b、对于String类中的equals()方法来说,它是对Object类中的equals()方法进行重写之后的,它判断的是当前字符串与传进来的字符串的内容是否一致。
              c、对于自定义类且覆盖equals()方法的类来说,它是对Object 类中的equals()方法进行重写之后的,它使用用户重写的代码来判断需要自定义比较的内容是否一致。
你的情况属于第一种


作者: 尹善波    时间: 2012-7-3 10:46



public class People

{   
        private String name;        
        private int  age;      
        public People(String name, int age)
        {      
                this.name = name;
                this.age = age;
        }     
        public String getName()
        {   
                return name;
        }        
        public void setName(String name)
        {      
                this.name = name;
        }        
        public int getAge()
        {      
                return age;
        }        
        public void setAge(int age)
        {      
               this.age = age;
        }
        //对People中的具体内容进行比较,比较他的名字和年龄。
        public boolean equals(People p)
        {        
                if (p.getName().equals(this.getName()))
                {
                        if (p.getAge() == this.getAge())

                                return true;
                }
                else
                {
                        return false;
                }
                return false;
        }
}
public class PeopleDemo
{
        public static void main(String[] args)

        {      
                People a = new People("zhangsan", 7); //新建一个对象
                People b = new People("zhangsan", 7); //又新建了一个对象
                System.out.println(a == b);//这里比较的两个类对象在内存中的地址值,结果是false
               System.out.println(a.equals(b));//这里复写了People类中的equals方法返回true,如没有复写equals方法的话返回false.

        }

}
  

作者: 黑马王双    时间: 2012-7-3 11:17
邵阳 发表于 2012-7-3 09:10
建议楼主看看帖子http://bbs.itheima.com/forum.php ... id=0&pre_pos=5&ext=

简单理解为:‘==’只负责基 ...

给解释一下这个结果么?

在jdk1.5以上的版本中,基本类型和封装类能自动转化,与String类型的对象和字符串常量类似。
        Integer i1 = 123;
        Integer i2 = 123;
        
        int i = 123;
        
        Integer i3 = new Integer(123);
        Integer i4 = new Integer(123);        
               
        System.out.println("i1 == i2 = "+(i1 == i2));
        System.out.println("i1.equals(i2) = "+(i1.equals(i2)));
        
        System.out.println("i3 == i4 = "+(i3 == i4));
        System.out.println("i3.equals(i4) = "+(i3.equals(i4)));
        
        System.out.println();
        System.out.println("i2 == i4 = "+(i2 == i4));
        System.out.println("i2.equals(i4) = "+(i2.equals(i4)));
        
        System.out.println();
        System.out.println("i == i2 = "+(i == i2));
        System.out.println("i1.equals(i) = "+(i1.equals(i)));
        
        System.out.println();
        System.out.println("i == i4 = "+(i == i4));
        System.out.println("i4.equals(i) = "+(i4.equals(i)));
        ------------------------------
       i1 == i2 = true
      i1.equals(i2) = true
      i3 == i4 = false
      i3.equals(i4) = true
      i2 == i4 = false
      i2.equals(i4) = true
      i == i2 = true
      i1.equals(i) = true
      i == i4 = true
      i4.equals(i) = true

作者: 。_Smileヾ淡莣    时间: 2012-7-3 12:57
object中的equale是比较的地址值;比较的堆内存中的地址值;而person在堆内存中new了两个对象;
那么就是说这两个地址值不相同;所以就为false;
作者: 。_Smileヾ淡莣    时间: 2012-7-3 12:57
object中的equale是比较的地址值;比较的堆内存中的地址值;而person在堆内存中new了两个对象;
那么就是说这两个地址值不相同;所以就为false;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2