Skip to content

Commit 4ad6ffd

Browse files
committed
更新了==与equals的区别
1 parent ac0094a commit 4ad6ffd

File tree

1 file changed

+66
-2
lines changed

1 file changed

+66
-2
lines changed

Part2/JavaSE/Java基础知识.md

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,74 @@
2020
**equals与==的区别。**
2121

2222
[http://www.importnew.com/6804.html](http://www.importnew.com/6804.html)
23+
> ==与equals的主要区别是:==常用于比较原生类型,而equals()方法用于检查对象的相等性。另一个不同的点是:如果==和equals()用于比较对象,当两个引用地址相同,==返回true。而equals()可以返回true或者false主要取决于重写实现。最常见的一个例子,字符串的比较,不同情况==和equals()返回不同的结果。
24+
25+
1. 使用==比较有两种情况:
26+
27+
比较基础数据类型(Java中基础数据类型包括八中:short,int,long,float,double,char,byte,boolen):这种情况下,==比较的是他们的值是否相等。
28+
引用间的比较:在这种情况下,==比较的是他们在内存中的地址,也就是说,除非引用指向的是同一个new出来的对象,此时他们使用`==`去比较得到true,否则,得到false。
29+
2. 使用equals进行比较:
30+
31+
equals追根溯源,是Object类中的一个方法,在该类中,equals的实现也仅仅只是比较两个对象的内存地址是否相等,但在一些子类中,如:String、Integer 等,该方法将被重写。
32+
33+
3.`String`类为例子说明`eqauls``==`的区别:
34+
> 在开始这个例子之前,同学们需要知道JVM处理String的一些特性。*Java的虚拟机在内存中开辟出一块单独的区域,用来存储字符串对象,这块内存区域被称为字符串缓冲池。*当使用
35+
`String a = "abc"`这样的语句进行定义一个引用的时候,首先会在*字符串缓冲池*中查找是否已经相同的对象,如果存在,那么就直接将这个对象的引用返回给a,如果不存在,则需要新建一个值为"abc"的对象,再将新的引用返回a。`String a = new String("abc");`这样的语句明确告诉JVM想要产生一个新的String对象,并且值为"abc",于是就*在堆内存中的某一个小角落开辟了一个新的String对象*
36+
37+
- `==`在比较引用的情况下,会去比较两个引用的内存地址是否相等。
38+
```
39+
String str1 = "abc";
40+
String str2 = "abc";
41+
42+
System.out.println(str1 == str2);
43+
System.out.println(str1.equals(str2));
44+
45+
String str2 = new String("abc");
46+
System.out.println(str1 == str2);
47+
System.out.println(str1.equals(str2));
48+
49+
```
50+
以上代码将会输出
51+
true
52+
true
53+
false
54+
true
55+
**第一个true:**因为在str2赋值之前,str1的赋值操作就已经在内存中创建了一个值为"abc"的对象了,然后str2将会与str1指向相同的地址。
56+
**第二个true:**因为`String`已经重写了`equals`方法:为了方便大家阅读我贴出来,并且在注释用进行分析:
57+
```
58+
public boolean equals(Object anObject) {
59+
//如果比较的对象与自身内存地址相等的话
60+
//就说明他两指向的是同一个对象
61+
//所以此时equals的返回值跟==的结果是一样的。
62+
if (this == anObject) {
63+
return true;
64+
}
65+
//当比较的对象与自身的内存地址不相等,并且
66+
//比较的对象是String类型的时候
67+
//将会执行这个分支
68+
if (anObject instanceof String) {
69+
String anotherString = (String)anObject;
70+
int n = value.length;
71+
if (n == anotherString.value.length) {
72+
char v1[] = value;
73+
char v2[] = anotherString.value;
74+
int i = 0;
75+
//在这里循环遍历两个String中的char
76+
while (n-- != 0) {
77+
//只要有一个不相等,那么就会返回false
78+
if (v1[i] != v2[i])
79+
return false;
80+
i++;
81+
}
82+
return true;
83+
}
84+
}
85+
return false;
86+
}
87+
```
88+
进行以上分析之后,就不难理解第一段代码中的实例程序输出了。
2389

24-
主要区别在于前者是方法后者是操作符。“==”的行为对于每个对象来说与equals()是完全相同的,但是equals()可以基于业务规则的不同而重写(overridden )。“==”习惯用于原生(primitive)类型之间的比较,而equals()仅用于对象之间的比较。
2590

26-
==与equals的主要区别是:==常用于比较原生类型,而equals()方法用于检查对象的相等性。另一个不同的点是:如果==和equals()用于比较对象,当两个引用地址相同,==返回true。而equals()可以返回true或者false主要取决于重写实现。最常见的一个例子,字符串的比较,不同情况==和equals()返回不同的结果。
2791

2892
---
2993

0 commit comments

Comments
 (0)