java中相等和同一的区别
一、相等和同一的概念
——两个对象具有相同的类型,及相同的属性值,则称二者相等(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中相等和同一的区别相关推荐
- java中的异常种类和区别以及处理机制和区别
java中的异常种类和区别以及处理机制和区别 按照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫 CheckedException 和运行时异常(也叫非强制性异常)也叫 RuntimeExce ...
- java中ArrayList和LinkedList的区别
首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...
- java中Runnable和Callable的区别
文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...
- java中wait和sleep的区别
文章目录 Wait和sleep的区别 唤醒wait和sleep java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用 ...
- java throw与throws_基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- Java中重载和复写的区别
Java中重载和复写的区别 重载(overload) 复写(override) 区别和联系 重载(overload) 函数重载的最突出的例子就是类的构造函数,用户定义一个对象时可能会提供多种参数组合: ...
- Java中equals()方法和==的区别分析
Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...
- java is instance of_详谈Java中instanceof和isInstance的区别
一次性搞定instanceof和isInstance,instanceof和isInstance长的非常像,用法也很类似,先看看这两个的用法: obj.instanceof(class) 也就是说这个 ...
- throws java_基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
最新文章
- BP神经网络公式推导及实现(MNIST)
- GPSInfoProvider定位
- 数据中心的敏捷运维之路
- ExtJs UI框架学习三
- linux smb 所有者,python-3.x - 在Linux上使用python从smb共享中获取文件的所有者。 - SO中文参考 - www.soinside.com...
- 大唐豪侠服务器列表文件格式错误,[动态] 大唐豪侠1.2.4版本更新公告-大唐豪侠-东北游戏网...
- JAVA使用递归遍历文件夹,包括子目录
- scala.Enumeration 枚举示例
- VMware SDS 之一:什么是VSAN??
- [luogu2414 NOI2011]阿狸的打字机 (AC自动机)
- 记录一枚验证URL的js正则表达式
- 创建JSON集合使用JSONArray.fromObject 转化后得到的jsonArray集为空?
- 计算机科学检索课题,文献检索报告课题.docx
- FDDB--无约束人脸检测数据集
- word 制作流程图
- Exp9 Web安全实践基础 20154328 常城
- nvcc fatal : Unsupported gpu architecture ‘compute_30‘
- BZOJ3034: Heaven Cow与God Bull
- 【计算机视觉】张正友棋盘格标定法
- clickhouse中bitmap在用户标签,访客去重生产中使用及clickhouse建表null值数据类型处理