黑马程序员技术交流社区

标题: equals和== 我凌乱了... [打印本页]

作者: 蒋昌宏    时间: 2012-2-16 19:42
标题: equals和== 我凌乱了...
class Person{
        private String name ;
        private int age;
        public Person(String name,int age){
                this.name = name ;
                this.age = age ;
        }
        public String getName(){
                return this.name ;
        }
        public int getAge(){
                return this.age ;
        }
};

public class CompareDemo02{
        public static void main(String args[]){
                Person per1 = new Person("张三",30) ;
                Person per2 = new Person("张三",30) ;
                if(per1.getName().equals(per2.getName())&&per1.getAge()==per2.getAge()){
                        System.out.println("是同一个人!") ;
                }
                String per3 = new String("Jiangchanghong");
                String per4 = new String("Jiangchanghong");
                System.out.println(per3+"\n"+per4);
                        if(per3.equals(per4)&&per3==per4){
                        System.out.println("是同一个人!") ;
                }
                        if(per3.equals(per4)){
                        System.out.println("是同一个人!") ;
                }
                        if(per3==per4){
                        System.out.println("是同一个人!") ;
                }
        }
};


运行结果:
是同一个人!
Jiangchanghong
Jiangchanghong
是同一个人!

第一个判断的==是相等的吗?不是说对比内存吗,,,
第二个判断为什么打出来了结果...而第三个和第四个却没打出来,,,
作者: 刘基军    时间: 2012-2-16 19:48
是同一个人!
Jiangchanghong
Jiangchanghong
是同一个人!  //应该下面的if语句的输出结果: if(per3.equals(per4)){
                        System.out.println("是同一个人!") ;


作者: 冯祖焱    时间: 2012-2-16 19:56
最后一个 是同一个人! 是 if(per3.equals(per4))这个判断而输出的

简单地说,equals是判断内容是否相同,==是判断两个变量所指向的内存地址是否相同
作者: 李杨    时间: 2012-2-16 20:18
为什么我发的回复要审核呢?
作者: 李杨    时间: 2012-2-16 20:20
既然这样那就杀人了!!!!!!!!

话说在公园200年的时候,一个名字叫小鱼的武林高手得了忧郁症。话说在200年的忧郁症都是这样的特征,武林高手去杀人,而杀死的人都表现为开心,大闹,疼痛,抽风等表现,死法太多,一些武林高手时刻都在想我是武林高手哇,我一剑你就得死,声都不能出,这才叫痛快。所以不想看到临死前的人有这么表现,而想看到一命呜呼的崇高死法,这就是200年的忧郁症了。


小鱼的病情已经到了晚期,后来有个名字叫 李仙儿的算命大师就出现了,他对小鱼说:

小鱼你别伤心了,有你李哥在,大师就说了,,就说了啊,,不是结巴啊。。小鱼你听好了。

要想那人死的快,容易啊 。。。我教你个招,这招让人一剑致命不死都不原谅自己的招数,这招叫做“装饰模式”, 此招可用在剑上,刀上,,就是刀枪棍棒,,斧钺钩叉上面都可以是使用此招,,记住了装饰模式。。

后来小鱼很高兴,大师您go on吧,大师你先去拿你的剑去杀个人我看你伸手如何,小鱼就拿着它宠爱的剑去杀人了,走着走着,唉,看到个人,先打声招呼,你好!只见小鱼伸手敏捷,一剑刺去,只见那人很开心的说你剑法不行啊,小鱼傻了,看那个人这么高兴,怎么回事啊,,过了1个小时,那人高兴过度死亡,死亡时间 200年一个阳光明媚的早晨。

后来小鱼不是很满意的说,李叔啊,那人头死很开心啊,还一度的嘲笑我。我说啊,小鱼你别着急,我现在就告诉你崇高的招数,装饰模式,我说这有瓶蒙汗药你擦在剑上,然后去杀人,小鱼听到了这招貌似可行,我试试看,小鱼在剑上擦了蒙汗药后又去杀人了,唉,看到了一个人,小鱼上来搭讪说,去哪啊?那人说我去的地方挺远的在西边就过那个山头就到了,这时小鱼指着树上说,看那是什么,那人一回头看树的瞬间小鱼一剑刺去,只见那人晕乎乎的走了几步说你这叫杀人吗,你到大点劲儿啊,小鱼傻了,看着那人,过了30分钟,那人说我睡一会啊,天黑你叫我,后天那人就睡过去了。。

小鱼还是不满说李叔啊,这招效率低啊,我说我这还有,这瓶你看,,这瓶是我用板蓝根+白开水+Coke研制而成,在深海里埋了70年才酿制成功,味道不错。给了小鱼,小鱼擦在了剑上,去杀人了,看到一头牛,哇塞,,呵呵,,你好壮啊。。小鱼匍匐到牛的身边,还假装牛叫,还向牛放了电,后来就在一瞬间,牛没有hold住,小鱼一剑刺去,只见牛好发无损的糖躺在了草地上,身上放这光芒。。

小鱼很高兴,说原来这就是装饰模式,

在剑上擦上多种强力毒药,毒性越来越强,杀人才high。装饰模式的威力就是大啊。。

过了9×9=81天出现了武林盟主,此人名字就做小鱼。。
作者: 李杨    时间: 2012-2-16 20:21
既然这样那就杀生了!!!!!!!!

话说在公园200年的时候,一个名字叫小鱼的武林高手得了忧郁症。话说在200年的忧郁症都是这样的特征,武林高手去杀人,而杀死的人都表现为开心,大闹,疼痛,抽风等表现,死法太多,一些武林高手时刻都在想我是武林高手哇,我一剑你就得死,声都不能出,这才叫痛快。所以不想看到临死前的人有这么表现,而想看到一命呜呼的崇高死法,这就是200年的忧郁症了。


小鱼的病情已经到了晚期,后来有个名字叫 李仙儿的算命大师就出现了,他对小鱼说:

小鱼你别伤心了,有你李哥在,大师就说了,,就说了啊,,不是结巴啊。。小鱼你听好了。

要想那人死的快,容易啊 。。。我教你个招,这招让人一剑致命不死都不原谅自己的招数,这招叫做“装饰模式”, 此招可用在剑上,刀上,,就是刀枪棍棒,,斧钺钩叉上面都可以是使用此招,,记住了装饰模式。。

后来小鱼很高兴,大师您go on吧,大师你先去拿你的剑去杀个人我看你伸手如何,小鱼就拿着它宠爱的剑去杀人了,走着走着,唉,看到个人,先打声招呼,你好!只见小鱼伸手敏捷,一剑刺去,只见那人很开心的说你剑法不行啊,小鱼傻了,看那个人这么高兴,怎么回事啊,,过了1个小时,那人高兴过度死亡,死亡时间 200年一个阳光明媚的早晨。

后来小鱼不是很满意的说,李叔啊,那人头死很开心啊,还一度的嘲笑我。我说啊,小鱼你别着急,我现在就告诉你崇高的招数,装饰模式,我说这有瓶蒙汗药你擦在剑上,然后去杀人,小鱼听到了这招貌似可行,我试试看,小鱼在剑上擦了蒙汗药后又去杀人了,唉,看到了一个人,小鱼上来搭讪说,去哪啊?那人说我去的地方挺远的在西边就过那个山头就到了,这时小鱼指着树上说,看那是什么,那人一回头看树的瞬间小鱼一剑刺去,只见那人晕乎乎的走了几步说你这叫杀人吗,你到大点劲儿啊,小鱼傻了,看着那人,过了30分钟,那人说我睡一会啊,天黑你叫我,后天那人就睡过去了。。

小鱼还是不满说李叔啊,这招效率低啊,我说我这还有,这瓶你看,,这瓶是我用板蓝根+白开水+Coke研制而成,在深海里埋了70年才酿制成功,味道不错。给了小鱼,小鱼擦在了剑上,去杀人了,看到一头牛,哇塞,,呵呵,,你好壮啊。。小鱼匍匐到牛的身边,还假装牛叫,还向牛放了电,后来就在一瞬间,牛没有hold住,小鱼一剑刺去,只见牛好发无损的糖躺在了草地上,身上放这光芒。。

小鱼很高兴,说原来这就是装饰模式,

在剑上擦上多种强力毒药,毒性越来越强,杀人才high。装饰模式的威力就是大啊。。

过了9×9=81天出现了武林盟主,此人名字就做小鱼。。
作者: 戚雪晖    时间: 2012-2-16 21:44
楼主你测试时候每段最好用不同的话打印出来
这样会让你更加清晰的了解到输出结果
per1.getAge()==per2.getAge()
==比较的是栈内存中两个变量的值是否相同
1.如果是基本数据类型,自然他比较的就是基本数据类型的值
2.如果是引用数据类型,比较的就是引用数据类型的值,而在栈内存中的变量指向的是一个引用,也就是一个地址。所以比较的就是地址。
这一句其实是比较的per1里的age跟per2里的age属性,而age是基本数据类型int,==比较的是这俩基本数据的值。
equals比较的是对象的内容,这个方法是可以重写的。当然String类已经重写了Object类的equals方法,所以比较String类型的时候用equals自动比较的就是String对象的内容。
作者: 熊玖帅    时间: 2012-2-17 09:13
可以把==想象成人的长相是否一样
把equals想象成人的本质是否一样
==比较两个内存单元中的数据是不是一样的
equals比较内存单元中指向的 实际对象的内容 是不是同一个
作者: 蒋昌宏    时间: 2012-2-17 13:15
1毫秒的价值 发表于 2012-2-16 21:44
楼主你测试时候每段最好用不同的话打印出来
这样会让你更加清晰的了解到输出结果
per1.getAge()==per2.getA ...

噢~懂了 谢谢
作者: 沈样    时间: 2012-2-17 14:06
这个问题应该有人提问过了,equal是比较内容,==是比较内存的地址
作者: 郑苑东    时间: 2012-2-18 20:00
你应该是想问这个。。当我们new一个String字符串时,如果这个字符串已经存在了,他会直接指向那个存在的字符串。不是重新去new。。我忘记了。
作者: 郑苑东    时间: 2012-2-18 20:15
当我们去new的时候,首先在String Pool中查找看看有没有我们所要new的字符串。如果有就不会再String Pool中创建。。直接在堆中创建了。将堆中的地址返回来了。。如果没有就会先在String池中创建,然后再去堆中创建,同样将堆中的对象地址返回回来。。上面的记错了。。。
作者: 彭坤    时间: 2012-2-19 10:47
本帖最后由 彭坤 于 2012-2-19 10:49 编辑

先解答,为什么有些没打印出来,因为你的if判断语句块只在被判断语句结果为true的时候才有打印结果,假如为false的话就什么都不打印。
所以在每个if判断后面补充else的话那每个判断都会有相应的输出结果。
第一个判断的==是对比两个对象参数值是否相等,那肯定相等啦,至于你说的对比内存地址是你在对比两个对象,而不是属性值的时候用内存地址对比
  1. Person per1 = new Person("张三",30) ;
  2.       Person per2 = new Person("张三",30) ;
  3.       if(per1.getName().equals(per2.getName())&&per1.getAge()==per2.getAge()){
  4.          System.out.println("是同一个人!") ;
  5.       }else{
  6.               System.out.println("不是同一个人");
  7.       }
  8.       String str1 = new String("abc");
  9.       String str2 = new String("abc");
  10.       if(str1.equals(str2)&& str1==str2){
  11.               System.out.println("是同一个人");
  12.       }else{
  13.               System.out.println("不是同一个人");
  14.       }
  15.       if((str1.equals(str2))&&(str1==str2)){
  16.               System.out.println("是同一个人");
  17.       }else{
  18.               System.out.println("不是同一个人");
  19.       }
  20.       
  21.       if((str1.equals(str2))){
  22.               System.out.println("是同一个人");
  23.       }else{
  24.               System.out.println("不是同一个人");
  25.       }
  26.       
  27.       if((str1==str2)){
  28.               System.out.println("是同一个人");
  29.       }else{
  30.               System.out.println("不是同一个人");
  31.       }
复制代码





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