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. 栈的优势是,存取 ...
随机推荐
- vss的ss.ini丢失或损坏导致的vss无法登录错误
vss的ss.ini丢失或损坏导致的vss无法登录错误 Written in 2007-07-03 18:17 在vss使用过程中,不知道什么原因,会导至vss目录中的ss.ini文件损坏,此文件位于 ...
- 39. Combination Sum
题目: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C ...
- Android 清除canvas 笔迹代码
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); canvas.drawLine(pointX, , event.getX(), ...
- Haxe - Actuate.Tween
方法解释: Actuate.tween( target : Dynamic , duration : Float , properties : Dynamic , ?overwrite : Bool ...
- PHP的线程安全与非线程安全版本的区别
Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...
- 9本java程序员必读的书
来源:http://mp.weixin.qq.com/s?__biz=MjM5NzA1MTcyMA==&mid=202904638&idx=2&sn=21dd20438e32a ...
- 1137. Bus Routes(dfs)
1137 做过一样的 怎么又忘了 再一次搜超时 不用回溯 #include <iostream> #include<cstdio> #include<cstring> ...
- 一位ACM过来人的心得(转)
励志下! 刻苦的训练我打算最后稍微提一下.主要说后者:什么是有效地训练? 我想说下我的理解.很多ACMer入门的时候,都被告知:要多做题,做个500多道就变牛了.其实,这既不是充分条件.也不会是必要条 ...
- org.tigris.subversion.javahl.ClientException: Attempted to lock an already-locked dir异常解决方法
myeclipse用svn提交的时候报错: Attempted to lock an already-locked dir svn: Working copy 'D:/Program Files/My ...
- POJ 3084 Panic Room (最小割建模)
[题意]理解了半天--大意就是,有一些房间,初始时某些房间之间有一些门,并且这些门是打开的,也就是可以来回走动的,但是这些门是确切属于某个房间的,也就是说如果要锁门,则只有在那个房间里才能锁. 现在一 ...