1. 起因:字符串恒等判断

//String is reference type
String str1 = new String("hello");
String str2 = new String("hello");System.out.println(str1==str2);
// false
System.out.println(str1.equals(str2));
// true

2. 关系操作符 “==”

要点:“==”只可以处理基本数据类型对应值的恒等判断,不适用引用数据类型(其值存的是地址)

public class Main {public static void main(String[] args) {int n=3;int m=3;
// trueSystem.out.println(n==m);String str = new String("hello");String str1 = new String("hello");String str2 = new String("hello");
// falseSystem.out.println(str1==str2);str1 = str;str2 = str;
// trueSystem.out.println(str1==str2);}
}

n==m结果为true,这个很容易理解,变量n和变量m存储的值都为3,肯定是相等的。而为什么str1和str2两次比较的结果不同?要理解这个其实只需要理解基本数据类型变量和非基本数据类型变量的区别。

  • Java中的8个基本数据类型

浮点型:float, double;整型:byte, short, int , long; 字符型: char; 布尔型: boolean。

对于这8种基本数据类型的变量,变量直接存储的是“值”,因此在用关系操作符==来进行比较时,比较的就是 “值” 本身。要注意浮点型和整型都是有符号类型的,而char是无符号类型的.

对于非基本数据类型的变量(引用类型)。如String类型,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。如,str1并不是直接存储的字符串"hello",而是该对象所对应的地址。因此在用==对str1和str2进行第一次比较时,得到的结果是false。因此它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同。 而在第二次比较时,str1和str2同时指向了str指向的对象,那么得到的结果毫无疑问是true(地址相同)。

3. Object方法 “equals()”

equals方法是基类Object中的方法,因此对于所有的继承于Object的类都会有该方法。 在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象.

public class Main {public static void main(String[] args) {String str1 = new String("hello");String str2 = new String("hello");
// trueSystem.out.println(str1.equals(str2));}
}

String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。 其他的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。

小结:

  • 对于==:如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等; 如果作用于引用类型的变量,则比较的是所指向的对象的地址
  • 对于equals方法:如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址; 诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容(equals方法不能作用于基本数据类型的变量)

Java中恒等条件判断:“equals”和“==”相关推荐

  1. scale和java比较_浅谈java中BigDecimal的equals与compareTo的区别

    这两天在处理支付金额校验的时候出现了点问题,有个金额比较我用了BigDecimal的equals方法来比较两个金额是否相等,结果导致金额比较出现错误(比如3.0与3.00的比较等). [注:以下所讲都 ...

  2. 怎么在Java里辨别小数_求教java中如何判断一个数是不是小数,求详细代码及解释...

    求教java中如何判断一个数是不是小数,求详细代码及解释 关注:62  答案:2  mip版 解决时间 2021-01-29 22:49 提问者孤酒醉人心 2021-01-29 03:13 求教jav ...

  3. java中的==和equals的区别

    关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...

  4. java中的==、equals()、hashCode()源码分析(转载)

    在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...

  5. java 判断数组已经存满_详解Java中数组判断元素存在几种方式比较

    1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String contai ...

  6. java怎么统计随机数出现次数,Excel统计出现次数、个数的VBA代码 java中怎么判断一个字符串中包含某个字符或字...

    延伸:java中怎么判断一个字符串中包含某个字符或字符 描述:...一个字符串中包含某个字符的单词说出现的次数 c#什么方法可以判断字符串中包含某个字符的个数? JAVA判断字符串数组中是否包含某字符 ...

  7. JAVA中 fastjson判断JSONObject是否为空,方法isEmpty()

    JAVA中 fastjson判断JSONObject是否为空 package com.map;import com.alibaba.fastjson.JSONObject;/*** 判断JSONObj ...

  8. 2)Java中的==和equals

    Java中的==和equals   1.如果比较对象是值变量:只用== 2.如果比较对象是引用型变量: ==:比较两个引用是不是指向同一个对象实例. equals: 首先Object类中equals的 ...

  9. Java中类型判断的几种方式

    前言 在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式. 2. instanceof instanceof是Java的一个运算符,用来判断一个对象是 ...

最新文章

  1. Python 捕获警告
  2. SAP HUM 如何将HU里的物料号换成另外一个物料号?
  3. nginx 403 forbidden 二种原因
  4. 看直播赢大奖-智能物流技术培训
  5. 【转】Struts2 和 Spring MVC对比
  6. Jquery之编辑不可修改
  7. wxpython 安装教程
  8. 引用和指针的差别,数组和指针的差别
  9. eclipse启动tomcat 访问http://localhost:8080 报404错误
  10. Linux shell 中$() ` `,${},$[] $(()),[ ] (( )) [[ ]]作用与区别
  11. php源码怎样安装mysql_Linux下源码包安装mysql、apache以及php
  12. 代码审查反馈提交修复时,是否应该压缩提交?
  13. python的三种数据类型列举_3.Python编程之数据类型
  14. Oracel 格式化日期 to_char()
  15. java随机数_Java随机
  16. 携号转网实时手机号归属地查询接口API
  17. Django 国际化翻译中的 gettext 和 gettext_lazy
  18. C#基于RealPlayX.ocx视频监控整合程序
  19. 光子晶体matlab,Matlab光子晶体程序讨论
  20. 面向对象课程设计日志(八)

热门文章

  1. 关于Nginx location中配置proxy_pass转发时斜线'/'导致的404问题
  2. 一些实用的DBA语句之二(慢慢更新)
  3. 职场中一路走来却拂不去一丝失落——一个女IT的告白
  4. QQ开心农场外挂软件设计思路
  5. NYOJ 1069 生活的难题
  6. NYOJ 709 异形卵
  7. 【日本語学習】 刺身
  8. linux 网络编程 2---(TCP编程)
  9. 【模式匹配】KMP算法的来龙去脉
  10. Chapter 5. Expressions