黑马程序员技术交流社区
标题:
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的话那每个判断都会有相应的输出结果。
第一个判断的==是对比两个对象参数值是否相等,那肯定相等啦,至于你说的对比内存地址是你在对比两个
对象
,而不是属性值的时候用内存地址对比
Person per1 = new Person("张三",30) ;
Person per2 = new Person("张三",30) ;
if(per1.getName().equals(per2.getName())&&per1.getAge()==per2.getAge()){
System.out.println("是同一个人!") ;
}else{
System.out.println("不是同一个人");
}
String str1 = new String("abc");
String str2 = new String("abc");
if(str1.equals(str2)&& str1==str2){
System.out.println("是同一个人");
}else{
System.out.println("不是同一个人");
}
if((str1.equals(str2))&&(str1==str2)){
System.out.println("是同一个人");
}else{
System.out.println("不是同一个人");
}
if((str1.equals(str2))){
System.out.println("是同一个人");
}else{
System.out.println("不是同一个人");
}
if((str1==str2)){
System.out.println("是同一个人");
}else{
System.out.println("不是同一个人");
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2