黑马程序员技术交流社区

标题: java小问题 [打印本页]

作者: 我没心没肺,。    时间: 2015-4-9 10:50
标题: java小问题
class H1{
          public static void main(String args[])
{
                String s1=new String("abc");
                String s2=new String("abc");
if(s1==s2)
                  System.out.println("true");
else
                  System.out.println("false");
}
}
请问运行的结果是什么?Why?

作者: lurenge    时间: 2015-4-9 11:22
1,首先你的main()函数错了  应该是main(String[] args)
2,输出的是false
原因:
1,==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等。
2,两条new 语句创建了两个对象,然后用s1,s2 这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即s1 和s2 中存储的数值是不相同的,所以,表达式s1==s2 将返回false
作者: Fruious    时间: 2015-4-9 11:45
主函数写错啦
作者: mono    时间: 2015-4-9 12:24
肯定是false啊,s1和s2存储的是地址值,肯定是不一样的
作者: WYKings    时间: 2015-4-9 13:21
答案明显是false,==是比较两个内存地址,肯定不一样,用使用equals比对具体的值才行
作者: 杨大萌    时间: 2015-4-9 13:25
主函数书写错误。按程序,输出结果是false,因为string类是引用数据类型,newstring()会在内存中开辟空间存储对象。两条语句是两个对象,所以不相等
作者: 邓熊财    时间: 2015-4-9 13:34
结果是false,应为对比的是他们的哈希值,如果用equals结果是true对比的是对象当中的内容
作者: Mr.Cai    时间: 2015-4-9 13:35
我想说的是,主函数那样写也是可以的
作者: Himoriarty    时间: 2015-4-9 13:36
这个是全部都要比较的,不只是值还有存储地址
作者: 1017161726    时间: 2015-4-9 14:31
lurenge 发表于 2015-4-9 11:22
1,首先你的main()函数错了  应该是main(String[] args)
2,输出的是false
原因:

客官回答的很详细,。有一点就是,主函数像他这么写也是可以的。现在的习惯是把[]放中间。不过放在右边也不为错
作者: Advances    时间: 2015-4-9 14:44
肯定是false,你new了两个String,也就是说你在内存中开辟了两块空间,这两块空间的地址肯定不一样,而s1、s2储存的是地址值,那么这两个string就肯定不一样。
作者: 浅步调    时间: 2015-4-9 14:48
输出值是false啦,换做equals就true啦
解释一下==号,他比较的是一个对象在内存中的地址值,
2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。

equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。

在Object类源码中是这样写的。
public boolean equals(Object obj) {
return (this == obj);
}

作者: 悟败者    时间: 2015-4-9 14:58
false啦   原因么上面讲的很清楚了  我就不说了
作者: 君嘘    时间: 2015-4-9 14:58

因为str是字符串常量   存储在方法区中  
然后你new了两个对象就代表堆内存中有s1和s2   
==比较的是两个对象在内存中的地址是否相同
equals比较的是对象中的常量是否相同
作者: 奋斗_168    时间: 2015-4-9 15:35
这里先说明一下,你的main函数没有写错,这样写也是可以的,但是我们经常见到的是public static void main(String args[]),然后关于你的问题,答案应该是false,这里你建立的是对象,用“==”会将他们的地址进行比较,显然是不正确的,如果你让两个字符串进行比较可以使用equals,
作者: 百思不得解    时间: 2015-4-9 15:44
结果当然是false,因为s1和s2是不同的对象,地址值都不一样。
作者: shw16888    时间: 2015-4-9 15:47
(String args[])这个括号是中文字符,修改后,会是false。
作者: zouxx    时间: 2015-4-9 15:51
围观,false值
作者: kayaking    时间: 2015-4-9 15:55
你new了两个对象,用==是比较两个对象在内存中的地址值,这两个对象的地址值是不同的,所以返回的就是false
作者: z小怪兽    时间: 2015-4-9 19:14
两次new了两个不同的对象
作者: 无梦不远行    时间: 2015-4-9 20:01
一片空白,根本不懂啊
作者: lf027    时间: 2015-4-9 20:19
楼主最好看一楼的,说的非常详细
作者: wenhb    时间: 2015-4-9 20:25
false吧,,s1,s2存的地址吧
作者: 郑卫原    时间: 2015-4-9 20:55
false  你现在比较的是内存地址  肯定是不同的
作者: 吴飞飞    时间: 2015-4-9 21:10

实践是检验真理的唯一标准!!!!!

作者: 小栀子    时间: 2015-4-9 21:13
输出false
作者: 小栀子    时间: 2015-4-9 21:17
原因:String s1 = new String()创建一个对象,s2同样也是对象,==比较的是引用,对象的引用不相等
作者: liyanghml    时间: 2015-4-10 00:24
这帖子里边 好多都是这个问题啊: 显然false  ==比较的是内存地址,s1 s2 两个对象,两个地址,肯定不相等
作者: lurenge    时间: 2015-4-10 10:47
奋斗_168 发表于 2015-4-9 15:35
这里先说明一下,你的main函数没有写错,这样写也是可以的,但是我们经常见到的是public static void main( ...

这个程序就一个main函数,他写成这样不是错了么?
求大神解释?
作者: 13699266500    时间: 2015-4-10 11:26
肯定是false
作者: 刘镓旗    时间: 2015-4-10 11:38
false 因为==号判断的是储存的首地址,并不是两者的值是否相等,所以是false
作者: nate996    时间: 2015-4-10 11:38
false,围观。
作者: 396460221    时间: 2015-4-10 13:44
new创建的是两个对象,==比较的对象的地址值,所以输出是false。如果改成String s1="abc"; String s2="abc",输出的就是true。因为s1会创建,s2会指向s1的对象。字符在常量池中选择的,已经有相同的就不会再创建了。
作者: Sylvanas    时间: 2015-4-10 14:11
false啦.==判断的是地址是否相同,这两个string内容一样,但是对象地址不同
作者: wkz_crystal    时间: 2015-4-10 14:28
false嘛,哥们儿,再学习一下String类的两个引用对象在堆内存的表现形式,一切就OK了
作者: 只是忽然间    时间: 2015-4-10 14:56
每一次使用new关键字都会在堆内存中开辟一块内存,并把这块内存的地址赋值给对应的变量,所以这连个字符串并不是指向同一块内存区域,自然他们就不是同一个对象,所以结果自然明了
作者: duzhi409    时间: 2015-4-10 22:53
主函数那样写是可以的
作者: caotierong    时间: 2015-4-10 23:12
lurenge 发表于 2015-4-9 11:22
1,首先你的main()函数错了  应该是main(String[] args)
2,输出的是false
原因:

没错吧   这种写法是可以的啊
作者: 84489556    时间: 2015-4-10 23:23
答案为假,至于为什么 上面讲的很清楚了




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