相等判断符"=="介绍

"=="相等判断符用于比较基本数据类型和引用类型数据. 当比较基本数据类型的时候比较的是数值, 当比较引用类型数据时比较的是引用(指针).

"=="判断基本类型是否相等.

  • 首先基本数据类型指的是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()和==的区别是什么相关推荐

  1. JAVA 中equals()与==的区别

    原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...

  2. java 定义变量时 赋值与不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...

    探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值 当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,fl ...

  3. Java中equals()方法和==的区别分析

    Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...

  4. Java中equals()和“==”区别

    Java中equals()和"=="区别 1.对于基础数据类型,使用"=="比较值是否相等: 2.对于复合数据类型(类),使用equals()和"== ...

  5. 关于java中equals与==的区别的小实验

    java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...

  6. java 基本类型 不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...

    探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值 当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,fl ...

  7. 深入探究Java中hashCode()和equals()的关系

    目录 一.基础:hashCode() 和 equals() 简介 equals() hashCode() 二. 漫谈:初识 hashCode() 与 equals() 之间的关系 三. 解密:深入理解 ...

  8. 捉虫记 C++转java Java中equals和==的区别

    java中的数据类型,可分为两类:  1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean    他们之间的比较,应用双等号( ...

  9. Java中equals、==和hashcode()

    java中的数据类型,可分为两类:基本数据类型的==比较的是值,复合数据类型的==比较的是内存地址 1.基本数据类型 也称原始数据类型.byte,short,char,int,long,float,d ...

最新文章

  1. 19.Oracle10g服务器管理恢复--RMAN表空间恢复(练习33)
  2. 交互学习 Vue.js
  3. 如何在7分钟内黑掉40家网站?
  4. 从选秀策略看市场测试
  5. 服务端和客户端证书各种组合下对访问者(浏览器/中间人)的影响
  6. 2020中国十大最丑建筑出炉,你觉得哪个更丑?
  7. 学习微信公众号oauth2.0
  8. 小米air耳机重新配对_横比小米 Air 2s 和 OPPO Enco W31:同一颗芯玩出的大不同
  9. zabbix监控系统时间的问题
  10. 修改服务器的共享内存大小,服务器共享内存大小能改么
  11. php-fpm配置文件,指定session保存目录
  12. ping和telnet的区别
  13. 计算机网络(第八版)谢希仁
  14. 001.Python安装及Pycharm安装破解
  15. maven报错The JAVA_HOME environment variable is not defined correctly
  16. supervisor 的 web 管理工具 cesi
  17. Unity3d多人在线教程
  18. BCD码 —— 8421码,余3码,2421码
  19. 消失的信用卡(2)——0-days
  20. 如何看待测试过程中的漏测发生

热门文章

  1. 用树莓派从0开始打造属于自己的服务器
  2. android的五大布局(layout)
  3. 给history命令加上执行用户和时间
  4. varnish性能调优
  5. Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)
  6. 数据库表设计的随笔(分库分表)
  7. RotateAnimation详解
  8. css杂项,清除浮动
  9. 一次gitlab无法使用ssh登录的问题解决
  10. 一个命令让Ubuntu升级变得更简单