"==" equals和hashCode的联系和区别
写这篇文章的目的是自己彻底把三者搞清楚,也希望对你有所帮助。
1."=="运算符对与基本类型(int long float double boolean byte char short),比较的是他们的值。但是对于复合数据类型,比较的是他们的内存地址。
public class TestString {
public static void main(String[] args){
String s1="Hello";
String s2="Hello";
if(s1==s2){
System.out.println("s1==s2");
}else{
System.out.println("s1!=s2");
}
}
}
运行结果 s1==s2
public class TestString {
public static void main(String[] args){
String s1=new String("Hello");
String s2=new String("Hello");
if(s1==s2){
System.out.println("s1==s2");
}else{
System.out.println("s1!=s2");
}
}
}
运行结果 s1!=s2
分析:
当我们用String s1="Hello",再创建String s2="Hello"的时候,他会先去字符串缓冲池寻找相同的对象,因为我们之前创建了s1,s1被放在了字符串缓冲池中,
所以s2创建的时候,就找到了相同的值s1,s1和s2指向同一个对象。
当我们使用new的时候,就会新开辟一个内存地址,无论你怎么比较都不会相等的。
public class TestString {
public static void main(String[] args){
String s1="Hello";
String s2=new String("Hello");
if(s1==s2){
System.out.println("s1==s2");
}else{
System.out.println("s1!=s2");
}
}
}
所以这个比较结果返回的也是s1!=s2,因为当我们用String s1="Hello"的时候,这个时候字符串缓冲池存在值Hello,但是接下来String s2=newString("Hello");他会怎么办呢,他会先去字符串缓冲池去找,如果池子没有Hello,他会在字符串缓冲池创建一个字符串常量“Hello”,如果存在就不在字符串缓冲池中创建。然后会在堆中创建一个新的对象(无论字符串缓冲池有没有都会执行)。所以说两者内存地址不相等。
2.equals是Object基类中的一个方法,java中所有的类都是继承Object 这个基类的。这个方法初始也是比较两者的内存地址的,这是原始的Object中的equals方法源码
public boolean equals(Object obj) {
return (this == obj);
}
很明显的看到方法里面的==,说明比较的是内存地址。
但是有一些类中有自身的equals方法把原本的方法覆盖掉了,就不再是比较两者的内存地址了,而是比较的内容值,例如String中的equals源码
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
解释:如果是对象类型直接比较内存地址,如果是String类型逐一比较内容值。
public class TestString {
public static void main(String[] args){
String s1="Hello";
String s2=new String("Hello");
if(s1.equals(s2)){
System.out.println("s1==s2");
}else{
System.out.println("s1!=s2");
}
}
}
结果返回:s1==s2。
注意:那这样的代码又会返回什么结果呢?
public class TestString {
public static void main(String[] args){
String s1="Hello";
String s2=new String("Hello");
s2=s2.intern();
if(s1==s2){
System.out.println("s1==s2");
}else{
System.out.println("s1!=s2");
}
}
}
返回结果:s1==s2。为什么??答案:String#intern方法,这个方法是一个 native 的方法,“如果常量池中存在当前字符串, 就会直接返回当前字符串. 如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回”。
3.hashCode方法也是从Object类中继承过来的,它是用来鉴定两个对象是否相等,Object类中的的hashCode返回的是对象在内存中地址转换成的一串int数值,如果没有重写hashCode方法,任何对象的hashCode都不会相等的。恰恰String的hashcode重写了,你说气人不。如果两个对象equals相等,则hashCode必须相等,反之不成立。一般来说你重写了equals,也要重写HasCode。
"==" equals和hashCode的联系和区别的更多相关文章
- ==、equals()、hashcode()的关系和区别
==.equals().hashcode()概念 ==:它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不试同一个对象. equals():它的作用也是判断两个对象是否相等.但它一般有两种使 ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- equals()和hashCode()区别?
equals()和hashCode()区别? ------------------------------------------------- equals():反映的是对象或变量具体的值,即两个对 ...
- ==、equals、hashCode区别?
[==.equals().hashCode()区别?] 1)== 运算符用来比较两个变量的值是否相等. 即该运算符用于比较变量对应得内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是 ...
- Java == ,equals 和 hashcode 的区别和联系(阿里面试)
今天阿里的人问我 equals 与hashcode的区别,我答不上来, 仔细查了一下,做了总结: (1) == 这是Java 比较内存地址,就是内存中的对象: java中的==是比较两个对象在JVM中 ...
- 深入理解equals和hashCode关系和区别
为什么要说equals和hashCode这两个东西,一来是因为有不少小伙伴面试时被问过这个东西,二来则是因为如果了解了这两个东西的原理,那么实际的开发过程中,对效率和容错率上还是能帮上很大的忙! 直入 ...
- equals与hashCode的区别
equals与hashCode的区别 1.类中的equals方法是一定要重写/覆盖(Override)的,因为要让它按照设计的需求来根据特征值判断等价性. 这里的特征值,就是String类型的name ...
- 【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例
原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例 部分代码参考http ...
- java ==、equals、hashcode有什么区别
1.== 用来比较两个对象的存储空间 2.equals是Object类提供的方法之一,每个java类都继承Object类,所以每一个对象都具有equals方法,所以在没有覆盖equals方法的情况下, ...
随机推荐
- linux wheel组
wheel 组的概念 wheel 组的概念继承自 UNIX.当服务器需要进行一些日常系统管理员无法执行的高级维护时,往往就要用到 root 权限:而“wheel” 组就是一个包含这些特殊权限的用户池: ...
- elasticSearch6源码分析(11)client
1.RestClient /** * Client that connects to an Elasticsearch cluster through HTTP. * <p> * Must ...
- java中变量使用的总结
java中整数默认为int,小数默认为double. float n5=1.3; 这个句子就会报错,应该修改成这样float n5=1.3f; 八大基本类型 变量类型 位数 范围 备注 Byte 8位 ...
- 原本在滴滴只负责批100万元以上开支的Leslie决定,ofo所有30万元以上的开支都要由她亲自过目。那段时间,他“天天晚上12点才下班,眼睛都熬红了”
戴威即将28岁了,熟悉他的人更愿意用“孩子”来形容他. 这样的特质,在追随者眼中,是天真.纯粹.理想主义:在合作伙伴眼中,是倔强高傲.不可一世:在投资人眼中,则是任性狂妄,一味蒙眼狂奔.他像个无意间闯 ...
- C# serialPort的DataReceived事件无法触发 ,用的霍尼韦尔的扫码枪并且装了相应的USB转串口驱动。
昨天想试试霍尼韦尔的扫码枪,扫码枪有两种模式,键盘模式和串口模式, 1.键盘模式直接插上就行了,就像一个键盘一样不需要任何驱动,扫出来的数据直接落到PC的输入焦点上.就像一个键盘一样,只能输入字符. ...
- python-桥接模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 有些类在功能设计上要求,自身包含两个或两个以上变化的因素,即该类在二维或者多维上 ...
- 记一次MySQL安装出现的坑爹问题。。。
关键词:mysql安装 msvcr100.dll缺失 vc++2010 : win10系统首次安装mysql,图方便下载了图形界面的安装包(5.6.4),本以为小事一桩:装一半失败.卸载清注册表.重 ...
- cf250D. The Child and Sequence(线段树 均摊复杂度)
题意 题目链接 单点修改,区间mod,区间和 Sol 如果x > mod ,那么 x % mod < x / 2 证明: 即得易见平凡, 仿照上例显然, 留作习题答案略, 读者自证不难. ...
- Hystrix 框架
雪崩效应的产生原因:当一个服务突然受到高并发的请求,tomcat服务器承受不了的情况下会产生服务堆积,可能导致其他的服务也不可用. 服务保护:当服务产生堆积的时候,对服务实现保护功能. 服务隔离:每个 ...
- 图像矫正-基于opencv实现
一.引言 上篇文章中四种方法对图像进行倾角矫正都非常有效.Hough变换和Radon相似,其抗干扰能力比较强,但是运算量大,程序执行慢,其改进方法为:我们可以不对整幅图像进行操作,可以在图像中选取一块 ...