Java中关于==和equal的区别 以及equals方法重写
1.==是判断两个变量或实例是不是指向同一个内存空间
equals是判断两个变量或实例所指向的内存空间的值是不是相同
2.==是指对内存地址进行比较
equals()是对字符串的内容进行比较
3.==指引用是否相同
equals()指的是值是否相同
重写equals:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
这要和String的JVM内部工作原理相结合!
比如:String?s1="accp"
Java内部将此语句转化为以下几个步骤:
(1)先定义一个名为s1的对String类的对象引用变量放到栈中:String?s1; (2)在常量池(字符串常量池)中查找有没有存放值为"accp"的地址,如果没有,则开辟一块存放字面值为"accp",并将这一块内存的指向地址放到栈中s1的变量中。如果已经有了值为"accp"的地址,则直接返回这个地址给栈中s1变量。所以如果常量池中已经有的值,直接返回地址就好。 String?s1?=?"accp"; 其字符串值是保存了一个指向常量池中值的引用!所以s1?和s2的引用地址是相同的,所s1==s2为true
------------------------------------------------------------------------------
而Strings3=newString(s1);
(1)先定义一个名为s3的对String类的对象引用变量放到栈中:String?s3;(2)在堆中创建一个String类型的对象,这个对象的值,也就是s1的字面值为“accp”。会按照上面的第2的操作到常量池中获取,并返回一个常量池的引用给堆中的这个对象。
(3) 将堆中创建对象的地址返回给栈中变量s3。
所以?Strings3=newString(s1); 是一个指向堆中对象的引用地址。那么 s1 == s3 为false
下面给一个图更好理解吧:
对象引用大概图示
==是比较对象的引用地址,如果要比较对象的值的话用equal吧!
----------扩展-------------------------------------------------------------------
String有一个方法intern(),返回的是这个String对象的常量池引用对象。
如果用?
String s4 = s3.intern();
String s5= new String(s1).intern();
则 s1 == s4 和 s1 == s5 都为true
--------备注------------------------------------------------------------------------
这个问题以前的答案由于本人的经验和能力的不足,导致回答有很多错误的地方,在此表示非常抱歉。
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!