hashCode的作用是为了提高查找效率,new出来的对象被放到hash表中,提取对象的时候就会根据hashCode去表中提取,这样提高了提取对象的效率。
具体过程是这样:
1.new Object(),JVM根据这个对象的Hashcode值,放入到对应的Hash表对应的Key上,如果不同的对象确产生了相同的hash值,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。
2.比较两个对象的时候,首先根据他们的hashcode去hash表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在Hash表中的同一个key上,那么他们一定在这个key上的链表上。那么此时就只能根据Object的equal方法来比较这个对象是否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核心知识总结-笔记】 JavaSE高级部分的讲解涵盖了重要的String类、集合以及IO流。String类在Java中扮演着至关重要的角色,因为它是最常用的数据类型之一,用于存储和处理文本信息。以下是对String类的详细...
### Java面试知识点总结 #### 1. Java中的原始数据类型及其封装类 Java中的原始数据类型包括8种:`boolean`、`byte`、`short`、`int`、`long`、`float`、`double` 和 `char`。每种数据类型都有其固定的大小,并且...
在Java编程语言中,集合框架是处理对象集合的重要工具,主要包括了List、Set、Map以及Table等接口及其实现类。这些接口和类各有特点,适用于不同的数据存储和操作场景。 1. **List接口**: - List是Collection的一...
Java 面试知识点总结 Java 中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? Java 中的原始数据类型包括 boolean、byte、short、int、long、float、double、char 八种,分别对应的封装类是 Boolean、...
根据提供的文件信息,我们可以整理出一系列关于Java的重要知识点,这些知识点涵盖了Java基础知识、容器管理、多线程处理、反射机制、对象拷贝以及Java Web开发等几个方面。 ### Java基础知识 1. **JDK和JRE的区别*...
相同的对象应返回相同的哈希码,不同的对象返回不同的概率较高,以提高查找效率。 6. **`ArrayList`, `LinkedList`, `Vector`的区别** - `ArrayList`:基于数组实现,随机访问快,插入和删除慢,线程不安全。 - `...
### Java知识点总结:集合框架详解 #### 一、概述 Java集合框架是Java标准库的重要组成部分,它提供了一系列用于管理对象的容器类。这些容器类的设计遵循一定的原则,旨在提高程序的可读性和效率。 #### 二、设计...
Java集合定义与用法实例总结【Set、List与Map】 Java集合是Java语言中的一种数据结构,主要用于存储和操作数据。Java集合可以分为三大类:Set、List和Map。这些集合都继承了基类接口Collection,Collection接口定义...
最后,Object类是所有Java类的父类,它定义了一些基础方法,如clone()用于复制对象,equals()用于对象的相等性比较,hashCode()生成对象的哈希值,toString()返回对象的字符串表示,notify()和notifyAll()用于多线程...
两个对象即使hashCode()相同,equals()也不一定为true,它们可能在散列存储结构中存在同一个key值下。然而,若两个对象equals()相等,那么它们的hashCode()一定相等,因此在重写equals()方法时,通常也需要重写...
如果两个对象在逻辑上相等,它们的`equals()`方法应该返回`true`,并且相等的对象应具有相同的`hashCode()`值,以确保在哈希表中正确地进行查找和存储。 例如,`BasicContainer`类中的`Name`类没有重写`equals()`和...
Hibernate 5.0 用户手册中文版本知识点总结 Hibernate 是一个基于 Java 的关系型持久层框架,它提供了一个高效、灵活的解决方案来存储和检索数据。本手册是 Hibernate 5.0 的中文版本,旨在帮助开发者快速掌握 ...
- 在自定义对象的类中重写equals和hashCode方法是正确使用Set集合的关键。 - 迭代器是一种设计模式,用于遍历集合中的元素而不暴露其内部表示。 - Java集合框架为开发者提供了丰富的数据结构和操作集合的API。 以上...
Answer: 序列化是将对象转换为字节流的过程,以便于对象的存储或传输。 对象拷贝 1. 为什么要使用克隆? Answer: 克隆可以创建对象的副本,以便于对象的复制和传输。 2. 如何实现对象克隆? Answer: 可以通过实现...
以下是对这些知识点的详细说明: 1. **面向对象**:面向对象编程(Object-Oriented Programming,OOP)是一种将现实世界中的实体抽象成类和对象的编程范式。与面向过程编程相比,它更注重模块化和封装。面向对象有...
- `hashcode`与`(length - 1)`进行按位与运算的结果为`001`。 - 通过让`hashcode`的低位与高位进行异或操作,可以使低位更加随机,从而提高索引的分散性。 ### 总结 通过上述分析可以看出,`HashMap`的设计非常...
【Java回顾(六)Set...总结:Set集合在Java编程中扮演着重要角色,尤其适用于存储无序且不重复的数据。了解和掌握HashSet、LinkedHashSet和TreeSet等子类的特性和用法,有助于我们更好地利用Set集合来解决实际问题。