`

深入了解JAVA中的equals 和 ==

    博客分类:
  • java
阅读更多
简介:equals和==都是Object的功能,equals和==都表示比较两个对象的引用是否相等,但是有些类

重写了equals方法,使得它比较两个对象的值是否相等,这些重写了equals方法的类有String,Date

和所有基本类型的封装类.下面以String类来介绍equals和==.
1.equals和== :  判断两个引用是否指向同一对象,即是否指向同一片内存区域.

2.equals和==的使用对象:
equals :  只能用于类类型.
==     :  既能用于类类型,又能用于基本类型.

3.要真正了解equals和==,需要了解内存的分配及堆栈(堆和栈的特征不在本文的讨论范围).
内存的分配:
(1) 当我们创建一个基本类型时,例如:int i=5;系统会在栈中查找是否存在5这个值存在,如果存

在,则把i指向5;如果不存在,
则系统会在栈中创建一个5,再将i指向它.
举例:
short s=8;
int i=8;
long l=7;

System.out.println( s==i ); // true
System.out.println( s==l ); // false
当执行short s=8;时,系统会先查找栈中是否已经存在8,如果存在就把s指向它;如果不存在就新创

建一个8,然后再用s指向
新创建的8; 当执行int  i=8;时,系统会做同样的事,所以s和i都是指向同一片内存的,而long 

l=7;则与s和i 指向的不同.
(2) 当我们创建一个类类型时,系统会在栈中创建一个引用,再在堆中分配适当的内存,然后再将该

引用指向这片分配的内存.如果设有初始值系统还会把初始值存入该内存中.类类型是通过new 关

键字来创建的,所以系统不会像基本类型一样先查找是否有该初始值,而是直接在堆中创建一个新

值.
举例:
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println( sb1==sb2 ); // false
System.out.println( sb1.equals(sb2) ); // false
由于StringBuffer没有重写Object类的equals()方法,所以==和equals()的行为都是一样的。

举例:
String s1=new String("abc");
String s2=new String("abc");
System.out.println( s1==s2 ); // false
System.out.println( s1.equals(s2) ); // true
当执行String s1=new String("abc");时,系统会在堆中新创建一个"abc",而当执行String

s2=new String("abc");时,系统会再次新创建一个"abc".因此s1和s2不是指向同一片内存,所以

s1==s2为false;因为String重写了Object的equals()方法,而s1和s2的值都为"abc",所以

s1.equals(s2)为true.

注意:String是一个特殊的类类型,让我们看下例.
举例:
String s1="abc";
String s2= "abc";
System.out.println( s1==s2 ); // true
System.out.println( s1.equals(s2) ); // true
这是因为当String类型没有用new 创建时, "abc"不是存放在堆里,而是存放在栈里. 没有用new

创建String类型对象和创建基本类型的原理是一样,当执行String s1= "abc";时,系统会先查找栈

中是否存在"abc",如果存在就将s1指向它,否则就新创建一个"abc",然后用s1指向它;创建String

s2= "abc";也是如此,所以s1和s2指向的是同一片内存区域.这也就是为什么s1==s2会是true.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics