博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中解决String equals相同但===不同的问题
阅读量:3897 次
发布时间:2019-05-23

本文共 1786 字,大约阅读时间需要 5 分钟。

感觉说了好多次,但是总是记不住,就很尴尬。索性再写一次:

写了以下的代码:

public static void main(String[] args) {
String s1="abc"; String s2=new String("abc"); System.out.println(s1.equals(s2)); System.out.println(s1==s2); System.out.println(s1.hashCode()==s2.hashCode()); }

然后输出的结果是:

在这里插入图片描述
咋就“==”这里出错了呢。

原来是这样的,

首先对于String s1=“abc”
s1是引用变量,在运行时数据区中,存放在栈中,而“abc”则是存放在常量池当中,并且把对应的地址给s1,而String s2=new String(“abc”),s2也是引用变量,同理new String也是创建了一个常量池。

首先对应“==”方法,有两种情况分类讨论:

1.如果是基本数据类型:byte,short,char,int,long,double,float,boolean这八种, 比较的是数据的值

2.如果是引用类型,就像上面的s1和s2,这里有个细节,如果再new String一个s3出来,和s2的双等号 也是false,而直接String一个s4的话,则是返回true了(s4我能明白,s3的话我又要硬记了吧。。。可以看一下这个)

在这里插入图片描述

在这里插入图片描述

再是equals方法,虽然说String是重写了这个方法,但是感觉大致上没有大影响。

这个是源码:

public boolean equals(Object anObject) {
if (this == anObject) {
return true; } if (anObject instanceof String) {
String anotherString = (String)anObject; int n = count; if (n == anotherString.count) {
char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) {
if (v1[i++] != v2[j++]) return false; } return true; } } return false; }

差不多就是以下几步:

1.两个是不是== 如果是的话,直接return true

2.再先判断是不是String,如果不是,直接return false
3.再判断两个的长度是不是一致的,不一致 return false
4.逐个字符比较,若有不相等字符,返回false

其实也就是 判断值是不是相同的

最后再提一下 hashcode,String 重写了equals,也同样重写了hashcode。

原因在于:因为如果不重写hashcode,会出现equals相等,而hashcode不等的情况,这违反object的一个默认的散列规则
——hashcode必须相等,euqals才可以相等,否则在hash集合中会出现问题

而且而且,这两者之间还有个小联系:

1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。

2、如果两个对象不equals,他们的hashcode有可能相等。 3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。

(equals>hashcode的感觉哈哈哈)

以上内容参考自:

转载地址:http://lnfen.baihongyu.com/

你可能感兴趣的文章
USB_ModeSwitch 介绍
查看>>
大公司和小公司的抢人战,孰胜孰负?
查看>>
通过make编译多文件的内核模块
查看>>
如何调试Javascript代码
查看>>
皮克斯宣布开源Universal Scene Description
查看>>
复盘:一个创业项目的失败之路
查看>>
阿里巴巴宣布加入Linux基金会
查看>>
为什么你应该尝试 “全栈”
查看>>
程序员什么时候该考虑辞职
查看>>
如何写一本书?
查看>>
加班能体现编程的热情吗?
查看>>
Hadley Wickham:一个改变了R的人
查看>>
glibc 指导委员会解散声明
查看>>
Linux创始者托瓦兹谈及IoT --「安全在其次」
查看>>
传感器数据分析(Sensor Data Analytics)是什么?
查看>>
智能硬件开发如何选择低功耗MCU?
查看>>
阿里感悟(十)如何写好简历
查看>>
阿里感悟(十一)如何准备面试
查看>>
软件架构入门
查看>>
80 多个 Linux 系统管理员必备的监控工具
查看>>