日期:2014-05-20  浏览次数:20670 次

纠结的一个小问题关于==的,求高手指点
两个Sing类型可以比较吗 "0"=="0"


突然看到的一段代码 !!求高手指点下

------解决方案--------------------
本来这类问题不想回答了
看还是有很多人认识上有误区,所以再次简单的说明一下
==和equals比较的都是的两个内存空间的信息
==比较的是直接内存空间的信息(即变量本身的内存信息),equals比较的间接内存空间的信息(即对象本身的内存信息)

首先要清楚“内存空间”,一个变量,本身有自己的内存空间,==就是比较两个变量本身的内存空间的信息,所以是“直接内存空间”,也就是变量本身的内存空间
比如
int a = 1; int b = 1; a==b,比较的是变量a内存的和变量b内存的信息
即a变量的内存信息的是 00000000 00000000 00000000 00000001 (二进制4个byte)
b变量的内存信息是是 00000000 00000000 00000000 00000001 (二进制4个byte)
因为a和b的内存信息一样,所以==是true

equals比较的是变量所引用的对象的内存空间的信息,即不是直接比较两个变量的内存空间的信息,而是比较两个变量所引用的对象的内存空间的信息,所以是“间接内存空间”,也就是对象本身的内存空间而不是变量自身的内存空间
比如
String a = "a"; String b = new String("a");
==比较的是变量a的内存和变量b的内存信息,变量a和b的内存空间里存放的是对象的地址
即a变量的内存是 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx (二进制4个byte "a"对象的地址)
b变量的内村信息是 yyyyyyyy yyyyyyyy yyyyyyyy yyyyyyyy (二进制4个byte,new String("a")对象的地址)
很显然,在这个例子里a的内存信息和b的内存信息不一样,也就是a和b引用的对象不一样,所以a==b是false
而eqauls比较的是对象的内存空间信息,
"a"对象的内存地址是 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx (也就是a变量的内存信息)
该内存地址保存的是00000000 00000061 ('a'字符的ascii码)
同样的new String("a")对象的内存地址是 yyyyyyyy yyyyyyyy yyyyyyyy yyyyyyyy (也就是b变量的内存信息)
该内村地址保存的是 00000000 00000061 ('a'字符的ascii码)
equals比较的是"a"对象和new String("a")对象的内存信息,所以a.equals(b)是true,因为对象的内存信息都是字符'a'的ascii码
可见,a和b两个变量所引用的对象虽然不同,既对象的地址不同,但是对象的内存信息相同,所以a==b是false(两个变量的内存信息不同),a.equals(b)是true(两个对象的内存信息相同)

所以,==比较的是变量的内存信息(直接内存比较),eqauls比较的对象的内存信息(间接内存比较)
因为引用类型的变量的内存信息是对象的地址,所以简单的说==是比较地址,equals是比较内容
但是要清楚,==比较的变量本身的内存信息,equals比较的变量所引用的对象的内存信息
在这点上,学过C/C++的人(了解指针概念的人)都会比较好容易理解

------解决方案--------------------
探讨

引用:
本来这类问题不想回答了
看还是有很多人认识上有误区,所以再次简单的说明一下
==和equals比较的都是的两个内存空间的信息
==比较的是直接内存空间的信息(即变量本身的内存信息),equals比较的间接内存空间的信息(即对象本身的内存信息)

首先要清楚“内存空间”,一个变量,本身有自己的内存空间,==就是比较两个变量本身的内存空间的信息,所以是“直接内存……

------解决方案--------------------
探讨

引用:
引用:

引用:
本来这类问题不想回答了
看还是有很多人认识上有误区,所以再次简单的说明一下
==和equals比较的都是的两个内存空间的信息
==比较的是直接内存空间的信息(即变量本身的内存信息),equals比较的间接内存空间的信息(即对象本身的内存信息)

首先要清楚“内存空间”,一个变量,本身有自己……