深入探究Java中equals()和==的区别是什么
相等判断符"=="介绍
"=="相等判断符用于比较基本数据类型和引用类型数据. 当比较基本数据类型的时候比较的是数值, 当比较引用类型数据时比较的是引用(指针).
"=="判断基本类型是否相等.
- 首先基本数据类型指的是Java中的八大数据类型: byte, short, int, long, float, double, char, boolean
- 这八大基本数据类型有个共同的特点是它们在内存中是有具体值的, 比如说一个int类型的数据"2", 它在8位数据总线的机器上(假设的)保存形式为
0000 0010
. - 当使用"=="比较两个基本数据类型的时候, 就是比较它们各自在内存中的值.
"=="判断引用类型数据是否相等
- 引用数据类型在字面上也是很好理解的, 就是一个引用, 它会指向一个具体的对象.
- 比如说
Student stu = new Student();
, 这里的stu
就是一个引用, 它指向的是当前new
出来的Student
对象. 当我们想要操作这个Student
对象时, 只需要操作引用即可, 比如说int age = stu.getAge();
. - 所以用"=="判断两个引用数据类型是否相等的时候, 实际上是在判断两个引用是否指向同一个对象.
- 看下面的示例
public static void main(String[] args) { String s1 = "hello"; //s1指向常量池中的"hello"字符串 String s2 = "hello"; //s2也指向常量池中的"hello"字符串 System.out.println(s1 == s2); //true String s3 = new String("hello"); //s3指向的是堆内存中的字符串对象 System.out.println(s1 == s3); //false }
- 从上面的例子可以看到, 由于引用"s1"和"s2"指向的都是常量池中的"hello"字符串, 所以返回true.
- 而"s3"指向的是新创建字符串对象, 因为只要动用了
new
关键字, 就会在堆内存创建一个新的对象, - 也就是说s1和s3指向的是不同的字符串对象, 所以返回false.
判断是否相等-equals()方法介绍.
equals()和
==
有着本质的区别,==
可以看作是对操作系统比较数据手段的封装, 而equals()则是每个对象自带的比较方法.
- equals()和
==
的本质区别更通俗的说法是,==
的比较规则是定死的, 如上面所述; 而equals()的比较规则是不固定的, 可以由用户自己定义. - 看下面的例子:
public static void main(String[] args) { String s1 = "hello"; String s3 = new String("hello"); System.out.println(s1.equals(s3)); //true }
- 在用
==
比较的时候, 上面s1和s3比较出的结果为false. 而当用equals比较的时候, 得出的结果为true. - 想知道原因我们还得看源码, 下面是String类的equals()源码.
public boolean equals(Object anObject) { if (this == anObject) { //先比较两个字符串的引用是否相等(是否指向同一个对象), 是直接返回true 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; }
- 从上面的源码可以看到, 当调用String类型的equals()方法时, 首先会判断两个字符串的引用是否相等, 也就是说两个字符串引用是否指向同一个对象, 是则返回true.
- 如果不是指向同一个对象, 则把两个字符串中的字符挨个进行比较. 由于s1和s3字符串都是"hello", 是可以匹配成功的, 所以最终返回true.
深入探究equals(), 为什么会有equals()方法?
- 通过上面的讲解相信你已经知道
==
和equals()的区别, 一个的比较规则是定死的, 一个是可以由编程人员自己定义的. - 可是为什么会有equals()方法, 而且还可以被自由定制呢?
- 这个问题要落到Java语言的核心--面向对象思想了. Java不同于面向过程的C语言, Java是一款面向对象的高级语言. 如果只是面向过程, 直接操作内存上存储的数据的话, 用
==
所定义的规则来判断两个数据是否相等已经足够了. - 而Java中处处是对象, 我们经常要面对的问题是这两个对象是否相等, 而不是这两串二进制数是否相等, 仅有"=="是完全不够用的.
- 考虑到编程人员会使用Java创建各种满足它们业务需求的对象, 系统无法提前知道两个对象在什么条件下算相等, Java干脆把判断对象是否相等的权力交给编程人员.
- 具体的措施是: 所有的类都必须继承Object类, 而Object类中写有equals()方法. 编程人员可以通过重写equals()方法实现自己的比较策略, 也可以不重写, 使用Object类的equals()比较策略.
//Object类中的equals()方法源码
public boolean equals(Object obj) { return (this == obj); }
- 从Object类的equals()源码可以看到, 如果编程人员没有显示地重写equals()方法, 则该类对象默认通过引用数据类型进行比较, 也就是说比较两个引用是否指向同一个对象.
补充: 关于基本数据类型包装类的比较
- 由于Java中万物皆对象, 就连基本数据类型也有其对应的包装对象, 那么它们对应的比较策略是什么呢?
public static void main(String[] args) { int a = 3; Integer b = new Integer(3); System.out.println(b.equals(a)); //true, 自动装箱 }
- 从上面的代码可以看到尽管两个引用不同, 但是输出的结果仍为true, 证明Integer包装类重写了equals()方法.
//Integer类中的equals方法
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
- 从源码看到, 基本类型包装类在重写的equals方法中, 比较的还是基本数据类型的值.
本人刚看完这套课程找到工作了 现在送给大家 2019最新Java视频网盘链接:https://pan.baidu.com/s/1cEK6WoXS4F9SRgj1bZclqg
提取码:bjl8
转载于:https://www.cnblogs.com/wuwei11/p/10967483.html
深入探究Java中equals()和==的区别是什么相关推荐
- JAVA 中equals()与==的区别
原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...
- java 定义变量时 赋值与不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...
探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值 当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,fl ...
- Java中equals()方法和==的区别分析
Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...
- Java中equals()和“==”区别
Java中equals()和"=="区别 1.对于基础数据类型,使用"=="比较值是否相等: 2.对于复合数据类型(类),使用equals()和"== ...
- 关于java中equals与==的区别的小实验
java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...
- java 基本类型 不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...
探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值 当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,fl ...
- 深入探究Java中hashCode()和equals()的关系
目录 一.基础:hashCode() 和 equals() 简介 equals() hashCode() 二. 漫谈:初识 hashCode() 与 equals() 之间的关系 三. 解密:深入理解 ...
- 捉虫记 C++转java Java中equals和==的区别
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号( ...
- Java中equals、==和hashcode()
java中的数据类型,可分为两类:基本数据类型的==比较的是值,复合数据类型的==比较的是内存地址 1.基本数据类型 也称原始数据类型.byte,short,char,int,long,float,d ...
最新文章
- 19.Oracle10g服务器管理恢复--RMAN表空间恢复(练习33)
- 交互学习 Vue.js
- 如何在7分钟内黑掉40家网站?
- 从选秀策略看市场测试
- 服务端和客户端证书各种组合下对访问者(浏览器/中间人)的影响
- 2020中国十大最丑建筑出炉,你觉得哪个更丑?
- 学习微信公众号oauth2.0
- 小米air耳机重新配对_横比小米 Air 2s 和 OPPO Enco W31:同一颗芯玩出的大不同
- zabbix监控系统时间的问题
- 修改服务器的共享内存大小,服务器共享内存大小能改么
- php-fpm配置文件,指定session保存目录
- ping和telnet的区别
- 计算机网络(第八版)谢希仁
- 001.Python安装及Pycharm安装破解
- maven报错The JAVA_HOME environment variable is not defined correctly
- supervisor 的 web 管理工具 cesi
- Unity3d多人在线教程
- BCD码 —— 8421码,余3码,2421码
- 消失的信用卡(2)——0-days
- 如何看待测试过程中的漏测发生