java中==与equals的区别

 

值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。

 

    ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

 

    equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

 

    ==比较的是2个对象的地址,而equals比较的是2个对象的内容。

 

    显然,当equals为true时,==不一定为true;

 

    一、String中的equals和==

 

    1、

 

    public class TestString {

 

    public static void main(String[] args) {

 

    String s1 = "Monday";

 

    String s2 = "Monday";

 

    }

 

    }

 

    上面这段程序中,到底有几个对象呢?

 

    来检测一下吧,稍微改动一下程序

 

    public class TestString {

 

    public static void main(String[] args) {

 

    String s1 = "Monday";

 

    String s2 = "Monday";

 

    if (s1 == s2)

 

    System.out.println("s1 == s2");

 

    else

 

    System.out.println("s1 != s2");

 

    }

 

    }

 

    编译并运行程序,输出:s1 == s2说明:s1 与 s2 引用同一个 String 对象 -- "Monday"!

 

    2.再稍微改动一下程序,会有更奇怪的发现:

 

    public class TestString {

 

    public static void main(String[] args) {

 

    String s1 = "Monday";

 

    String s2 = new String("Monday");

 

    if (s1 == s2)

 

    System.out.println("s1 == s2");

 

    else

 

    System.out.println("s1 != s2");

 

    if (s1.equals(s2)) System.out.println("s1 equals s2");

 

    else

 

    System.out.println("s1 not equals s2");

 

    }

 

    }

 

我们将s2用new操作符创建

 

    程序输出:

 

    s1 != s2

 

    s1 equals s2

 

    说明:s1 s2分别引用了两个"Monday"String对象

 

    3. 字符串缓冲池

 

    原来,程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1

 

    将s2引用s1所引用的对象"Monday"

 

    第二段程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"Monday"Sting对象被创建在内存中。他们的值相同,但是位置不同,一个在池中游泳一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?

 

    4.

 

    再次更改程序:

 

    public class TestString {

 

    public static void main(String[] args) {

 

    String s1 = "Monday";

 

    String s2 = new String("Monday");

 

    s2 = s2.intern();

 

    if (s1 == s2)

 

    System.out.println("s1 == s2");

 

    else

 

    System.out.println("s1 != s2");

 

    if (s1.equals(s2)) System.out.println("s1 equals s2");

 

    else

 

    System.out.println("s1 not equals s2");

 

    }

 

    }

 

    这次加入:s2 = s2.intern();

 

    程序输出:

 

    s1 == s2

 

    s1 equals s2

 

    原来,(java.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。

 

    )

 

    更好的办法:

 

    把所有的String都intern()到缓冲池去吧

 

    最好在用到new的时候就进行这个操作

 

    String s2 = new String("Monday").intern();

 

    然后就可以用==比较两个字符串的值了

 

 

 

二、简单数据类型和封装类中的equals和==

 

    Java为每一个简单数据类型提供了一个封装类,每个基本数据类型可以封装成对象类型。

 

    除int(Integer)和char(Character),其余类型首字母大写即成封装类类型名。double (Double), float(Float),long(Long), short(Short),byte(Byte),boolean(Boolean).

 

    以int和Integer为例说明

 

    Java中int和Integer区别如下:

 

    1.int是基本的数据类型,默认值可以为0;2.Integer是int的封装类,默认值为null;3.int和Integer都可以表示某一个数值;4.int和Integer不能够互用,因为他们两种不同的数据类型;

 

    int a1=1;

 

    int a2=1;

 

    Integer b1 =new Integer (1);

 

    Integer b2 =new Integer (1);

 

  ------------------------------

 

    a1==a2 这个是成立的,很简单,都知道a1==b1 这个是不成立的.表达式的值为 false ,它们是不同的数据类型b1==b2 这个也是不成立的.表达式的值为 false,虽然是相同的数据类型,但是它们是两个对象,==比较的是2个对象的地址,它们的地址是不相等的,内容相等都是1;

 

    b1.equals(b2)==true 这个是成立的,表达式的值为 true. 相同数据类型,两个对象,地址不同,内容相同, quals比较的是2个对象的内容,所以成立。

 

    (a.equals(b),因为equals比较的是两个对象,所以a,b都不能为基本数据类型,否则会出编译错误。)同理,其它的封装类和基本类型也是这样的.

 

    java中equals和==的区别

 

    ==比较的是2个对象的地址,而equals比较的是2个对象的内容。

 

    三、其他类怎么使用equals和==

 

    API里的类大部分都重写了equals方法,没有重写的一般是自己写的类,如果是你自己定义的一个类,比较自定义类用equals和==是一样的,都是比较句柄地址,因为自定义的类是继承于object,而object中的equals就是用==来实现的,你可以看源码。

 

    四、java里equals和hashCode之间什么关系

 

    只是为了维护 hashCode 方法的常规协定,才要求用equals比较的两个对象的hashCode相同. equals()和hashCode()都来自java.lang.Object.你当然可以重写.

 

    比如a.equals(b).仅当a的内存地址相等时,才返回true.当然如String等类已经对这个方法进行了重写,比较的就不再是内存地址了. hashCode()的值也是与内存地址相关的.所以仅当内存地址相等时,hashCode才相等.

 

    同样很多类也重写了这个方法,还是以String为例:

 

    public int hashCode() {

 

    int h = hash;

 

    if (h == 0) {

 

    int off = offset;

 

    char val[] = value;

 

    int len = count;

 

    for (int i = 0; i < len; i++) {

 

    h = 31*h + val[off++];

 

    }

 

    hash = h;

 

    }

 

    return h;

 

    }

 

    就不在与内存地址相关了.这样做是为了保证用equals比较返回为true的两个对象,他们的hashCode是相同的.

 

    所以一般重写equals的时候都会重写hashCode().当然,这个相当于一个约定,一个协议.你不这么做并不会错.

 

    五、hashCode

 

    在一般的应用中你不需要了解hashcode的用法,但当你用到hashmap,hashset等集合类时要注意下hashcode。

 

    你想通过一个object的key来拿hashmap的value,hashmap的工作方法是,通过你传入的object的hashcode在内存中找地址,当找到这个地址后再通过equals方法来比较这个地址中的内容是否和你原来放进去的一样,一样就取出value。

 

    所以这里要匹配2部分,hashcode和equals但假如说你new一个object作为key去拿value是永远得不到结果的,因为每次new一个object,这个object的hashcode是永远不同的,所以我们要重写hashcode,你可以令你的hashcode是object中的一个恒量,这样永远可以通过你的object的hashcode来找到key的地址,然后你要重写你的equals方法,使内存中的内容也相等。。。

 

转载于:https://www.cnblogs.com/wangxiuheng/p/4572168.html

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

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

相关文章

3399 mysql_手动安装 mysql

手动安装 mysql需要在本机 (mac) 上装个 mysql, 看到压缩版的体积最小, 结果进入了手工安装的坑(正常有界面可以安装, 但安装目录将是 / usr/local/mysql), 既然入了坑就填上吧.1, 解压到自己选择的目录, 比如 / data/mysql.2, 初始化数据库: sudo /data/mysql/bin/mysqld --in…

构建之法第11、12章

第11章软件设计与实现 主要讲了典型的开发流程和开发阶段的一些管理方法 问题&#xff1a; 从spec道实现是代码的实现吗&#xff1f; 第12章 用户体验 主要讲了用户体验的各种角度和认识阻力登 问题&#xff1a; 用户的体验是设计前就要考虑的吗&#xff1f;转载于:https://www…

Mybatis多对多,复杂增删改查(特殊需求循环插入,分组查询)

2021.8.31 从25号开始练习复杂的mybatis多对多&#xff0c;从设计数据库思路到实现需求功能转移到实体项目中 1.之前很少看过字符转换的详细内容从今往后会注意字符串转换此项目为转数组&#xff08;date&#xff09;实体项目会有UUID生成的字符串 2.在添加时如果原表设计的首个…

MDI窗体简单方法(调用,闪屏)

MDI窗体简单方法&#xff08;调用,闪屏&#xff09; 调用方式&#xff1a; RibbonForm mdishow new RibbonForm(); //实例化midshow.MdiParent this; //设置在主窗体&#xff0c;以MDI的方式显示&#xff0c;关键属性。mdishou.Show();//显示窗体大伙都会碰到的问题。 解决…

kubernetes mysql pxc_K8S使用operator部署和管理Percona - PXC集群

概述pxc为mysql的一种集群模型&#xff0c;我们结合operator和k8s 完成pxc的部署和扩容硬盘使用local卷&#xff0c;如何管理local卷请翻阅 我的另一篇文章https://www.jianshu.com/p/bfa204cef8c0英文文档详情 https://percona.github.io/percona-xtradb-cluster-operator/con…

Springboot递归树(需求返回List树状结构数据)

一、本主的应用场景 部门里面有一个属性是当前部门的上级部门&#xff0c;而当前部门又会有下级部门&#xff0c;下级部门还有下级部门&#xff0c;这就形成了一个向下无限循环&#xff0c;呈现出树状结构。 二、认识JSONObject JSONObject只是一种数据结构&#xff0c;可以理…

data-role参数表:

data-role参数表&#xff1a; data-role参数表&#xff1a; page 页面容器&#xff0c;其内部的mobile元素将会继承这个容器上所设置的属性 header 页面标题容器&#xff0c;这个容器内部可以包含文字、返回按钮、功能按钮等元素 footer 页面页脚容器&#x…

mysql实现decode_Oracle中的DECODE()函数,MySQL中怎么实现DECODE()函数

decode(条件&#xff0c;值1&#xff0c;返回值1&#xff0c;返回值2) 对应的转换是&#xff1a;case when 条件 值1 then 返回值1 else 返回值2 end举例&#xff1a;oracle&#xff1a;select decode(sex,NULL,男,女)as sex,name,age,score From student_score_tablemysql实…

hubbledotnet mysql_HubbleDotNet 简介

系统简介HubbleDotNet 是一个基于.net framework 的开源免费的全文搜索数据库组件。开源协议是 Apache 2.0。HubbleDotNet提供了基于SQL的全文检索接口&#xff0c;使用者只需会操作SQL&#xff0c;就可以很快学会使用HubbleDotNet进行全文检索。 HubbleDotNet可以实现全文索引…

关于java开发中的实用工具Hutool工具类

Hutool是一个小而全的Java工具类库&#xff0c;通过静态方法封装&#xff0c;降低相关API的学习成本&#xff0c;提高工作效率&#xff0c;使Java拥有函数式语言般的优雅&#xff0c;让Java语言也可以“甜甜的”。 Hutool中的工具方法来自于每个用户的精雕细琢&#xff0c;它涵…

【转】WEB前端调优

首先从一次完整的的请求说起&#xff1a;&#xff08;以此为例get,www,baidu.com&#xff09; 1&#xff0c;webbrower 发出request&#xff0c; 2&#xff0c;然后解析www.baidu.com为ip,找到ip的服务器&#xff0c; 3&#xff0c;服务器处理请求资源并返回请求的内容&#xf…

浅谈从学校(培训机构)跳跃到企业初/中级java开发工程师的学习路线(由浅入深)

1.先别学SSM&#xff0c;也别学Mybatis ,直接百度SpringBoot 为什么学它呢&#xff0c;简单&#xff0c;还有你要用到的几乎所有框架都可以以最简单的模式去学习&#xff0c;比如mybatis。 springboot天然集成了你在校学习的ssm以及任何你需要用到的东西&#xff0c;真正意义…

interface接口_接口 interface

接口不是类&#xff0c;而是对类的一组需求描述。Arrays类中的sort方法承诺可以对对象数组进行排序&#xff0c;但要求满足下列条件&#xff1a;对象所属的类必须实现了Comparable接口。public interface Comparable {int compareTo(Object other); }Java SE5.0&#xff0c;Com…

代码视图与StoryBoard.Xib文件视图的跳转

在storyboard中拖拽的控件,当我们使用纯代码进行编写的时候,进行跳转的时候用我们平时用的[self.navigationController popToViewController:Vc animated:YES], 你会发现跳转的后出现的页面只有你用用纯代码写的,而storyboard中的没有,这时候我们使用这个方法还是比较简单不能实…

influxdb mysql对比_InfluxDB读写性能测试

这里将告诉您InfluxDB读写性能测试,教程操作步骤:今天进行了InfluxDB和MySQL的对比测试&#xff0c;这里记录下结果&#xff0c;也方便我以后查阅。操作系统&#xff1a; CentOS6.5_x64InfluxDB版本 &#xff1a; v1.1.0MySQL版本&#xff1a;v5.1.73CPU &#xff1a; Intel(R)…

Nginx windows安装部署

一、Nginx简介 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru 站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的. 它也是一种轻量级的Web服务器…