|
20 | 20 | **equals与==的区别。**
|
21 | 21 |
|
22 | 22 | [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 | + 进行以上分析之后,就不难理解第一段代码中的实例程序输出了。 |
23 | 89 |
|
24 |
| -主要区别在于前者是方法后者是操作符。“==”的行为对于每个对象来说与equals()是完全相同的,但是equals()可以基于业务规则的不同而重写(overridden )。“==”习惯用于原生(primitive)类型之间的比较,而equals()仅用于对象之间的比较。 |
25 | 90 |
|
26 |
| -==与equals的主要区别是:==常用于比较原生类型,而equals()方法用于检查对象的相等性。另一个不同的点是:如果==和equals()用于比较对象,当两个引用地址相同,==返回true。而equals()可以返回true或者false主要取决于重写实现。最常见的一个例子,字符串的比较,不同情况==和equals()返回不同的结果。 |
27 | 91 |
|
28 | 92 | ---
|
29 | 93 |
|
|
0 commit comments