java ==、equals和hashCode的区别和联系

基础类型

4种整数类型:int、long、byte、short

2种浮点数类型:float、double

1种字符类型:char

1种布尔类型:boolean

引用数据类型

接口

数组

1. ==

1.对于基本类型来说

==比较的是值是否相等

例如:



int a = 1;    int b = 1;System.out.println(a == b); true
double a = 1;double b = 1;System.out.println(a == b); true
int a = 1;int b = 2;System.out.println(a == b);  false
double a = 1;double b = 2;System.out.println(a == b);  false

2.对于引用类型来说

== 比较的是两者在内存中存放的地址(堆内存地址)

获取地址可用:

System.identityHashCode(Object obj)
一个对象的identityHashCode能够始终和该对象的内部地址有一个相对应的关系,从这个角度来讲,它可以用于代表对象的引用地址

以下装箱不懂的可以看java装箱和拆箱内容,看完以后就会懂下面都意思。
Integer a = 1;Integer b = 1;System.out.println(System.identityHashCode(a)); == 22756955System.out.println(System.identityHashCode(b)); == 22756955System.out.println(a == b); true

a,b会自动装箱,执行了valueOf函数,它们的值在(-128,128]这个范围内 它们引用到了同一个Integer对象,所以它们肯定是相等的
Integer a = 200;Integer b = 200;System.out.println(System.identityHashCode(a));  == 22756955System.out.println(System.identityHashCode(b));  == 1640639994System.out.println(a == b); false
它们的值大于128,所以会执行new Integer(200),也就是说它们会分别创建两个不同的对象,所以它们肯定不等
Double a = 1.0;Double b = 1.0;System.out.println(System.identityHashCode(a));  == 22756955System.out.println(System.identityHashCode(b));  == 1640639994System.out.println(a == b); false

对于Double类型来说,我们就不能这样做,因为它在这个范围内个数是无限的

Boolean a = true;Boolean b = true;System.out.println(System.identityHashCode(a));  == 22756955System.out.println(System.identityHashCode(b));  == 22756955System.out.println(a == b); true

可以看到返回的都是true,也就是它们执行valueOf返回的都是相同的对象。并没有创建对象,因为在内部已经提前创建好两个对象,因为它只有两种情况,这样也是为了避免重复创建太多的对象
Integer a = 400;int b = 400;System.out.println(System.identityHashCode(a)); == 22756955System.out.println(System.identityHashCode(b)); == 1640639994System.out.println(a == b); true

是不是很神奇,地址不一样都相等,其实这是a进行了拆箱a进行拆箱返回int,然后就是int和int进行比较,所以返回true

关于String,这是个特殊的引用类型以下讲解
String a = "1";String b = "1";System.out.println(System.identityHashCode(a)); == 22756955System.out.println(System.identityHashCode(b)); == 22756955System.out.println(a == b); true 

引用同一个 String 对象
字符串缓冲池

String s1 = "Monday";String s2 = new String("Monday");

s1 != s2s1 equals s2

原来,程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1将s2引用s1所引用的对象"Monday"第二段程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"Monday"Sting对象被创建在内存中。他们的值相同,但是位置不同,

2.equals

所有类都是继承于Object这个超类的,有一个equals()方法

这个方法很简单,就是比较对象的内存地址的。所以对象没有重写这个方法时,默认使用此方法,即比较对象的内存地址值。

下面来看下String类重写的方法:

可以看出,String的equals()方法仅仅是对比它的 数据值,而不是对象的内存地址,所以不管String对象的内存地址是否相同并不影响其结果,equals()比较的仅仅是数据值。

不只是String重写来equals,Double,Integer,Long....都重写了(去看源代码),所以都是比较数据值

Integer a = 1;Integer b = 1;System.out.println(System.identityHashCode(a));System.out.println(System.identityHashCode(b));System.out.println(a.equals(b));  true

总结

equals()和==的区别:

==

基本类型:对比它们的值是否相等

引用类型:对比它们的内存地址是否相等

equals()

引用类型:默认情况下,对比它们的地址是否相等;前提是要类型都相同,如果equals()方法被重写,则根据重写过程来比较



原文地址:https://www.cnblogs.com/zjtao/p/12147358.html

时间: 2024-10-14 09:50:27

java ==、equals和hashCode的区别和联系的相关文章

Java == ,equals 和 hashcode 的区别和联系

1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: public class ComAddr{ public static void main(String[] args) throws Exception { String s1 = "nihao"; String s2 = "nihao"; String s3 = new String("nihao"); System.out.println(s1 ==

Java中==和equals的区别,equals和hashCode的区别

在java中: ==是运算符,用于比较两个变量是否相等. equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样.Object的equals方法如下: public boolean equals(Object obj) { return (this == obj); } hashCode也是Object类的一个方法.返回一个离散的int型整数.在集合类操作中使用,为了提高查询速度.(HashMap,HashSet等

[转]Java中==和equals的区别,equals和hashCode的区别

在java中: ==是运算符,用于比较两个变量是否相等. equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样.Object的equals方法如下: [java] view plain copy public boolean equals(Object obj) { return (this == obj); } hashCode也是Object类的一个方法.返回一个离散的int型整数.在集合类操作中使用,为了提

Java 中的 ==, equals 与 hashCode 的区别与联系

一.概述 1.概念 == : 该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系 equals : Object 的 实例方法,比较两个对象的content是否相同 hashCode : Object 的 native方法 , 获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实际上是一个int型整数 二.关系操作符 == 1.操作数的值 基本数据类型变量 在Java中有八种基本数据类型: 浮点型:float(4 byte), double(8 byte) 整型:byt

【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象的内容(内容可以有很多,比如同时比较姓名和年龄,同时相同的才是用一个对象)是否相同 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址

Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象的内容(内容可以有很多,比如同时比较姓名和年龄,同时相同的才是用一个对象)是否相同 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等.特别指出利用equals比较八大包装对象(如int,float等)和String类(因为该

Java中equals和hashcode的区别?

Java中equals和hashcode方法是在Object对象中的,所以每个对象都有这两个方法,大多数时候我们为了实现特定需求需要重写这两个方法 equals和hashcode方法常用在同一个类中用于比较,尤其是在set集合中比较元素是否重复 equals方法返回true的两个对象,hashcode一定相同 hashcode相同的两个对象,equals方法不一定返回true 原文地址:https://www.cnblogs.com/qf123/p/8671141.html

java中==和equals和hashcode的区别详解

一.相同点 都是用来进行值或对象的比较. 二.不同点 对于“==”而言,对于基本类型(char,byte,short,int,long,float,double,boolean),对比的是值,所以是相等的,对于引用对象,对比的是引用的对象的堆地址,例如: public class Main { public static void main(String[] args) throws InterruptedException { Object obj1 = new Object(); Objec

java :equals()和hashcode()方法的结合使用

哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程序设计语言来说,基本上都会涉及到h

java equals()和hashCode()重写总结

在实际开发中有时候会遇到需要比较同一个类的不同实例对象的场景,一般情况下继承自Object父类的equals()和hashCode()可以满足需求,但却不能满足所有的场景,比如只需要使用少数几个对象属性来判断比较是否是同一个对象,这时我们就需要自定义的equals()和hashCode()实现来进行重写覆盖Object中的方法. 1. equals()方法重写注意事项 a. 自反性:对于任意的引用值x,x.equals(x)一定为true. b. 对称性:对于任意的引用值x 和 y,当x.equ