简介: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.
分享到:
相关推荐
java中equals和==的区别.doc java中equals和==的区别.doc
能够加强对java中equals与==区别的理解。
Java 中equals和==的区别
通过例子详细解释java中equals和==区别。实例丰富,适合初学者,便于理解,
java中equals和==的区别.pdf
java中equals和==的比较.pdf
java中equals和==的区别.docx
java中equals和==的区别文.pdf
java中equals和==的比较文.pdf
java中equals和==的区别的剖析.pdf
java中equals和==的区别-5页.pdf