`
jiangzezhou1989
  • 浏览: 3083 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
文章分类
社区版块
存档分类
最新评论

HashCode知识总结(以set存储对象为例进行说明)

阅读更多

hashCode的作用是为了提高查找效率,new出来的对象被放到hash表中,提取对象的时候就会根据hashCode去表中提取,这样提高了提取对象的效率。

具体过程是这样:

1.new Object(),JVM根据这个对象的Hashcode,放入到对应的Hash表对应的Key,如果不同的对象确产生了相同的hash,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。

2.比较两个对象的时候,首先根据他们的hashcodehash表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在Hash表中的同一个key,那么他们一定在这个key上的链表上。那么此时就只能根据Objectequal方法来比较这个对象是否equal。当两个对象的hashcode不同的话,肯定他们不能equal.

下面我通过set存取对象对hashCode进行说明。

1. Set存储对象的规则是无序不重复。

2. 下面我通过代码来说明hashCode的使用


calss TestHashCode{

public static void main(String[] args){

Code c1= new Code(1);

Code c2= new Code(2);

Set set = new HashSet();

set.add(c1 set.add(c2);

set.add(c1);

set.add(c System.out.println("now is"+set.size());

c2.i=1;

//因为重写了equals方法所以这里为true

System.out.println(c1.equals(c2));

/*set集合添加元素时会根据元素的hashcode生成散列表,散列表一 旦生成就不会再改变,并且set会通过元素的hashcode到散列表中查找元素,所以此时根据c2的hashCode找到的是c1,然后用c2.equals(c1)判断是否为同一对象,由于我们改写了equals方法导致c1 和c2为同一对象,此时set将c1移除,size变为1,如果将Code Class中的equals方法注释,根据hashCode找到c1发现c2,c1不为同一对象,此时set.remove(c2)将找不到移除的元素,不能移除,size仍为2*/

set.remove(c2);

System.out.println("now is"+set.size());

}

}


class Code{

int i;

public Code(int i){

this.i = i;

}

@Override

public boolean equals(Object o){

if(!(o instanceof Code))

return false;

return ((Code)o).i==this.i;

}

@Override

public int hashCode(){

return i;

}

}


总结:hash表中在放置元素时,先通过hashCode决定存贮的位置,如果hashCode不同,不管对象是否equals就放置在不同位置,如果hashCode相等,对象不equals,就在该位置产生链表,将两个对象都存贮,如果hashCode和equals都相等,则保留旧对象,新对象不再存贮。所以set中可以存在hash码不同的相同(equals)对象。当然,hashCode方法的常规协定声明相等对象必须具有相等的哈希码(尽管很多时候不是这样),如果那样就set中同一个对象就只能存一个。

部分引用来自(该博文对hashCode有更详细的描述):

http://blog.csdn.net/chinayuan/archive/2008/11/21/3345559.aspx

分享到:
评论

相关推荐

    Java核心知识总结-笔记

    【Java核心知识总结-笔记】 JavaSE高级部分的讲解涵盖了重要的String类、集合以及IO流。String类在Java中扮演着至关重要的角色,因为它是最常用的数据类型之一,用于存储和处理文本信息。以下是对String类的详细...

    java面试知识点总结

    ### Java面试知识点总结 #### 1. Java中的原始数据类型及其封装类 Java中的原始数据类型包括8种:`boolean`、`byte`、`short`、`int`、`long`、`float`、`double` 和 `char`。每种数据类型都有其固定的大小,并且...

    java 中 set map table list 的总结.pdf

    在Java编程语言中,集合框架是处理对象集合的重要工具,主要包括了List、Set、Map以及Table等接口及其实现类。这些接口和类各有特点,适用于不同的数据存储和操作场景。 1. **List接口**: - List是Collection的一...

    Java 面试知识点总结.pdf

    Java 面试知识点总结 Java 中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? Java 中的原始数据类型包括 boolean、byte、short、int、long、float、double、char 八种,分别对应的封装类是 Boolean、...

    MS知识点总结.txt

    根据提供的文件信息,我们可以整理出一系列关于Java的重要知识点,这些知识点涵盖了Java基础知识、容器管理、多线程处理、反射机制、对象拷贝以及Java Web开发等几个方面。 ### Java基础知识 1. **JDK和JRE的区别*...

    Java面试知识点总结,2022最新

    相同的对象应返回相同的哈希码,不同的对象返回不同的概率较高,以提高查找效率。 6. **`ArrayList`, `LinkedList`, `Vector`的区别** - `ArrayList`:基于数组实现,随机访问快,插入和删除慢,线程不安全。 - `...

    java知识点总结

    ### Java知识点总结:集合框架详解 #### 一、概述 Java集合框架是Java标准库的重要组成部分,它提供了一系列用于管理对象的容器类。这些容器类的设计遵循一定的原则,旨在提高程序的可读性和效率。 #### 二、设计...

    Java集合定义与用法实例总结【Set、List与Map】

    Java集合定义与用法实例总结【Set、List与Map】 Java集合是Java语言中的一种数据结构,主要用于存储和操作数据。Java集合可以分为三大类:Set、List和Map。这些集合都继承了基类接口Collection,Collection接口定义...

    Java 2023最新面试知识点总结.pdf

    最后,Object类是所有Java类的父类,它定义了一些基础方法,如clone()用于复制对象,equals()用于对象的相等性比较,hashCode()生成对象的哈希值,toString()返回对象的字符串表示,notify()和notifyAll()用于多线程...

    2021 - JAVA秋招基础知识点面试题

    两个对象即使hashCode()相同,equals()也不一定为true,它们可能在散列存储结构中存在同一个key值下。然而,若两个对象equals()相等,那么它们的hashCode()一定相等,因此在重写equals()方法时,通常也需要重写...

    Java容器学习要点1136

    如果两个对象在逻辑上相等,它们的`equals()`方法应该返回`true`,并且相等的对象应具有相同的`hashCode()`值,以确保在哈希表中正确地进行查找和存储。 例如,`BasicContainer`类中的`Name`类没有重写`equals()`和...

    Hibernate5.0用户手册中文版本

    Hibernate 5.0 用户手册中文版本知识点总结 Hibernate 是一个基于 Java 的关系型持久层框架,它提供了一个高效、灵活的解决方案来存储和检索数据。本手册是 Hibernate 5.0 的中文版本,旨在帮助开发者快速掌握 ...

    个人JavaSE学习笔记(观看圣思园的视频总结下来的)

    - 在自定义对象的类中重写equals和hashCode方法是正确使用Set集合的关键。 - 迭代器是一种设计模式,用于遍历集合中的元素而不暴露其内部表示。 - Java集合框架为开发者提供了丰富的数据结构和操作集合的API。 以上...

    Java面试题,常见面试题及答案汇总.docx

    Answer: 序列化是将对象转换为字节流的过程,以便于对象的存储或传输。 对象拷贝 1. 为什么要使用克隆? Answer: 克隆可以创建对象的副本,以便于对象的复制和传输。 2. 如何实现对象克隆? Answer: 可以通过实现...

    Java基础的面试题总结

    以下是对这些知识点的详细说明: 1. **面向对象**:面向对象编程(Object-Oriented Programming,OOP)是一种将现实世界中的实体抽象成类和对象的编程范式。与面向过程编程相比,它更注重模块化和封装。面向对象有...

    B站河北王校长-集合-深度核心面试知识汇总.pdf

    - `hashcode`与`(length - 1)`进行按位与运算的结果为`001`。 - 通过让`hashcode`的低位与高位进行异或操作,可以使低位更加随机,从而提高索引的分散性。 ### 总结 通过上述分析可以看出,`HashMap`的设计非常...

    Java回顾(六)Set集合

    【Java回顾(六)Set...总结:Set集合在Java编程中扮演着重要角色,尤其适用于存储无序且不重复的数据。了解和掌握HashSet、LinkedHashSet和TreeSet等子类的特性和用法,有助于我们更好地利用Set集合来解决实际问题。

Global site tag (gtag.js) - Google Analytics