java中的==和equals的区别
关于JAVA中的==和equals函数的区别
今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指正,谢谢。
在JAVA程序中一般的基本类型(值类型int,double,boolean等)都只能通过 = = 来判断值是否相等。
如:System.out.println(1==1);System.out.println(true==true);√
不能写成System.out.println(1.equals(1));×
System.out.println(true.equals(true));×
但是对于引用类型,==和equals就产生了比较大的区别:
1、无论是自定义的类型还是像JAVA本身封装好的类Integer、String等,在对他们的引用判等时,= = 都是判断他们的地址是否一致,即两个引用是否指向同一个对象。若是则true,否则FALSE
如下例:Integer n1 =new Integer(100);Integer n2=new Integer(100);
System.out.println(n1==n2);
运行结果为FALSE
因为引用n1和n2分别指向不同的Integer对象,虽然两个引用所指向的对象的值相等,但是他们的地址是不一样的,即引用就不会一样。
而如果改为System.out.println(n1.equals(n2));则返回true,这是因为n1和n2分别为Integer类型的引用,在Integer中对equals()方法重新写了,覆盖了Object类中的equals()方法,Integer中的equals()方法的作用是判断两个引用指向对象的值是否相等,故而返回true,像String,Boolean,Double等类都重写了equals方法,故可以用equals方法判断两个对象的值是否相等。
2,、如果是自己写的类,若没有重写equals方法,则调用equals方法时将会直接调用Object中的equals方法,而Object中的equals方法的作用是判断两个引用指向的是否是同一对象,故和上例产生了偌大的区别,读者看的时候一定会惊奇的。不过知道是重写了equals方法后就简单多了。看下面例子就是如此
Class Test
{
Int i;
}
Public class EqualsTest{
Public static void main(String[] args)
{
Test t1=new Test();
Test t2=new Test();
t1.i=t2.i =100;
System.out.println(t1==t2);//结果为FALSE
System.out.println(t1.equals(t2));//结果为FALSE
}
}
因为这个实例中执行的是Object中的equals方法。
3、说明:在Integer类型的引用判等时我们将鼠标移动到equals方法上面,可以看到其执行的方法:
boolean java.lang.Integer.equals(Object obj)
Compares this object to the specified object. The result is true if and only if the argument is not null and is an Integer object that contains the same int value as this object.
比较此对象与指定对象。当且仅当参数不为 null,并且是一个与该对象包含相同 int 值的 Integer 对象时,结果为 true。
Overrides:equals(...)in Object
Parameters:
objthe object to compare with.
Returns:
trueif the objects are the same; false otherwise
在执行判断Test对象引用的时候鼠标放在equals方法上面后提示为:
boolean java.lang.Object.equals(Object obj)
指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:
- 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
- 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
- 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
- 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
- 对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
4、在执行System.out.println(“12”.equals(“12”));时是执行String类的equals方法,结果为true
java中的==和equals的区别的更多相关文章
- java中hashcode和equals的区别和联系
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...
- JAVA中的==和equals()的区别
一.先来说说Java的基本数据类型和引用类型 八大基本数据类型:Byte,short,int,long,double,folat,boolean,char,其中占一个字节的是byte,short和ch ...
- java中等于和equals的区别
面试的时候没答上,很受打击,特写在这里. ==是判断两个变量或实例是不是指向同一个内存空间equals是判断两个变量或实例所指向的内存空间的值是不是相同 除了String和封装器,equals()和“ ...
- Java中的==和equals的区别详解
1.基础知识 (1)String x = "hello"; (2)String x = new String ("hello"); 第1种方式的工作机制是,首先 ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Java中堆和栈的区别(转)
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...
- 2)Java中的==和equals
Java中的==和equals 1.如果比较对象是值变量:只用== 2.如果比较对象是引用型变量: ==:比较两个引用是不是指向同一个对象实例. equals: ...
- java中堆和堆栈的区别
java中堆和堆栈的区别(一) 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取 ...
随机推荐
- Android 线程通讯类Handler
handler是线程通讯工具类.用于传递消息.它有两个队列: 1.消息队列 2.线程队列 消息队列使用sendMessage和HandleMessage的组合来发送和处理消息. 线程队列类似一段代码, ...
- windows下python脚本程序的运行
c:\python33\python.exe c:\python33\trycoding.py
- Windows下搭建Mysql集群
Mysql集群的基本架构如下: 基本原理参考:[转]MySQL Cluster (集群)基本原理 这里采用最小配置,用两台机器来分别部署一个management 节点,2个data node, 2个s ...
- word引用错误
错误 4317 无法嵌入互操作类型“Microsoft.Office.Interop.Word.ApplicationClass”.请改用适用的接口. 类型“Microsoft.Office.Inte ...
- 函数rec_get_nth_field_offs_old
/************************************************************//** The following function is used to ...
- 宏buf_pool_struct
typedef struct buf_pool_struct buf_pool_t; /** @brief The buffer pool structure. NOTE! The definitio ...
- Ionic开发中常见问题和解决方案记录
1npm按装包失败 更换源:npm config set registry https://registry.npm.taobao.org 或者使用cnpm sudo npm install -g c ...
- UVa 11178 (简单练习) Morley's Theorem
题意: Morley定理:任意三角形中,每个角的三等分线,相交出来的三个点构成一个正三角形. 不过这和题目关系不大,题目所求是正三角形的三个点的坐标,保留6位小数. 分析: 由于对称性,求出D点,EF ...
- UVA 10735 Euler Circuit 混合图的欧拉回路(最大流,fluery算法)
题意:给一个图,图中有部分是向边,部分是无向边,要求判断是否存在欧拉回路,若存在,输出路径. 分析:欧拉回路的定义是,从某个点出发,每条边经过一次之后恰好回到出发点. 无向边同样只能走一次,只是不限制 ...
- LeetCode: MergekSortedLists
Title: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its comple ...