一、相等和同一的概念

——两个对象具有相同的类型,及相同的属性值,则称二者相等(equal)
——如果两个引用变量指向的是同一个对象,则称这两个变量(对象)同一(identical)
——两个对象同一,则肯定相等
——两个对象相等,不一定同一
——比较运算符“==” 判断的是这两个对象是否同一

二、判断两个对象是否同一

判断两个对象是否同一

public class Exam4_7{public static void main(String args[]){ClassName a = new ClassName(); ClassName b = new ClassName(); if (a == b) System.out.println("YES"); else System.out.println("NO");}
}

说明:
ClassName类名,此程序运行的结果为“NO”,原因是使用等号“==”判断的是两个对象是否同一,显然a和b是两个对象。

public class Exam4_7{public static void main(String args[]){ClassName a = new ClassName(); ClassName b = a; if (a == b) System.out.println("YES"); else System.out.println("NO");}
}

说明:
将a所指对象的引用赋给b,因此a与b指向的是同一个对象,a与b同一。输出结果为“YES”

三、判断两个对象是否相等

首先,了解equals()
——equals()是Object类的方法,由于Object是类层次结构中的树根节点,因此所有其他类都继承了equals()方法
——Object类中的 equals() 方法的定义如下,可见,也是判断两个对象是否同一

public boolean equals(Object x) { return this == x; //this代指对象本身
}

说明:
可以看出,只是继承Object类的equals()也是无法判断两个对象是否相等的,若要完成判断,需要重写equals()
其次,重写equals()
——要判断两个对象各个属性域的值是否相同,则不能使用从Object类继承来的equals方法,而需要在类声明中对equals方法进行重写
——String类中已经重写了Object类的Equals方法,可以判别两个字符串是否内容相同
看一下String类是如何重写equals()的,java.lang.String类的equals源码如下。

public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String) anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;
}

说明:重写逻辑是判断两个字符串使用 == 相等 或者 两个字符串的所有组成字符都相等返回true,其他情况返回false。

自己重写equals()

public class Apple { private String color; private boolean ripe;  public Apple(String aColor, boolean isRipe) { color = aColor; ripe = isRipe; }      public void setColor(String aColor) { color = aColor;  }      public void setRipe(boolean isRipe) { ripe = isRipe; }     public String getColor() { return color; }     public boolean getRipe() { return ripe; }//重写toString(),不了解toString()的可以看我之前写的介绍toString()的博客public String toString() { if (ripe)  return("A ripe " + color + " apple"); else  return("A not so ripe " + color + " apple"); } //重写equals(),Apple对象的两个属性值相等时返回true,否则返回false;public boolean equals(Object obj) { yif (obj instanceof Apple) { Apple a = (Apple) obj; return (color.equals(a.getColor()) && (ripe == a.getRipe())); } return false; }
}
public class AppleTester { public static void main(String args[]) { Apple a = new Apple("red", true); Apple b = new Apple("red", true); System.out.println(a + " is equal to " + b + ": " + a.equals(b)); System.out.println("a is identical to b: " + (a == b));Apple c = a; System.out.println(a + " is equal to " + c + ": " + a.equals(c)); System.out.println("a is identical to c: " + (a == c)); }
}

运行结果
A ripe red apple is equal to A ripe red apple: true
a is identical to b: false
A ripe red apple is equal to A ripe red apple: true
a is identical to c: true

总结:
相等:数据类型+属性值
同一:同一个对像,引用指向的堆地址
“==”:基本数据类型判断属性值,引用判断是否“同一”
equals():Object中与 ==没区别,可以重写,String类就重写了该方法,判断字符串内容是否相同。

java中相等和同一的区别相关推荐

  1. java中的异常种类和区别以及处理机制和区别

    java中的异常种类和区别以及处理机制和区别 按照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫 CheckedException 和运行时异常(也叫非强制性异常)也叫 RuntimeExce ...

  2. java中ArrayList和LinkedList的区别

    首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...

  3. java中Runnable和Callable的区别

    文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...

  4. java中wait和sleep的区别

    文章目录 Wait和sleep的区别 唤醒wait和sleep java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用 ...

  5. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  6. Java中重载和复写的区别

    Java中重载和复写的区别 重载(overload) 复写(override) 区别和联系 重载(overload) 函数重载的最突出的例子就是类的构造函数,用户定义一个对象时可能会提供多种参数组合: ...

  7. Java中equals()方法和==的区别分析

    Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...

  8. java is instance of_详谈Java中instanceof和isInstance的区别

    一次性搞定instanceof和isInstance,instanceof和isInstance长的非常像,用法也很类似,先看看这两个的用法: obj.instanceof(class) 也就是说这个 ...

  9. throws java_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

最新文章

  1. BP神经网络公式推导及实现(MNIST)
  2. GPSInfoProvider定位
  3. 数据中心的敏捷运维之路
  4. ExtJs UI框架学习三
  5. linux smb 所有者,python-3.x - 在Linux上使用python从smb共享中获取文件的所有者。 - SO中文参考 - www.soinside.com...
  6. 大唐豪侠服务器列表文件格式错误,[动态] 大唐豪侠1.2.4版本更新公告-大唐豪侠-东北游戏网...
  7. JAVA使用递归遍历文件夹,包括子目录
  8. scala.Enumeration 枚举示例
  9. VMware SDS 之一:什么是VSAN??
  10. [luogu2414 NOI2011]阿狸的打字机 (AC自动机)
  11. 记录一枚验证URL的js正则表达式
  12. 创建JSON集合使用JSONArray.fromObject 转化后得到的jsonArray集为空?
  13. 计算机科学检索课题,文献检索报告课题.docx
  14. FDDB--无约束人脸检测数据集
  15. word 制作流程图
  16. Exp9 Web安全实践基础 20154328 常城
  17. nvcc fatal : Unsupported gpu architecture ‘compute_30‘
  18. BZOJ3034: Heaven Cow与God Bull
  19. 【计算机视觉】张正友棋盘格标定法
  20. clickhouse中bitmap在用户标签,访客去重生产中使用及clickhouse建表null值数据类型处理

热门文章

  1. B站自动搜索关键词,并自动评论+点赞+收藏
  2. 聚焦Open Infrastructure丹佛峰会,九州云分享边缘计算新技术
  3. ACM在线模板(收藏贴)
  4. Potato靶机测试
  5. HTML学习笔记8:表单
  6. UDS入门至精通系列:Service 22
  7. win7 去除 小红伞 通知广告
  8. 量化策略系列——【海龟法则】理解与实现(一)
  9. Foxit Reader(福昕阅读器)(CVE-2020-14425)命令注入漏洞复现
  10. 外卖怪整理了一些很撩人的短句子