java的HashCode和equals
什么时候用到hashcode,什么时候用到equals?
首先java为每个对象都生成有默认的hashcode,这个java core里说是java对象的内存地址,但是equals方法里比较的也是对象的内存存储地址,感觉java不会这么设计。看到一篇博文,http://www.cnblogs.com/dolphin0520/p/3681042.html,文中讲hashcode是与对象内存地址有关的数字,javacore里将这个hashcode是返回对象的散列码,是任意的整数,包括正数和负数。
那么什么时候用到hashcode,什么时候用到equals?就是存储在set、map这类不允许有重复元素的结构中的对象中,对象本身必须覆盖hashcode、equals方法,这样才能保证插入的元素是唯一的。
hashcode是根据对象的成员生成的值,作为查找的索引,这样查找速度十分快,equals方法里比较的是对象的成员变量值是否相等,双覆盖机制来确保不会插入重复的对象,需要注意的是,如果需要修改对象的某些成员,那么这些成员不要参与到hashcode的计算中,否则将生成不同的hashcode覆盖掉原来的对象的,这样对象的引用将失效(指向的对象地址还是修改之前的),这个引用对象的remove、contains方法都将失效,这篇博文讲会造成内存泄露(http://blog.csdn.net/shixing_11/article/details/5652935),解决的办法就是不要让修改的变量参与到hashcode的计算中,这样就可以正常的删除和添加了
可以参考一下一下博文:
http://blog.csdn.net/veryitman/article/details/6894447(短)
http://blog.csdn.net/afgasdg/article/details/6889383(长,全)
java的HashCode和equals的更多相关文章
- java中hashcode()和equals()的详解
今天下午研究了半天hashcode()和equals()方法,终于有了一点点的明白,写下来与大家分享(zhaoxudong 2008.10.23晚21.36). 1. 首先equals()和hashc ...
- 【Java】hashcode()和equals()
大家知道,在集合中判断集合中的两个元素是否相同,依赖的是hashcode()和equals()两个方法. > 一个简单的实验 public class Teacher { private Int ...
- Java中hashcode,equals和==
hashcode方法返回该对象的哈希码值. hashCode()方法可以用来来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的位置,Map在搜索一个对象的时候先通过has ...
- java中hashcode和equals的区别和联系
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...
- java 中hashcode和equals 总结
一.概述 在Java中hashCode的实现总是伴随着equals,他们是紧密配合的,你要是自己设计了其中一个,就要设计另外一个.当然在多数情况下,这两个方法是不用我们考虑的,直 ...
- 【JAVA】hashcode() & equals()
平时使用map时都是用JAVA原生的类型,所以很少关注到hashcode()和equals()的方法的内部实现.近期实现一个小工具,涉及到自己写的类的查找比对,又再次重温了相关的知识. 上简单示例代码 ...
- java中 hashCode() 和 equals()
1. 值类型是存储在内存中的栈,而引用类型的变量在栈中仅仅是存储引用类型变量的地址来自堆,而其本身则存储在栈中. 2. ==操作比较的是两个变量的值是否相等, 3. 对于引用型变量表示的是两个变量在堆 ...
- 深入探究Java中hashCode()和equals()的关系
目录 一.基础:hashCode() 和 equals() 简介 equals() hashCode() 二. 漫谈:初识 hashCode() 与 equals() 之间的关系 三. 解密:深入理解 ...
- Java 重写hashCode()与equals()
为什么要重写hashCode() 和 equals() equals() 默认的Object类里面equals()方法是根据对象所在的内存来做判断的,如果两个对象引用指向的是同一个内存,则返回true ...
随机推荐
- SVN分支的创建,合并,与销毁和相关操作
test是分支和主干所在的文件夹,SVNTest是主干,所有的分支都放在branch里面,192.168.1.101是服务器的地址 创建分支: 把服务器中的主干复制出来到自己的分支上: svn cop ...
- FFmpeg的Android平台移植—编译篇
摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程. 环境准备: ubuntu-12.04.5 android-ndk64-r10-linux-x86_64. ...
- 单线驱动74hc595(转)
源:http://blog.chinaunix.net/uid-10701701-id-91938.html 这个电路是国外一个哥们2009年的时候发表的. http://www.romanblack ...
- 【转】Grub Rescue修复方法
症状: 开机显示: GRUB loading error:unknow filesystem grub rescue> 原因:已经发现下面几种操作会导致这种问题:1,想删除debian,于是直接 ...
- Block 再学习 !
如何优雅的使用 Block? How Do I Declare A Block in Objective-C? 阮一峰的一句话解释简洁明了:闭包就是能够读取其它函数内部变量的函数 详情:http:// ...
- FZU Problem 2150 Fire Game(bfs)
这个题真要好好说一下了,比赛的时候怎么过都过不了,压点总是出错(vis应该初始化为inf,但是我初始化成了-1....),wa了n次,后来想到完全可以避免这个问题,只要入队列的时候判断一下就行了. 由 ...
- android复习-AnsyTask
AnsyTask是一种类似Thread+Hander机制的处理耗时操作的类, 通过在UI线程中excute()启动操作, 在AnsyTask中 doInBackground()中处理耗时操作(运行在自 ...
- PAT (Advanced Level) 1061. Dating (20)
简单模拟. #include<stdio.h> #include<string.h> ],s2[],s3[],s4[]; ][]={"MON ", &quo ...
- Windows系统字体与文件对照表
源:Windows系统字体与文件对照表 宋体 (TrueType) = SIMSUN.TTF 黑体 (TrueType) = simhei.ttf 楷体_GB2312 (TrueType) = sim ...
- FIR滤波器的实现方法(转)
源:http://blog.sina.com.cn/s/blog_493520900102uy26.html 内容来自于上篇博文,第七章,FIR滤波器 http://blog.sina.com.cn/ ...