equals和==的区别
来源:互联网 发布:厂区网络监控设计方案 编辑:程序博客网 时间:2024/06/03 21:23
- 博客分类:
- Java学习笔记
这两天一直在看数据结构和算法,看到一些内容就想起了龙哥曾经讲过的“equals”和“==”的区别,于是重新回顾梳理了一遍,更加深了印象。现在做一下比较:
要辨别“equals”和“==”,首先必须明白两个概念“值传递”和“引用传递”。
简单来说,“值传递”就是当你创建一个对象的时候(注意啊:int一个整型也是创建对象),JVM在内存中给你的这个对象开辟了一块地址;“引用传递”就是不重新分配内存资源,只是把你新声明(注意是声明啊,并没有实例化一个对象)的对象指向了一个已经在内存中有的对象,即两个对象名同指一处地址,当然我更改这个对象的值后,两个对象名所指向的这个对象的值都变了。
(ps:这个地方被大神指出有误,部分地方博主进行了更改,划掉的区域是被指出有误的地方,为避免难以看懂评论,特作此处理。博主另写了一篇博文对内存分配中的"栈"与"堆"进行了分析)
这里还要强调一下“new”,这是实例化对象的标识,也就是在内存中重新分配空间的标识。(关键字new为每个对象申请内存空间,除基本类型,且所有的对象都在堆heap中分配空间)我们通常用的时候,例如比较字符串,“equals”比较的是这两个字符串的值是不是一样,而“==”则比较的是这两个字符串的引用地址是否一样。例如下面的代码示例:
- /**
- * 字符串中“equals”和“==”对比示例
- * @author 赵广超
- */
- public class equalsTest {
- public static void main(String[] args) {
- String aaa =new String("abc");
- String bbb =new String("abc");
- String ccc ="abc";
- String ddd=aaa;
- if(aaa == bbb){
- System.out.println("aaa == bbb");
- }else{
- System.out.println("aaa != bbb");
- }
- if(aaa.equals(bbb)){
- System.out.println("aaa equals bbb ");
- }else{
- System.out.println("aaa not equals bbb ");
- }
- if(aaa == ccc){
- System.out.println("aaa == ccc");
- }else{
- System.out.println("aaa != ccc");
- }
- if(aaa.equals(ccc)){
- System.out.println("aaa equals ccc ");
- }else{
- System.out.println("aaa not equals ccc ");
- }
- if(bbb == ccc){
- System.out.println("bbb == ccc");
- }else{
- System.out.println("bbb != ccc");
- }
- if(bbb.equals(ccc)){
- System.out.println("bbb equals ccc ");
- }else{
- System.out.println("bbb not equals ccc ");
- }
- if(aaa == ddd){
- System.out.println("aaa == ddd");
- }else{
- System.out.println("aaa != ddd");
- }
- if(aaa.equals(ddd)){
- System.out.println("aaa equals ddd ");
- }else{
- System.out.println("aaa not equals ddd ");
- }
- if(bbb == ddd){
- System.out.println("bbb == ddd");
- }else{
- System.out.println("bbb != ddd");
- }
- if(bbb.equals(ddd)){
- System.out.println("bbb equals ddd ");
- }else{
- System.out.println("bbb not equals ddd ");
- }
- if(ccc == ddd){
- System.out.println("ccc == ddd");
- }else{
- System.out.println("ccc != ddd");
- }
- if(ccc.equals(ddd)){
- System.out.println("ccc equals ddd ");
- }else{
- System.out.println("ccc not equals ddd ");
- }
- }
- }
/** * 字符串中“equals”和“==”对比示例 * @author 赵广超 */public class equalsTest {public static void main(String[] args) {String aaa =new String("abc");String bbb =new String("abc");String ccc ="abc";String ddd=aaa;if(aaa == bbb){System.out.println("aaa == bbb");}else{System.out.println("aaa != bbb");}if(aaa.equals(bbb)){System.out.println("aaa equals bbb ");}else{System.out.println("aaa not equals bbb ");}if(aaa == ccc){System.out.println("aaa == ccc");}else{System.out.println("aaa != ccc");}if(aaa.equals(ccc)){System.out.println("aaa equals ccc ");}else{System.out.println("aaa not equals ccc ");}if(bbb == ccc){System.out.println("bbb == ccc");}else{System.out.println("bbb != ccc");}if(bbb.equals(ccc)){System.out.println("bbb equals ccc ");}else{System.out.println("bbb not equals ccc ");}if(aaa == ddd){System.out.println("aaa == ddd");}else{System.out.println("aaa != ddd");}if(aaa.equals(ddd)){System.out.println("aaa equals ddd ");}else{System.out.println("aaa not equals ddd ");}if(bbb == ddd){System.out.println("bbb == ddd");}else{System.out.println("bbb != ddd");}if(bbb.equals(ddd)){System.out.println("bbb equals ddd ");}else{System.out.println("bbb not equals ddd ");}if(ccc == ddd){System.out.println("ccc == ddd");}else{System.out.println("ccc != ddd");}if(ccc.equals(ddd)){System.out.println("ccc equals ddd ");}else{System.out.println("ccc not equals ddd ");}}}
结果如下:
aaa != bbb
aaa equals bbb
aaa != ccc
aaa equals ccc
bbb != ccc
bbb equals ccc
aaa == ddd
aaa equals ddd
bbb != ddd
bbb equals ddd
ccc != ddd
ccc equals ddd
对上面的结果我们可以做如下解释:
String aaa =new String("abc");
String bbb =new String("abc");
String ccc ="abc";
String ddd=aaa;
左边的代码在内存中分配的结果如右边所示:故有控制台的打印信息 即“equals“比较的是两个值是不是一样,而”==“比较的是内存地址是不是相同。
可是,实际的并不总是这样的。String类中的Equals这个方法重写了超类Object(Object类被所有的其他类继承)中的equals方法。而Object超类中有如下代码:
- public boolean equals(Object obj) {
- return (this == obj);
- }
public boolean equals(Object obj) {return (this == obj); }
就是说,超类中的equals和==是一码子事,比较的都是内存地址。
在String类中,重写的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;
- }
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; }
可见,在不同的类中,引用equals方法时,可能会有不一样的效果。这就提醒我们在编写自己的类时,如果要比较的话,要注意重写Object类中的equals方法。
- “=”和“equals()”的区别
- java ==和equals、equals和hashCode的区别
- 关于“==”和“equals”的区别
- 关于Equals 和== 的区别
- equals和==的区别
- equals 和 == 的区别
- equals 和 == 的区别
- ==和Equals的区别
- equals 和 == 的区别
- equals 和 == 的区别
- equals和==的区别
- equals 和 == 的区别
- equals和==的区别
- 关于==和equals的区别
- Equals和“==”的区别
- == 和equals() 的区别
- equals("")和“==”的区别
- equals 和 == 的区别
- 字符集的更改(转eygle文章)全
- 怎么导出在网页上透明背景的swf
- Oracle启动报错(ORA-01990,ORA-27037)处理方法
- iPhone 越狱仍是合法的,但是⋯⋯
- 张老师高新技术技术学习日志---Part4
- equals和==的区别
- Android webview背景设置为透明无效
- 在UNIX、windows下让ORACLE定时执行*.sql文件
- 节假日推算的js处理方法
- 最大熵工具包的使用
- ORA-16038的解决(日志无法归档)
- 使用Shell脚本实现ftp的自动上传下载
- Looper中的睡眠等待与唤醒机制
- 7种形式的Android Dialog使用举例