java基础学习(一)hashcode
- hashcode的作用
hashCode()方法是从Object类继承过来的,Object类中的hashCode()方法返回的是对象在内存中地址转换成的int值,如果对象没有重写hashCode()方法,任何对象的hashCode()方法的返回值都是不相等的。
重写方法:java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作散列值。
主要作用是用于查找的,为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable,hashCode是用来在散列存储结构中确定对象的存储地址的。
1 import java.util.HashSet; 2 import java.util.Set; 3 4 /** 5 * Created by nick on 2018/9/29. 6 */ 7 public class HashTest { 8 private int i; 9 public int getl(){ 10 return i; 11 } 12 public void setl(int i){ 13 this.i=i; 14 } 15 public boolean equals(Object object){ 16 if(object==null){ 17 return false; 18 } 19 if(object==this){ 20 return true; 21 } 22 if(!(object instanceof HashTest)) 23 return false; 24 HashTest other =(HashTest) object; 25 if(other.getl()==this.getl()){ 26 return true; 27 } 28 return false; 29 } 30 public int hashCode(){ 31 return i%10; 32 } 33 34 public static void main(String[] args) { 35 HashTest a=new HashTest(); 36 HashTest b=new HashTest(); 37 a.setl(1); 38 b.setl(1); 39 Set<HashTest> set= new HashSet<HashTest>(); 40 set.add(a); 41 set.add(b); 42 System.out.println(a.hashCode()==b.hashCode()); 43 System.out.println(a.equals(b)); 44 System.out.println(set); 45 } 46 }
View Code
结果:
false
true
[HashTest@677327b6, HashTest@1540e19d]
a的hashcode为1;b的hashcode是:1
如果不重写hashcode的结果:
false
true
[HashTest@677327b6, HashTest@1540e19d]
a的hashcode为356573597;b的hashcode是:1735600054
java对于equals()方法和hashCode()方法是这样规定的:
1.如果两个对象的equals()方法返回true,则hashCode()返回值相同。
2.如果2个对象的equals)()方法返回false,则hashCode()返回的值可能相同,也可能不相同。
3.如果2个对象的hashCode()方法返回值相同,则equals()返回的值可能为true,也可能为false。
4.如果2个对象的hashCode()方法返回值不同,则equals()返回的值为false
- 为什么重写equals方法一样要重写hashcode:
hashCode()和equals()保持一致,如果equals方法返回true,那么两个对象的hasCode()返回值必须一样。如果equals方法返回false,hashcode可以不一样,但是这样不利于哈希表的性能,一般我们也不要这样做。重写equals()方法就必须重写hashCode()方法的原因也就显而易见了。
假设两个对象,重写了其equals方法,其相等条件是属性相等,就返回true。如果不重写hashcode方法,其返回的依然是两个对象的内存地址值,必然不相等。这就出现了equals方法相等,但是hashcode不相等的情况。这不符合hashcode的规则。下边,会介绍在集合框架中,这种情况会导致的严重问题。
--------------------- 本文来自 冷面寒枪biu 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u013679744/article/details/57074669?utm_source=copy
转载于:https://www.cnblogs.com/nickup/p/9722432.html
java基础学习(一)hashcode相关推荐
- java基础学习-6
Java基础学习-6 双列集合 Map的常见API Map的遍历方式 HashMap 小练习 LinkedHashMap TreeMap TreeMap--小练习1 TreeMap--小练习2 Tre ...
- JAVA基础学习精简心得笔记整理
JAVA基础学习精简心得笔记整理 配置java环境变量 Java的运行过程 基本数据类型 引用数据类型 逻辑运算符 数组 方法重载 封装 继承 多态 多态的作用 单例设计模式 接口interface ...
- Java基础学习——第十六章 Java8新特性
Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...
- java基础学习整理(一)
java基础学习整理(一) lesson1: D0s命令: 1.回到根目录,>cd \ 2.复制命令行下的内容,右击标记所要复制的内容,这样就已经复制好了,右击粘贴就可以了. 3.查看,设置环境 ...
- 【Java基础学习笔记】- Day11 - 第四章 引用类型用法总结
Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 4.1 class作为成员变量 4.2 interface作为成 ...
- Java中大数据数组,Java基础学习笔记之数组详解
摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...
- java基础学安卓开发_Android开发学习路线之Java基础学习
原标题:Android开发学习路线之Java基础学习 很多Android学习开发者刚入手Android开发技术时,稍微有点迫切.任何的开发技术都有其基础语言,Android应用程序开发是以Java语言 ...
- Java基础学习:尚硅谷项目三 开发团队调度软件
Java基础学习:尚硅谷项目三 开发团队调度软件 一.软件功能与结构设计 1. 软件功能 该软件实现以下功能: 软件启动时,根据给定的数据创建公司部分成员列表(数组) 根据菜单提示,基于现有的公司成员 ...
- Java基础学习汇总
Java基础学习汇总 java语言基础 java函数和数组 java面向对象 java异常 整理用,早就停更... 写作不易,如果您觉得写的不错,欢迎给博主点赞.收藏.评论.收藏来一波~让博主更有动力 ...
- 尚学堂JAVA基础学习笔记_2/2
尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...
最新文章
- Java中几个常见的关键字
- 全球及中国蔬菜泥配料行业竞争策略及投资潜力研究报告2021-2027年版
- VC6、BC5、G2.9标准分配器一览
- Android Studio-------添加按钮
- OpenCV中基本数据结构(1)_Point
- [ActiveRecord] 之ActiveRecordMediator
- MP4视频播放器代码
- word自带公式编辑_原来有这样几种方式打开Word中的公式编辑器
- Ubuntu 实时显示网速
- 程序猿给娃取名的正确姿势
- opencv显示图片只显示部分(或认为图片太大)
- 程序员很少上《非诚勿扰》电视节目相亲之分析
- Prometheus入门使用(三)
- 国内外大数据可视化分析产品点评
- 湖南大学计算机考试题,湖南大学计算机组成原理期中考试题库
- 青龙面板+Ninja的企业微信通知设置以及企业微信群消息转到微信方法
- PHP—文件打开/读取
- .net SSO单点登录mvc
- Web:选择器的种类
- 基于微信小程序云开发(校园许愿墙app)妄想替代学校的表白墙