转载------------java equals 方法

作者:海子
出处:http://www.cnblogs.com/dolphin0520/

浅谈Java中的equals和==

  在初学Java时,可能会经常碰到下面的代码:

1 String str1 = new String("hello");
2 String str2 = new String("hello");
3         
4 System.out.println(str1==str2);
5 System.out.println(str1.equals(str2));

  为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就会导致自己在以后编写代码时出现一些低级的错误。今天就来一起了解一下==和equals方法的区别之处。

一.关系操作符“==”到底比较的是什么?

  下面这个句话是摘自《Java编程思想》一书中的原话:

  “关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。

  这句话看似简单,理解起来还是需要细细体会的。说的简单点,==就是用来比较值是否相等。下面先看几个例子:

复制代码
public class Main {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubint n=3;int m=3;System.out.println(n==m);String str = new String("hello");String str1 = new String("hello");String str2 = new String("hello");System.out.println(str1==str2);str1 = str;str2 = str;System.out.println(str1==str2);}}
复制代码

  输出结果为 true false true

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

  在Java中游8种基本数据类型:

  浮点型:float(4 byte), double(8 byte)

  整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)

  字符型: char(2 byte)

  布尔型: boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值"true"和"false")

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

  也就是说比如:

  int n=3;

  int m=3; 

  变量n和变量m都是直接存储的"3"这个数值,所以用==比较的时候结果是true。

  而对于非基本数据类型的变量,在一些书籍中称作为 引用类型的变量。比如上面的str1就是引用类型的变量,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。比如下面这行代码:

  String str1;

  这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。

  而 通过new String("hello")来产生一个对象(也称作为类String的一个实例),并将这个对象和str1进行绑定:

  str1= new String("hello");

  那么str1指向了一个对象(很多地方也把str1称作为对象的引用),此时变量str1中存储的是它指向的对象在内存中的存储地址,并不是“值”本身,也就是说并不是直接存储的字符串"hello"。这里面的引用和C/C++中的指针很类似。

  因此在用==对str1和str2进行第一次比较时,得到的结果是false。因此它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同。

  而在第二次比较时,都让str1和str2指向了str指向的对象,那么得到的结果毫无疑问是true。

二.equals比较的又是什么?

  equals方法是基类Object中的方法,因此对于所有的继承于Object的类都会有该方法。为了更直观地理解equals方法的作用,直接看Object类中equals方法的实现。

  该类的源码路径为:C:\Program Files\Java\jdk1.6.0_14的src.zip 的java.lang路径下的Object.java(视个人jdk安装路径而定)。

  下面是Object类中equals方法的实现:

  

  很显然,在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。

  但是有些朋友又会有疑问了,为什么下面一段代码的输出结果是true?

复制代码
public class Main {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubString str1 = new String("hello");String str2 = new String("hello");System.out.println(str1.equals(str2));}
}
复制代码

  要知道究竟,可以看一下String类的equals方法的具体实现,同样在该路径下,String.java为String类的实现。

  下面是String类中equals方法的具体实现:

  可以看出,String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。

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

  总结来说:

  1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

    如果作用于引用类型的变量,则比较的是所指向的对象的地址

  2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

转载于:https://www.cnblogs.com/ct-blog/articles/5605547.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机系统基础:校验码知识笔记

1、校验码概念 校验码主要是为了解决计算机各部件进行数据传输和交换,确保传送过程的正确无误,一是为了提高硬件电路的可靠性,二是提高代码的校验能力。通常会用校验码来检查传送的数据是否正确。 校验码编码分为两类:合法编码、错…

qml与HTML数据交互,GitHub - toby20130333/QtQuickHtmlBridge: 基于QtQuick的C++,qml,Html三者的Bridge交互...

基于QtQuick的C,qml,Html三者的Bridge交互主要功能自定义C对象并注册到QML可以在QML中继续扩展C对象的属性和方法 信号等将C对象注入到WebChannelHtml中引入C对象JavaScript与C直接交互示例代码说明main.cpp://该实例必须直接继承自Object的 QWidget的忽略qmlRegisterType(&quo…

html为什么要进行表单验证_化学锚栓为什么要进行拉拔试验?

点击箭头处“蓝色字”,关注我们哦!!化学锚栓是继膨胀锚栓之后出现的一种新型紧固材料,由化学药剂与金属杆体组成,是通过特制的化学粘接剂,将螺杆胶结固定于砼基材钻孔中,以实现对固定件锚固的复…

电路基础知识讲解(太全面了)

IT技术分享社区个人博客网站:https://programmerblog.xyz文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基…

github设置仓库可见性 私人仓库设置

一:点击Setting 二:点击Make private 三:阅读关于将仓库设为私有的警告。 入您要设为私有的仓库的名称,例如 accountname/reponame。 单击 I understand, make this repository private(我已了解,请将此仓库设为私有)

html鼠标悬停区域拉伸,html – :将鼠标悬停在具有边框半径的div上

这里的问题是子元素不继承父元素的border-radius.有两种方法可以实现您想要的:您可以将子元素的border-radius设置为匹配或大于父元素的radius,或者将父元素的overflow属性设置为hidden.这是一个快速的片段,说明了问题和两个解决方案:*{box-sizing:borde…

rfid在高速公路管理中的应用_RFID技术与ETC技术在弱电门禁系统中应用

前言:无线射频识别技术(RFID技术)较早的大规模的综合应用,发展至今,我国的RFID技术已经较为成熟。 相关技术1、无线射频识别 RFID(Radio Frequency Identification,无线射频识别)是一种非接触式的自动识别技术,它通过射…

Idea中Terminal中git基本操作

列出分支 列出分支基本命令:git branch 没有参数时,git branch 会列出你在本地的分支。 上图的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支(有*星号的)。 当你执行 git init 的时候,默认情况下 Gi…

计算机体系结构知识笔记

计算机体系结构结构:计算机的概念结构、功能和性能特性,它从一个更高的层次对计算机的结构特征等宏观特征进行研究。 1、计算机体系结构分类 2、CISC和RISC 指令体系结构(ISA):一个处理器支持的指令和指令的字节级编码…

java类的加载机制

一、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象&…

razor 写入html标记,如何在Razor中编写“ Html.BeginForm”

泛舟湖上清波郎朗以下代码可以正常工作:using (Html.BeginForm("Upload", "Upload", FormMethod.Post, new { enctype "multipart/form-data" })){ Html.ValidationSummary(true) …

windows安全模式_Winclone 8 for Mac(Windows分区备份迁移和还原工具)

winclone 8 Mac版是一款专业的boot Camp迁移助手,能够将你的PC移动到你的Mac中,让你实现win系统的迁移。winclone Mac版可以将Bootcamp分区安装的windows进行克隆也可将克隆文件传回Bootcamp分区。并且操作简单。你只需要通过几次点击,就能快…

IDEA中一个被低估的功能,一键把项目代码绘制成UML类图

阅读本文大概需要 2 分钟。来自:blog.csdn.net/hy_coming/article/details/80741717最近在开发的过程当中,对于已有的代码,想将相关类绘制成UML类图,虽然现在有很多UML类图的优秀软件,比如ProcessOn(可视化…

java导出生成word(类似简历导出)

最近做的项目,需要将一些信息导出到word中。在网上找了好多解决方案,现在将这几天的总结分享一下。 目前来看,java导出word大致有6种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间…

计算机基础:存储系统知识笔记(一)

1、存储系统定义 由一个不同容量、成本和访问时间的存储结构构成的层次结构,这些存储器通过适当的硬件和软件有机的组合在一起。 存储器的层次:CPU内部的寄存器、高速缓存Cache、主存储器、辅助存储器 2、存储器的分类 2.1 存储位置分类 内存&#xff1a…

ae绘图未指定错误怎么办_早晨深化设计研究院47个快捷键50个CAD技巧助你神速绘图,玩转CAD...

终于知道为什么别人用CAD总比我快了,原来他们早就掌握了这些实用的CAD技巧,还没看完我就默默地转了,总有用得到的时候。一、47个快捷键1. 创建直线的快捷方式是L空格2. 创建圆的快捷方式是C空格3. 创建圆弧的快捷方式是A空格4. 创建矩形的快捷…

计算机基础:存储系统知识笔记(二)

1、高速缓存 1.1 定义 用来存放当前最活跃的程序和数据。 特点:容量在几千字节到几兆之间,速度比主存快5~10倍左右。快速半导体组成。 1.2 高速缓存的组成 一般位于CPU和主存之间。主要包括管理模块、由相联存储器构成的存储表、小容量的高速存储器。 1.…

2020html5开发工具,2020web前端学习路线

原标题:2020web前端学习路线2020年最新web前端学习路线!接下来,教大家如何从零基础小白学习web前端,没有基础的伙伴也不要着急,有给大家整理视频教程,文末,大家按需学习就好!一、入门…

layuiajax提交表单控制层代码_漏洞预警|ThinkPHP 5.0 远程代码执行

漏洞预警|ThinkPHP 5.0 远程代码执行2019-01-11事件来源2019年1月11日,ThinkPHP Github仓库发布了新的版本v5.0.24,包含重要的安全更新,山石安服团队经过分析把该漏洞危险级别定为严重。漏洞描述ThinkPHP是一个快速、兼容而且简单的轻量级国产…

计算机基础:存储系统知识笔记(三)

1、相联存储器 1、相联存储器介绍 属于按内容访问的存储器。 原理:把数据或数据某一独立单元作为关键字,用该关键字和存储器的每个存储单元比较,相同则表示找到对应的存储单元。 2、相联存储器的组成部件 1、输入检索寄存器:存放要…