java equals和==的区别
大概说equals和==都比较的是什么:
1. boolean tem = a == b;
首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容。因为栈是用来存放地址或是java中八大基本类型中自动变量的字面值(自动变量就是用int a = 1;这种形式来定义的变量)。如果是自动变量比较值的话肯定是用==来比较,因为equals()是一个方法,所以必须由对象调用才可以用于比较。而自动变量既不是类的实例也不是类的引用所以不能用equals()方法。
2.boolean tem = a.equals("b");
equals()方法一般用于比较的是对象的内容但是也有的情况下也会去比较两个对象的地址。
接下来
写一个测试程序
package com; import java.util.Date; public class test { public static void main(String[] args) { Integer integer1 = new Integer(1); Integer integer2 = new Integer(1); String str1 = new String("123"); String str2 = new String("123"); String str3 = "abc"; String str4 = "abc"; Date date1 = new Date(); Date date2 = new Date(); Double double1 = new Double("1.0"); Double double2 = new Double("1.0"); Boolean tem1 = new Boolean(true); Boolean tem2 = new Boolean(true); Object object1 = new Object(); Object object2 = new Object(); System.out.println("----Object------"); System.out.println(object1.equals(object2)); System.out.println(object1 == object2); System.out.println(object1.equals(object1)); System.out.println(object1 == object1); System.out.println("----Boolean------"); System.out.println(tem1.equals(tem2)); System.out.println(tem1 == tem2); System.out.println("----Double------"); System.out.println(double1.equals(double2)); System.out.println(double1 == double2); System.out.println("----Integer------"); System.out.println(integer1.equals(integer2)); System.out.println(integer1 == integer2); System.out.println("----String------"); System.out.println(str1.equals(str2)); System.out.println(str1 == str2); System.out.println(str1.equals(str2)); System.out.println(str1 == str2)System.out.println(str3.equals(str4)); System.out.println(str3 == str4); System.out.println("----Date------"); System.out.println(date1.equals(date2)); System.out.println(date1 == date2); } }
结果:
----Object------
false
false
true
true
----Boolean------
true
false
----Double------
true
false
----Integer------
true
false
----String------
true
false
true
true
----Date------
true
false
首先对Object的比较,当比较的两个对象一样时,==和equals()的结果都是true,当两个对象不一样时返回的都是false。所以在==和equals用于比较对象时,他们比较的都是对象的地址,其实本质是一样的。下面是Object类中equals()方法的代码:
public boolean equals(Object obj) {return (this == obj);}
在这里string需要特殊说明一下,我们知道String是被final修饰的是不可变的,这时候我们可能会想== 不是用来比较引用吗,那为什么str3 == str4还能等于true呢?注意“==”的确用来比较对象的引用,但是你能够确定String str3 = "abc";和String str4 = "abc";重新生成对象了吗?原来java在String这块也做了特殊处理,在这块有个叫做字符缓冲池的东西,当用new的方法创建一个string对象时会先在字符串缓冲池中找有没有和新创建的字符串内容相等的对象,如果没有的话就会在缓冲池新创建一个字符串对象然后再在堆中创建字符串对象,如果缓冲池中已经有了和新创建的字符串内容相等的对象就会直接在堆上新创建对象。如果不用new的方式也是先会看缓冲池中有没有创建过这个对象,如果没有创建就在里边创建一个,如果已经创建了那新声明的引用(例子中的str4)就会直接指向这个对象。所以在本例中str3 == str4 是等于true。关于string的知识需要注意的不只有这些,想要了解的同学再留言讨论吧。这里我们主要说equals和==的区别。
而对于Boolean,Double(Float同理),Interger(Shot,Long同理),String,Date我也找了他们的源码,下面我依次贴出来在Boolean,Double,Interger,String,Date这些类中equals()方法的源码,这时候equals()方法就被重写了,因为这些类都是继承于Object类的嘛。
Boolean:
public boolean equals(Object obj) {if (obj instanceof Boolean) {return value == ((Boolean)obj).booleanValue();}return false;}
Double:
public boolean equals(Object obj) {return (obj instanceof Double)&& (doubleToLongBits(((Double)obj).value) ==doubleToLongBits(value));}
Interger:
public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;}
String:
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;}
Date:
public boolean equals(Object obj) {return obj instanceof Date && getTime() == ((Date) obj).getTime();}
也就是说在这些时候重写了Object类的equals()方法用于比较两个对象实际的内容而不再是地址了,当然肯定不只是这些,这里只是举出了几个比较常见的java原生类重写Object类的equals()方法的情况。
java equals和==的区别相关推荐
- Java == equals() hashCoed()的区别
1. == Java中分两类数据类型:基本数据类型 boolean,byte,char,short,int,long,float,double 和类对象(的引用). a. 对于基本类型的==判断的是它 ...
- 【Java常识】6.0面向对象认知和Eclipse的实用使用、==号和equals方法的区别
1.曾经写过很多自以为很通俗易懂的面向对象的解释. 如下是目前最通俗的一种解释: 2.Eclipse的补充解释. 运行的快捷键:F11. 3.Eclipse快捷键大全 大全放本文最后,这里主要放常用的 ...
- JAVA 中equals()与==的区别
原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...
- Java基础 抽象类和接口的区别、equals 与 == 的区别
一.抽象类和接口有什么区别 抽象类与接口都用于抽象,但是抽象类可以有自己的部分实现,而接口规范某一行为,调用者实现这个接口. 主要区别: 1.抽象类还是类只能单继承,而接口却可以多实现. 2.抽象类满 ...
- Java基础之equals和==的区别深入解析
Java基础之equals和==的区别深入解析 以下是本文目录大纲 equals 和 == 的区别 equals 的重写 复写hashCode方法,有31这个数字的作用 1. equals 和 == ...
- Java面试通关要点汇总集答案(七)——equals 与 == 的区别 List 和 Set 区别
一.equals 与 == 的区别 首先equals和== 最大的区别是一个是方法一个是运算符,在Java中,"=="和Object()类的equals比较的都是物理地址,而不是值 ...
- java 夯实基础_夯实基础-java equals使用,和 == 的区别
在研究hashcode的用法,发现自己对equals的理解还不够深,废话少说,继续专研,记录如下: 要想搞清楚equals和==的区别,就先要搞清楚JAVA的数据类型: java的数据类型只要分两大类 ...
- Java,哈希码以及equals和==的区别(转载)
从开始学习Java,哈希码以及equals和==的区别就一直困扰着我. 要想明白equals和==的区别首先应该了解什么是哈希码,因为在jdk的类库中不管是object实现的equals()方 ...
- Java,哈希码以及equals和==的区别
从开始学习Java,哈希码以及equals和==的区别就一直困扰着我.要想明白equals和==的区别首先应该了解什么是哈希码,因为在jdk的类库中不管是object实现的equals()方法还是St ...
最新文章
- CSL-YOLO | 超越Tiny-YOLO V4,全新设计轻量化YOLO模型实现边缘实时检测!!!
- 中国CIO最关心的八大问题(下)
- opencv中的Rodrigues()函数
- Facebook首席工程负责人胡鲁辉:数字化2.0的理念、架构与业务模型丨鲸犀峰会
- 【数学和算法】协方差矩阵、方差
- UIWebView中JS与OC交互 WebViewJavascriptBridge的使用
- python3性能还低吗_Python3 vs. Python2 大作战,谁将是性能之王?
- 02-方法-课后思考
- THUSCH 2017 大魔法师(矩阵乘法+线段树)
- WPF Popup 相关内容
- 【频率计】基于ISE+VHDL编程的多功能数字频率计
- My97datepicker时间控件的简单使用
- android手机查看root,怎么看安卓手机是否Root 一键检测手机root方法
- ios开发中UIButton设置标题和图片不能同时显示问题解决
- Android 获取Usb设备类型
- PYA 练习2-3 输出倒三角图案
- 【css】巧用border制作三角形
- Spring Boot 统一功能处理
- HTNL常见的标签及属性 和w3school的使用
- C#蓝牙连接及传输数据的三种方式(蓝牙传输文件、二进制数据)