黑马程序员技术交流社区

标题: 为什么输出的不是true呢?难道不是同一个对象么! [打印本页]

作者: 阮文江    时间: 2015-8-15 21:05
标题: 为什么输出的不是true呢?难道不是同一个对象么!
本帖最后由 阮文江 于 2015-8-15 21:20 编辑

String str2 = new String("abc");
System.out.println(str2 == "abc");


作者: 蓬头小道士    时间: 2015-8-15 21:10
你这写的也太模糊了吧
作者: 阮文江    时间: 2015-8-15 21:21
蓬头小道士 发表于 2015-8-15 21:10
你这写的也太模糊了吧

不好意思刚没把abc传进去
作者: 不忘初心、    时间: 2015-8-15 21:39
“==”比较的时候指向了两个地方
作者: wode1311    时间: 2015-8-15 21:42
"abc"作为字符串常量,是保存在方法区的常量池里的,而str2是通过new创建的,会申请一个新的内存空间。两者的地址不同,比较后返回的值就是FALSE了。
作者: kevin986745    时间: 2015-8-15 21:44
一看就知道不是一个内存地址,所以不可能相等!
作者: kenfans    时间: 2015-8-15 21:47
看来你还没有理解这句代码。

这句话在内存中创建了两个对象一个对象是字符串abc,一个对象的new String,这个new String是字符串abc的引用。而左边的str2则是这个new String的引用。它的值应该的这个new String的地址,而这个new String才是abc。

大概就是这样理解,也不知道我说得对不对,这是我自己的理解
作者: 阮文江    时间: 2015-8-15 21:48
wode1311 发表于 2015-8-15 21:42
"abc"作为字符串常量,是保存在方法区的常量池里的,而str2是通过new创建的,会申请一个新的内存空间。两者 ...

您的意思是说那个语句是创建了两个对象么?
作者: pengbeilin    时间: 2015-8-15 22:01
"=="和 和 equals  方法究竟有什么区别?
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一
起说,则很难说清楚)
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存
储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作
符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块
内存(堆内存) ,变量也占用一块内存,例如 Objet obj = new Object();变量 obj 是一个内存,
new Object()是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对象占用的那
块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即
要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相
同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条 new 语句创建了两个对象,然后用 a/b 这两个变量分别指向了其中一个对象,这是两
个不同的对象,它们的首地址是不同的,即 a 和 b 中存储的数值是不相同的,所以,表达
式 a==b 将返回 false,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回
true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input
= …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上
找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都
是使用 equals 方法。
如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法,Object 类
的 equals 方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类继承
的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用
equals 和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回 false。如果你
编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals
方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
作者: wode1311    时间: 2015-8-15 22:10
阮文江 发表于 2015-8-15 21:48
您的意思是说那个语句是创建了两个对象么?

可以这样理解,首先有一个字符串类型的“abc",然后又调用String 的带参构造,将”abc“作为参数创建了一个新的字符串。
作者: deng2242    时间: 2015-8-15 22:15
这应该是创建了两个对象啊,两个对象的首地址是不可能一样的额
作者: shuguang    时间: 2015-8-15 22:17
比较的是地址值,所以返回false
作者: beimenshisan    时间: 2015-8-15 22:27
str2 是一个对象,而abc是字符串,当然不相等.     比如动物 == 眼睛?
作者: keto    时间: 2015-8-15 22:35
地址值不同,两个对象就不是同一对象~~
作者: 修道解厄    时间: 2015-8-15 23:11
str2指向堆内存,"abc"的地址是在常量池中.str2对象中的"abc"与字符串常量"abc"地址也不相同




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