「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
双等号(==)
双等号比较的两种情况
对于==号只需要考虑两种情况:
- 基本数据类型使用==,比较的是值
- 引用数据类型使用==,比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
源码和例子解析
Integer和Integer,Integer和int之间的比较
1 | vbnet复制代码 Integer a1=new Integer(4321); |
Java自动装箱拆箱机制的类型
String中==的解析
1 | ini复制代码 String s1="12345"; |
equals
用法概述
equals没有被重写就是比较地址,相当于===
原因:
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
equals源码
显然java源码对String类进行了特殊处理,String的equals以及不是比较地址值了,而是比较字符串的内容了。
- 首先两个对象在堆里面,地址值就不可能相等,所以要比较两个对象内容而不是地址时,必然要重写equals方法,比较内容
- hashCode默认情况下表示是对象的存储地址,如果两个东西相同,那么作为HashMap的key时应该是一样的,所以既然相等的规则变化了,自然要重写hashcode方法,跟随变化!
HashSet的equals
HashSet本身就重写了equals!
1 | ini复制代码 HashSet<Integer> set1=new HashSet(); |
而且比较有意义的是
HashSet底层实现是通过HashMap实现的
数组的equals
Array的equals用的是原生的
1 | ini复制代码 Integer[] array1={1,2,3}; |
但是java.util.Arrays为我们提供了hashCode和euqals,比较的是数组中的内部元素。
ps启发:
我们也可以学习这种方式
可以在不重写的方法下写一个通用类其中的方法进行计算hashcode和equals!
JAVA中重写equals()方法为什么要重写hashcode()方法
为什么重载hashCode方法?
答案:一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会 重载hashCode,那么为什么要重载hashCode呢?就HashMap来说,好比HashMap就是一个大内存块,里面有很多小内存块,小内存块 里面是一系列的对象,可以利用hashCode来查找小内存块hashCode%size(小内存块数量),所以当equal相等时,hashCode必 须相等,而且如果是object对象,必须重载hashCode和equal方法。
例如我们有对象A和对象B,现在重写了equals方法,让两者相等了,那我们用散列表HashSet存储了对象A,然后用set.contains(B),是查不到B存在的!
对象重写equlas和hashcode实例
1 | kotlin复制代码package com.company; |
outPut
1 | vbnet复制代码false |
Ps: 如果要用equal方法,请用object<不可能为空>.equal(object<可能为空>))"target".equals(foo)
本文转载自: 掘金