黑马程序员------- "==",equals和hashcode
来源:互联网 发布:java群ping 编辑:程序博客网 时间:2024/06/06 15:04
在java中,可以通过==和equals()来比较变量和对象是否相同,那么他们都哪些区别呢
首先是变量
int x = 1;int y = 1;System.out.println(x==y); //返回trueSystem.out.println(x.equals(y)); //编译无法通过
打开java源码查看equals()方法发现,只有两边都是一个Object的实例才可以进行比较,所以八种基础类型只能通过"=="来比较,转换成对应的包装类型后就可以进行比较。示例:
Integer x = new Integer(1);Integer y = 1;Integer z = 1;System.out.println(x.hashCode());//返回值为1System.out.println(y.hashCode()); //返回值为1System.out.println(x==y); //他们引用的不是一个对象,返回falseSystem.out.println(x.equals(y));//hash值相同,返回trueSystem.out.println(z==y);//指向同一内存地址,返回true
尽管三个Integer实例都是1,但是x并非直接引用,而是new了一个新实例,所以使用"=="为false,那么为什么equals()返回true呢?查看Integer源码发现Integer的equals是通过转换成int再"=="的方法。
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
再重新给他们赋值,发现了有趣的现象
int x = 200;int y = 200;Integer i=200; Integer j=200; System.out.println(x==y); //trueSystem.out.println(i==j); //false System.out.println(i.equals(j)); //true
i和j虽然都是200,但他们的200却是不同的对象,因为Integer 对-128~127做了类似缓存的处理,这个范围内的值可以认为都是从一个池里面取出来的。不在这个范围的可以认为他new了一个新的对象,地址不同。
"=="是通过内存中地址判断是否相等,就联想到hashCode()。
hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。因此,两个同类对象相等,他们的hashCode肯定是相同。但是hashCode相同,却不一定是相同的对象。我们在给一个类定义equals方法时,很有必要重写他的hashCode方法。
在hashSet和hashMap中,则一定要重写hashCode方法,不然会出现元素重复。
class Demo{private int x;Demo(int x){this.x = x ;}public static void main (String []args) {Demo d1 = new Demo(3);Demo d2 = new Demo(3);System.out.println(d1.hashCode());System.out.println(d2.hashCode());}}
"=="则是对比两个变量或者对象的引用是否相同。
equals()是java.lang.Object类的方法,在Object中,equals()直接调用了"==",返回true或false。子类可以通过重写来重新定义比较方法,通过字符数字等其余数学判断是否相同。
hashCode()和equals虽然没有必然的关系,但是他们在判断对象是否相同,可以互相参考。
- 黑马程序员------- "==",equals和hashcode
- equals 和 ==, equals 和 hashcode
- HashCode,equals 和 ==
- HashCode,equals 和 ==
- ==、equals和hashCode
- equals , hashcode() 和 ==
- hashcode、equals和==
- ==,equals()和hashCode()
- 黑马程序员--关于equals和“==”
- 黑马程序员-hashcode与equals的作用
- 黑马程序员——HashCode与equals
- 浅析hashcode和equals和“==”
- ==和equals扩展-->重写equals()和hashcode()
- equals 和 hashcode 区别 ==和equals
- Java中 hashcode 和 equals、equals和==
- java ==和equals、equals和hashCode的区别
- java中的==、equals和hashCode以及hashCode生成
- java中的==、equals和hashCode以及hashCode生成
- Python学习笔记——Python开发中的文件操作
- 【MongoDB】探讨《MongoDB权威指南》书籍中的几点错误
- Xilinx Zynq器件要点(1)
- HDOJ 题目1258 Sum It Up(DFS)
- 不经意间
- 黑马程序员------- "==",equals和hashcode
- 《C++ Prime Plus 第八章》——内联函数
- QtQuick使用百度翻译api
- SqlServer系统数据库还原(二)系统数据库master-msdb-model 重建模拟测试
- NYOJ 833 取石子(七)【博弈】
- usb驱动程序分析
- Hive自定义函数UDAF开发
- struts2中分页简单实现
- 拆行自己写的