Java学习笔记之==与equals
一、问题引入
Java测试两个变量是否相等有两种方式:==运算符和equals方法。
但是这二者完全一样吗?考虑下面程序:
public class TestEqual
{
public static void main(String[] args)
{
int it = 65;
float f1 = 65.0F;
System.out.println("65和65.0是否相等? " + (it == f1));
char ch = 'A';
System.out.println("65和'A'是否相等? " + (it == ch)); String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1和str2是否相等? " + (str1 == str2));
System.out.println("str1和是equals str2? " + (str1.equals(str2)));
}
}
输出:
65和65.0是否相等? true
65和'A'是否相等? true
str1和str2是否相等? false
str1和是equals str2? true
由程序结果可以看出:
- 使用==来判断2个基本类型的的变量(不要求这两个变量类型一样,但二者都必须是基本类型),则只要两个变量字面值相等,使用==判断就会返回true,5-9行代码及其输出说明了这个问题
- 对于引用类型变量,必须两个变量指向同一个对象时,==才会返回ture,否则false,11-13行代码及其输出说明了这个问题
对于代码13行的判断,显然“不是很合理”,因为直觉上,二者就是一样的啊,这就是我们经常遇到的判断两个引用变量是否相等时,并不严格要求两个引用变量指向同一个对象,如上面程序中的两个字符串变量,只要二者引用的字符串对象里包含的字符序列相同即可认为相等,此时就需要用到equals方法,上述代码最后一行就是如此,结果返回true.
二、再看equals
equals方法是Object类提供的一个实例方法,因此所有引用变量都可调用该方法来判断与其他引用变量是否相等。
真相是残酷的:其实在判断两个引用变量(不是基本类型的变量哦,其实equals是不能够用来判断基本类型变量的)是否相等的时候,equals方法与==是一样的,即只有两个引用变量指向同一个对象时才会返回true. 这……上面的情况怎么解释?
众所周知,所有类都是Object类的子类,所以所有子类都可以重载父类的方法,其实String重写了父类Object类中的equals方法,自己整了一个标准:只要两个字符串包含的字符序列相同就返回true,否则false.( 学了C++的孩子可能会说,我重载==运算符,不重载equals方法,不可以吗,遗憾的是Java是没有运算符重载的)。
很容易看出来,因为Object类提供的equals方法本质上与==一样,这就导致,这个方法没有太大的实际意义,若果像==运算符那样严格的标准比较引用变量,估计实际中很少有两个引用变量会相等,所以这个方法(如果需要的话)常常在我们建立一个类时,就会重写该方法,自己定义一套合理的相等判断标准即可。
Java学习笔记之==与equals的更多相关文章
- Java学习笔记13(equals()方法;toString()方法)
equals()方法: equals方法是Object类中的方法:Object是所有类的祖宗,所以所有类都有equals()方法: boolean equals(Object obj); equals ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 20145330第五周《Java学习笔记》
20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...
- Java学习笔记——动态代理
所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- java学习笔记05--字符串 .
java学习笔记05--字符串 . 一.String类 由字符所组成的一串文字符号被称之为字符串.在java中字符串不仅仅是字符数组,而且是String类的一个实例,可以使用String类来构建. 字 ...
- java学习笔记04--数组
java学习笔记04--数组 数组复制的方法是使用System类提供的arraycopy()方法,其语法如下: System.arraycopy(Object src, int srcPos, Obj ...
- java学习笔记13--比较器(Comparable、Comparator)
java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 ...
随机推荐
- MVC和WebApi 使用get和post 传递参数。
我们总结一下用js请求服务器的传参方法. Get方式 Get主要是用来查询,一般分为无参,一个参数,多个参数,实体对象参数. 1.无参 //Get没有参数 var get_f1 = function( ...
- 防范 DDoS 攻击的 15 个方法
为了对抗 DDoS(分布式拒绝服务)攻击,你需要对攻击时发生了什么有一个清楚的理解. 简单来讲,DDoS 攻击可以通过利用服务器上的漏洞,或者消耗服务器上的资源(例如 内存.硬盘等等)来达到目的.DD ...
- 平庸与卓越的差别 z
本文是清华大学陈吉宁校长于在 2015 年第一次研究生毕业典礼暨学位授予仪式上的讲话,原文标题:选择与坚持.演讲非常精彩,值得您细细阅读. 亲爱的同学们: 今天,共有 1318 名同学获得博士.硕士学 ...
- TextView------文字底部或者中间加横线
promotionLinkText = (TextView) this .findViewById(R.id. text_promotion_link ); 中间加横线 promotionLinkTe ...
- 分享一些Comet开发经验
前言 本comet技术主要用于数据库持久层的 穿越防火墙 远程访问.只要有一台中继网站,任意地点的数据库都能被访问. Comet概念介绍 WebIM.网页的客服.meebo等大家听说过了.最近还有个兄 ...
- nslookup返回信息说明
先看一个示例: 如上图,我们把输出结果分成三部分,下面分别来描述: 第一部分: 这里是我们本机的DNS服务器信息. 客户机先到主DNS Server进行连接查询,结果发现异常,连接失败,于是出 ...
- Drupal处理缓存的方式
Drupal的后台数据库中有很多以cache开头的表,这些都是Drupal的缓存数据表. Drupal的缓存机制使用了接口方式,所有的缓存对象都必须实现DrupalCacheInterface接口: ...
- iOS学习笔记之回调(二)
写在前面 上一篇学习笔记中简单介绍了通过目标-动作对实现回调操作:创建两个对象timer和logger,将logger设置为timer的目标,timer定时调用logger的sayOuch函数.在这个 ...
- 通过xshell 设置代理上网
前言: 前段时间,选修了一门并行计算,老师给我们每个人分配了一个linux登录账号,通过这个账号,可能登录学校的一台linux . 一次偶然的机会,了解到可以通过xshell , ssh服务器给本地开 ...
- html5_common.js
(function(){ this.sendAjax = function(url,func,formData,type){ type = type || "POST"; //默认 ...