`

简单回顾Java基本概念

阅读更多

暂时这样理解,希望大家指出我的错误

1.hashcode and equals:

equals如果用来判断两个对象的内容是否相同,需要重写,因为equals() 默认是比较两个对象的引用。

hashCode() 是用来产生哈希玛的,而哈希玛是用来在散列存储结构中确定对象的存储地址的,象util包中的 带 hash 的集合类都是用这种存储结构 :HashMap,HashSet, 他们在将对象存储时(严格说是对象引用),需要确定他们的地址吧,而HashCode()就是这个用途的,一般都需要重新定义它的,因为默认情况下,由 Object 类定义的 hashCode 方法会针对不同的对象返回不同的整数,这一般是通过将该对象的内部地址转换成一个整数来实现的,现在举个例子来说, 就拿HashSet来说,在将对象存入其中时,通过被存入对象的 hashCode() 来确定对象在 HashSet 中的存储地址,通过equals()来确定存入的对象是否重复,hashCode() ,equals()都需要自己重新定义,因为hashCode()默认前面已经说啦,而equals() 默认是比较的对象引用,你现在想一下,如果你不定义equals()的话,那么同一个类产生的两个内容完全相同的对象都可以存入Set,因为他们是通过 equals()来确定的,这样就使得HashSet 失去了他的意义。

看一下下面这个:


public class Test {
public static void main(String[] args) {
HashSet set = new HashSet();
for (int i = 0; i <= 3; i++){
set.add(new Demo1(i,i));
}
System.out.println(set);
set.add(new Demo1(1,1));
System.out.println(set);
System.out.println(set.contains(new Demo1(0,0)));
System.out.println(set.add(new Demo1(1,1)));
System.out.println(set.add(new Demo1(4,4)));
System.out.println(set);
}

private static class Demo1 {
private int value;

private int id;

public Demo1(int value,int id) {
this.value = value;
this.id=id;
}

public String toString() {
return " value = " + value;
}

public boolean equals(Object o) {
Demo1 a = (Demo1) o;
return (a.value == value) ? true : false;
}

public int hashCode() {
return id;
}
}
}

结果:
[ value = 2, value = 1, value = 3, value = 0]
[ value = 2, value = 1, value = 3, value = 0]
true
false
true
[ value = 2, value = 4, value = 1, value = 3, value = 0]

注释掉hashCode()
[ value = 1, value = 0, value = 2, value = 3]
[ value = 1, value = 0, value = 1, value = 2, value = 3]
false
true
true
[ value = 1, value = 0, value = 1, value = 2, value = 3, value = 4, value = 1]

注释掉equals()
[ value = 2, value = 1, value = 3, value = 0]
[ value = 2, value = 1, value = 1, value = 3, value = 0]
false
true
true
[ value = 2, value = 4, value = 1, value = 1, value = 1, value = 3, value = 0]

总结
hashCode() 方法使用来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的桶里面,Map在搜索一个对象的时候先通过 hashCode()找到相应的桶,然后再根据equals()方法找到相应的对象.要正确的实现Map里面查找元素必须满足一下两个条件:
(1)当obj1.equals(obj2)为true时obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时obj.equals(obj2)必须为false

Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。
那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。
但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。
也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。
哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。我们可以认为hashCode方法返回的就是对象存储的物理地址(实际可能并不是,例如:通过获取对象的物理地址然后除以8再求余,余数几是计算得到的散列值,我们就认为返回一个不是物理地址的数值,而是一个可以映射到物理地址的值)。
这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/badboy_blue/archive/2009/01/06/3720509.aspx

分享到:
评论

相关推荐

    JAVA,简单介绍

    根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### Java语言简介 Java 是一种广泛使用的高级...这些知识点涵盖了 Java 编程的基础概念和常用控制结构,有助于初学者快速掌握 Java 语言的基本使用方法。

    Java基础知识回顾共2页.pdf.zip

    Java的基础知识是每个Java程序员都需要掌握的,无论你是初学者还是有经验的开发者,对这些基本概念的理解都是至关重要的。 标题"Java基础知识回顾共2页.pdf.zip"表明这是一个关于Java基础知识的简短总结,可能涵盖...

    java2实用教程

    1.6 一个简单的JAVA小应用程序JAVAAPPLET:介绍了Applet的基础知识,这是一种可以嵌入到网页中的Java小程序。 1.7 什么是JSP:简单介绍了Java Server Pages(JSP),一种用于开发动态Web应用的技术。 第二章:...

    Java语言实用教程

    - **程序设计语言**:介绍程序设计语言的基本概念及其分类。 - **算法**:阐述算法的重要性,以及如何设计合理的算法来解决问题。 - **程序设计方法**: - **结构化程序设计**:介绍结构化程序设计的基本思想和...

    java开发实战经典习题答案

    - 涉及Java面向对象编程(OOP)的基本概念,如类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)、多态(Polymorphism)。 - 编程题目可能会要求设计类,实现继承和接口等。 4. 异常的...

    java tcp实现简单实例

    ### Java TCP 实现简单实例详解 #### 一、引言 ...这种模式非常适合于构建小型的应用程序或学习网络编程的基本概念。在未来的学习和开发过程中,可以根据具体需求进一步扩展和完善这些基础示例。

    Think Java.zip

    这本《Think Java》不仅适合初学者,也适合有一定经验的开发者回顾基础,提升对Java的理解。通过阅读这本书,读者可以全面掌握Java编程,并具备解决实际问题的能力。无论是在PC、手机还是Kindle上阅读,都能获得良好...

    Java WebService 简单实例 方式一(生成类文件方式)

    ### Java WebService 简单实例 方式一(生成类文件方式) #### 一、概述 在本篇文章中,我们将详细介绍如何通过生成类文件的方式来...希望本文能够帮助读者更好地理解和掌握 Java WebService 的基本概念与开发流程。

    Java-PPT.zip_PPT java_java.ppt

    "Java课件"中的Word文档可能包含了PPT内容的精炼版,便于读者快速回顾和查找关键知识点,也可能包含了一些练习题和解题思路,帮助巩固学习效果。 【实例程序】 学习编程的过程中,实践是至关重要的。压缩包中可能...

    JAVA经典练习题

    6. **多线程**:理解线程的基本概念,创建和管理线程,同步机制如synchronized关键字,wait()、notify()方法的应用。 7. **设计模式**:可能会涉及到一些常见的设计模式,如工厂模式、单例模式、观察者模式等。 8....

    JAVA白皮书(英文版)

    - **集成的线程同步**:阐述Java中线程同步的基本概念和技术。 ##### 2.2 从C和C++中移除的特性 - **不再使用typedefs、defines或预处理器**:移除了这些特性以简化语法。 - **不再使用结构体或联合**:避免使用...

    SUN Java 考试大纲

    - **I/O基础**:回顾输入输出流的基本概念。 - **字节流、字符流和节点流介绍**:介绍不同类型的流,如`InputStream`、`OutputStream`、`Reader`、`Writer`等。 - **URL输入流**:解释如何使用`URL`类和`...

    Java实验指导书 2009

    - 理解Java的基本语法结构,包括类、方法、包的概念。 **机器狂人:** - 学习如何使用命令行工具javac和java进行Java程序的编译和运行。 - 掌握如何编写第一个Java程序“Hello World”。 **高手之路:** - 探讨...

    Teach.yourself.JAVA.in.21Days

    - **第1-7天**:介绍Java的基本概念、环境搭建、语法基础等内容。这一阶段的目标是让读者能够写出简单的Java程序。 - Java的历史和发展。 - Java开发环境的搭建。 - 变量、数据类型、控制流等基础知识。 - 类和...

    我的第一个Java程序

    学习Java时,理解这些基本概念至关重要,包括类、对象、变量、数据类型、控制结构(如条件语句和循环)、方法等。同时,掌握如何使用开发工具,如IDE,设置环境变量,以及使用命令行工具进行编译和运行,也是新手...

    黑马程序员java基础试题、笔记

    首先,面试问题合集和整理的资料包含了大量Java的基础知识,例如面向对象编程概念(类、对象、封装、继承、多态),数据类型(基本类型与引用类型)、运算符、流程控制(if、switch、for、while)、数组、字符串操作...

    Java Programming 24-Hour Trainer

    - **集合框架概述**:介绍Java集合框架的基本概念,包括List、Set和Map等主要接口。 - **泛型的应用**:学习如何使用泛型来提高代码的安全性和灵活性。 ##### 14. 泛型 (Lesson15) - **泛型类与方法**:理解泛型类...

    Java基础练习40题

    这些题目有助于确保学习者掌握了编写简单Java程序的基本能力。 接着,110-120.rar中的题目可能涉及类和对象,这是Java的核心特性。这部分可能会要求创建自定义类,理解类的封装、继承和多态性,并使用构造函数、...

    任亮java资源第一阶段4

    这个阶段可能重点在于让初学者掌握Java语言的基本概念和语法,为后续深入学习打下坚实基础。 【描述】的重复性表述暗示了这些资源是针对"任亮java第一阶段资料"的强化,意味着它们可能包括了多次迭代或不同的复习...

Global site tag (gtag.js) - Google Analytics