==和equals的区别
2016-01-21 00:06
393 查看
1、==和equals的区别
==运算符比较的是栈中存放的值是否相等,而equals比较的是堆中存放的值是否相等。
2、String类型变量的==和equals
字符串常量均存储在字符串缓冲池中,当将一个字符串常量赋给一个变量时,首先会在字符串缓冲池中寻找是否有该字符串,如果有则将该字符串的地址赋给字符串常量,因此对于stringData0和stringData1使用==是相等的,而使用new运算符则会在堆中创建分配内存用于存储该字符串的值并将该地址赋给该变量,每次使用new关键字均执行该操作,所以stringData0和stringObject0和stringObject1均是不同的。
String
stringData0
=
"a string";
String
stringData1
= String.valueOf(
"a string");
String
stringObject0
=
new
String("a string");
String
stringObject1
=
new
String("a string");
System.
out.println("stringData0==stringData1
: " + (stringData0==stringData1
));
System.
out.println("stringData0==stringObject0
: " + (stringData0==stringObject0
));
System.
out.println(
"stringObject0==stringObject1 : "
+ (stringData0==stringObject0
));
System.
out.println("stringData0.equals(stringData1)
: " + (stringData0.equals(stringData1
)));
System.
out.println("stringData0.equals(stringObject0)
: " + (stringData0.equals(stringObject0
)));
System.
out.println("stringObject0.equals(stringObject1)
: " + (stringObject0.equals(stringObject1
)));
[align=left]输出是:[/align]
[align=left] stringData0==stringData1 : true[/align]
[align=left] stringData0==stringObject0 : false[/align]
[align=left] stringObject0==stringObject1 : false[/align]
[align=left] stringData0.equals(stringData1) : true[/align]
[align=left] stringData0.equals(stringObject0) : true[/align]
[align=left] stringObject0.equals(stringObject1) : true[/align]
[align=left]2、int类型变量的==和equals[/align]
Java为每一个基础数据类型都提供了相应的包装类,将一个基本数据类型赋给其包装类相当于执行了public
static
Integer
valueOf(int
i)(以Integer为例),该方法的源码如下(JDK
8):
public
static
Integer valueOf(int
i) {
if
(i
>= IntegerCache.low
&&
i
<= IntegerCache.
high)
return
IntegerCache.cache[i
+ (-IntegerCache.
low)];
return
new
Integer(i);
[align=left]}[/align]
其中static
final
int
low
= -128; static
final
int
high = 127;
[align=left] 可以看到当传入的值大于-128小于127则将返回整型缓冲池的该变量的地址否则new一个对象,既然是缓冲池那么其机制和字符串缓冲池是一样的,先去查看缓冲池中是否有该值,如果有则返回该值的地址否则在缓冲池中创建一个新的变量并将该变量的内存地址返回。因此对于20和200会出现不同的结果。[/align]
Integer
intObject0
= 20;
Integer
intObject1
= Integer.valueOf(20);
Integer
intObject2
=
new
Integer(20);
System.
out.println("intObject0==intObject1
: " + (intObject0==intObject1
));
System.
out.println("intObject1==intObject2
: " + (intObject1==intObject2
));
System.
out.println("intObject0.equals(intObject1)
: " + (intObject0.equals(intObject1
)));
System.
out.println("intObject1.equals(intObject2)
: " + (intObject1.equals(intObject2
)));
[align=left] [/align]
Integer
intObject3
= 200;
Integer
intObject4
= Integer.valueOf(200);
Integer
intObject5
=
new
Integer(200);
System.
out.println("intObject3==intObject4
: " + (intObject3==intObject4
));
System.
out.println("intObject4==intObject5
: " + (intObject4==intObject5
));
System.
out.println("intObject3.equals(intObject4)
: " + (intObject3.equals(intObject4
)));
System.
out.println("intObject4.equals(intObject5)
: " + (intObject4.equals(intObject5
)));
[align=left]
[/align]
[align=left]输出:[/align]
[align=left] intObject0==intObject1 : true[/align]
[align=left] intObject1==intObject2 : false[/align]
[align=left] intObject0.equals(intObject1) : true[/align]
[align=left] intObject1.equals(intObject2) : true[/align]
[align=left] intObject3==intObject4 : false[/align]
[align=left] intObject4==intObject5 : false[/align]
[align=left] intObject3.equals(intObject4) : true[/align]
[align=left] intObject4.equals(intObject5) : true[/align]
[align=left]
[/align]
[align=left]3、Object的equals与其他类的object[/align]
[align=left]默认的Object提供的equals方法仍然是比较两个对象的地址,而其他类的equals均重写了该equals方法,使用equals比较两个对象的值是否相等。源码如下:[/align]
[align=left]object的equals方法[/align]
public
boolean
equals(Object
obj) {
if
(obj
instanceof
Integer) {
return
value
== ((Integer)obj).intValue();
[align=left] }[/align]
return
false
;
[align=left]}[/align]
[align=left]String的equals方法[/align]
public
boolean
equals(Object
anObject) {
if
(this
==
anObject) {
return
true
;
[align=left] }[/align]
if
(anObject
instanceof
String) {
String
anotherString
= (String)
anObject
;
int
n
=
value.length;
if
(n
==
anotherString.
value.length
) {
char
v1
[] =
value;
char
v2
[] =
anotherString.
value;
int
i
= 0;
while
(n
-- != 0) {
if
(v1
[i
] !=
v2[i])
return
false
;
i++;
[align=left] }[/align]
return
true
;
[align=left] }[/align]
[align=left] }[/align]
return
false
;
[align=left]}[/align]
[align=left]Integer的equals方法[/align]
public
boolean
equals(Object
obj) {
if
(obj
instanceof
Integer) {
return
value
== ((Integer)obj).intValue();
[align=left] }[/align]
return
false
;
[align=left]}[/align]
[align=left]附:可见其他类的object均重写了equals方法,是的equals比较的是对象是否相等而不是存放对象的地址[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]最后附上该程序的源码如下:[/align]
package
javabase;
[align=left]
[/align]
public
class
TestEquals {
[align=left]
[/align]
public
static
void
main(String[]
args) {
String
stringData0
=
"a string"
;
String
stringData1
= String.valueOf(
"a string");
String
stringObject0
=
new
String("a string");
String
stringObject1
=
new
String("a string");
System.
out.println("stringData0==stringData1
: " + (stringData0==stringData1
));
System.
out.println("stringData0==stringObject0
: " + (stringData0==stringObject0
));
System.
out.println("stringObject0==stringObject1
: " + (stringData0==stringObject0
));
System.
out.println("stringData0.equals(stringData1)
: " + (stringData0.equals(stringData1
)));
System.
out.println("stringData0.equals(stringObject0)
: " + (stringData0.equals(stringObject0
)));
System.
out.println("stringObject0.equals(stringObject1)
: " + (stringObject0.equals(stringObject1
)));
[align=left] [/align]
Integer
intObject0
= 20;
Integer
intObject1
= Integer.valueOf(20);
Integer
intObject2
=
new
Integer(20);
System.
out.println("intObject0==intObject1
: " + (intObject0==intObject1
));
System.
out.println("intObject1==intObject2
: " + (intObject1==intObject2
));
System.
out.println("intObject0.equals(intObject1)
: " + (intObject0.equals(intObject1
)));
System.
out.println("intObject1.equals(intObject2)
: " + (intObject1.equals(intObject2
)));
[align=left] [/align]
Integer
intObject3
= 200;
Integer
intObject4
= Integer.valueOf(200);
Integer
intObject5
=
new
Integer(200);
System.
out.println("intObject3==intObject4
: " + (intObject3==intObject4
));
System.
out.println("intObject4==intObject5
: " + (intObject4==intObject5
));
System.
out.println("intObject3.equals(intObject4)
: " + (intObject3.equals(intObject4
)));
System.
out.println("intObject4.equals(intObject5)
: " + (intObject4.equals(intObject5
)));
[align=left] }[/align]
[align=left]}[/align]
==运算符比较的是栈中存放的值是否相等,而equals比较的是堆中存放的值是否相等。
2、String类型变量的==和equals
字符串常量均存储在字符串缓冲池中,当将一个字符串常量赋给一个变量时,首先会在字符串缓冲池中寻找是否有该字符串,如果有则将该字符串的地址赋给字符串常量,因此对于stringData0和stringData1使用==是相等的,而使用new运算符则会在堆中创建分配内存用于存储该字符串的值并将该地址赋给该变量,每次使用new关键字均执行该操作,所以stringData0和stringObject0和stringObject1均是不同的。
String
stringData0
=
"a string";
String
stringData1
= String.valueOf(
"a string");
String
stringObject0
=
new
String("a string");
String
stringObject1
=
new
String("a string");
System.
out.println("stringData0==stringData1
: " + (stringData0==stringData1
));
System.
out.println("stringData0==stringObject0
: " + (stringData0==stringObject0
));
System.
out.println(
"stringObject0==stringObject1 : "
+ (stringData0==stringObject0
));
System.
out.println("stringData0.equals(stringData1)
: " + (stringData0.equals(stringData1
)));
System.
out.println("stringData0.equals(stringObject0)
: " + (stringData0.equals(stringObject0
)));
System.
out.println("stringObject0.equals(stringObject1)
: " + (stringObject0.equals(stringObject1
)));
[align=left]输出是:[/align]
[align=left] stringData0==stringData1 : true[/align]
[align=left] stringData0==stringObject0 : false[/align]
[align=left] stringObject0==stringObject1 : false[/align]
[align=left] stringData0.equals(stringData1) : true[/align]
[align=left] stringData0.equals(stringObject0) : true[/align]
[align=left] stringObject0.equals(stringObject1) : true[/align]
[align=left]2、int类型变量的==和equals[/align]
Java为每一个基础数据类型都提供了相应的包装类,将一个基本数据类型赋给其包装类相当于执行了public
static
Integer
valueOf(int
i)(以Integer为例),该方法的源码如下(JDK
8):
public
static
Integer valueOf(int
i) {
if
(i
>= IntegerCache.low
&&
i
<= IntegerCache.
high)
return
IntegerCache.cache[i
+ (-IntegerCache.
low)];
return
new
Integer(i);
[align=left]}[/align]
其中static
final
int
low
= -128; static
final
int
high = 127;
[align=left] 可以看到当传入的值大于-128小于127则将返回整型缓冲池的该变量的地址否则new一个对象,既然是缓冲池那么其机制和字符串缓冲池是一样的,先去查看缓冲池中是否有该值,如果有则返回该值的地址否则在缓冲池中创建一个新的变量并将该变量的内存地址返回。因此对于20和200会出现不同的结果。[/align]
Integer
intObject0
= 20;
Integer
intObject1
= Integer.valueOf(20);
Integer
intObject2
=
new
Integer(20);
System.
out.println("intObject0==intObject1
: " + (intObject0==intObject1
));
System.
out.println("intObject1==intObject2
: " + (intObject1==intObject2
));
System.
out.println("intObject0.equals(intObject1)
: " + (intObject0.equals(intObject1
)));
System.
out.println("intObject1.equals(intObject2)
: " + (intObject1.equals(intObject2
)));
[align=left] [/align]
Integer
intObject3
= 200;
Integer
intObject4
= Integer.valueOf(200);
Integer
intObject5
=
new
Integer(200);
System.
out.println("intObject3==intObject4
: " + (intObject3==intObject4
));
System.
out.println("intObject4==intObject5
: " + (intObject4==intObject5
));
System.
out.println("intObject3.equals(intObject4)
: " + (intObject3.equals(intObject4
)));
System.
out.println("intObject4.equals(intObject5)
: " + (intObject4.equals(intObject5
)));
[align=left]
[/align]
[align=left]输出:[/align]
[align=left] intObject0==intObject1 : true[/align]
[align=left] intObject1==intObject2 : false[/align]
[align=left] intObject0.equals(intObject1) : true[/align]
[align=left] intObject1.equals(intObject2) : true[/align]
[align=left] intObject3==intObject4 : false[/align]
[align=left] intObject4==intObject5 : false[/align]
[align=left] intObject3.equals(intObject4) : true[/align]
[align=left] intObject4.equals(intObject5) : true[/align]
[align=left]
[/align]
[align=left]3、Object的equals与其他类的object[/align]
[align=left]默认的Object提供的equals方法仍然是比较两个对象的地址,而其他类的equals均重写了该equals方法,使用equals比较两个对象的值是否相等。源码如下:[/align]
[align=left]object的equals方法[/align]
public
boolean
equals(Object
obj) {
if
(obj
instanceof
Integer) {
return
value
== ((Integer)obj).intValue();
[align=left] }[/align]
return
false
;
[align=left]}[/align]
[align=left]String的equals方法[/align]
public
boolean
equals(Object
anObject) {
if
(this
==
anObject) {
return
true
;
[align=left] }[/align]
if
(anObject
instanceof
String) {
String
anotherString
= (String)
anObject
;
int
n
=
value.length;
if
(n
==
anotherString.
value.length
) {
char
v1
[] =
value;
char
v2
[] =
anotherString.
value;
int
i
= 0;
while
(n
-- != 0) {
if
(v1
[i
] !=
v2[i])
return
false
;
i++;
[align=left] }[/align]
return
true
;
[align=left] }[/align]
[align=left] }[/align]
return
false
;
[align=left]}[/align]
[align=left]Integer的equals方法[/align]
public
boolean
equals(Object
obj) {
if
(obj
instanceof
Integer) {
return
value
== ((Integer)obj).intValue();
[align=left] }[/align]
return
false
;
[align=left]}[/align]
[align=left]附:可见其他类的object均重写了equals方法,是的equals比较的是对象是否相等而不是存放对象的地址[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]最后附上该程序的源码如下:[/align]
package
javabase;
[align=left]
[/align]
public
class
TestEquals {
[align=left]
[/align]
public
static
void
main(String[]
args) {
String
stringData0
=
"a string"
;
String
stringData1
= String.valueOf(
"a string");
String
stringObject0
=
new
String("a string");
String
stringObject1
=
new
String("a string");
System.
out.println("stringData0==stringData1
: " + (stringData0==stringData1
));
System.
out.println("stringData0==stringObject0
: " + (stringData0==stringObject0
));
System.
out.println("stringObject0==stringObject1
: " + (stringData0==stringObject0
));
System.
out.println("stringData0.equals(stringData1)
: " + (stringData0.equals(stringData1
)));
System.
out.println("stringData0.equals(stringObject0)
: " + (stringData0.equals(stringObject0
)));
System.
out.println("stringObject0.equals(stringObject1)
: " + (stringObject0.equals(stringObject1
)));
[align=left] [/align]
Integer
intObject0
= 20;
Integer
intObject1
= Integer.valueOf(20);
Integer
intObject2
=
new
Integer(20);
System.
out.println("intObject0==intObject1
: " + (intObject0==intObject1
));
System.
out.println("intObject1==intObject2
: " + (intObject1==intObject2
));
System.
out.println("intObject0.equals(intObject1)
: " + (intObject0.equals(intObject1
)));
System.
out.println("intObject1.equals(intObject2)
: " + (intObject1.equals(intObject2
)));
[align=left] [/align]
Integer
intObject3
= 200;
Integer
intObject4
= Integer.valueOf(200);
Integer
intObject5
=
new
Integer(200);
System.
out.println("intObject3==intObject4
: " + (intObject3==intObject4
));
System.
out.println("intObject4==intObject5
: " + (intObject4==intObject5
));
System.
out.println("intObject3.equals(intObject4)
: " + (intObject3.equals(intObject4
)));
System.
out.println("intObject4.equals(intObject5)
: " + (intObject4.equals(intObject5
)));
[align=left] }[/align]
[align=left]}[/align]
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树