`
roway
  • 浏览: 50658 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

第十:通过JDK源码剖析hashCode与equals方法与集合的关系及作用

 
阅读更多

一.

HashSet底层采用HashMap实现

二.

这个HashMap的key就是放进HashSet中的对象,而value就是一个Object类型的对象,这个value我们不关心它到底是什么

三.

当调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),

该行的key就是向HashMap中增加的那个对象,该行的value就是一个Object类型的常量

四.

HashMap底层采用数组维护

五.

调用增加的那个对象的hashCode方法,来得到一个hashCode值,

然后根据该值计算出一个数组的下标索引(计算出数组中的一个位置)

六.

将准备增加到Map中的对象与该位置上的对象进行比较(equals)方法,如果相同,那么就将该位置上的那个对象(Entry类型)的value值替换掉;否则,沿着该Entry的链继续重复上述过程,如果到链的最后依然没有找到与此对象相同的对象, 那么这个时候就会将该对象增加到数组中,然后将数组中该位置上的那个对象链到这个新对象的后面

七.

对于HashSet,HashMap来说,这样做的原因就是为了提高查找的速度,使得查找时间不随Set或者Map的大小而改变

八.

Set.add()添加重复的返回false

Map.put()添加key一样的,把以前的value覆盖

Set的特性:无重复性,无序性

public class HashMapTest {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Map map = new HashMap();
		map.put("welcome", "abc");
		map.put("hello", "abc");
		map.put("world", "xyz");
		map.put("hello world", "abcxyz");
		

		Set set = map.entrySet();// 返回此映射中包含的映射关系的 Set 视图。
		for (Iterator it = set.iterator(); it.hasNext();) {
			Map.Entry me = (Map.Entry) it.next();// 后面的知识可以用泛型写
			System.out.print(me.getKey() + "  ");
			System.out.println(me.getValue());
		}

		Set set2 = map.keySet();// 返回此映射中包含的键的 Set 视图。
		for (Iterator it = set2.iterator(); it.hasNext();) {
			String key = (String) it.next();
			String value = (String) map.get(key);
			System.out.println(key + "   " + value);
		}

		@SuppressWarnings("unused")
		Set set3 = new HashSet();
	}
}


分享到:
评论

相关推荐

    jdk源码方法注释及实现

    **标题:“JDK源码方法注释及实现”** 在Java开发中,深入理解JDK源码对于提升编程技能和优化代码效率至关重要。JDK(Java Development Kit)是Oracle公司提供的Java开发工具集,其中包含了Java运行环境和一系列...

    equals与hashCode方法讲解

    equals 与 hashCode 方法讲解 equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java...

    关于equals()方法,jdk源码给出如下五点建议

    关于`equals()`方法,Java开发工具包(JDK)提供了重要的指导原则,这些原则对于理解和正确使用`equals()`至关重要。`equals()`方法主要用于比较对象的内容,而`==`操作符则用于比较对象的引用(即地址)。在Java中...

    jdk15.0.2.zip

    记录类自动提供了构造函数、equals()、hashCode()和toString()方法,减少了编写样板代码的需要。 5. **弃用Java Applet API**:随着浏览器对Java插件的支持逐渐减少,JDK 15正式弃用了Applet API,这是Java Web应用...

    源码解析jdk7.0集合:HashSet的底层实现原理.pdf

    如果equals()方法返回true,则说明当前元素与已存在元素相等,就不会再次添加到集合中。 其他如返回集合中元素个数的size()方法,则是直接调用了内部HashMap的size()方法。检查HashSet是否为空的isEmpty()方法,也...

    java jdk 实例宝典源码

    - **Object类**:所有Java类的根类,包含了如`equals()`、`hashCode()`、`toString()`等基础方法。 - **String类**:Java中不可变的字符序列,广泛用于字符串操作,如`substring()`、`indexOf()`、`concat()`等。 ...

    jdk8和jdk17安装套件

    1. **Records**:一种新的类概念,用于声明简单的不可变数据结构,自动实现equals()、hashCode()和toString()等方法。 2. **Sealed Classes**:限制其他类可以继承的权限,增强了类型安全性和封装性。 3. **Pattern ...

    jdk1.6源码Ecplise添加

    Java开发工具JDK1.6源码的获取与分析对于深入理解Java语言的内部机制、优化编程技巧以及排查问题有着至关重要的作用。源码能够揭示出API背后的实现细节,帮助开发者提升技能,增强代码质量。以下将详细介绍如何在...

    Java-JDK、数据库系统开发、Web开发学习笔记

    Java-JDK、数据库系统开发、Web开发学习笔记 ...本文档涵盖了Java-JDK的基础知识,包括Object类的方法、异常类的层次结构、Java反射机制、集合类等内容,为Java开发者提供了一个全面了解Java基础知识的机会。

    JDK源码 src

    例如,深入研究`java.lang.Object`类,你会发现它是所有Java类的根,其`equals()`和`hashCode()`方法是实现对象比较和哈希表操作的关键。通过源码,我们可以学习到如何正确地重写这些方法以满足特定需求,从而避免...

    JDK1.8_lombokPlugin.rar

    Lombok是一个流行的Java库,它允许开发者通过注解简化代码,自动处理如getter、setter、equals、hashCode和toString等常见方法的生成,从而减少样板代码。 首先,让我们深入了解一下JDK 1.8,它是Java开发工具集的...

    java 集合源码学习,jdk1.8集合类所有的源码讲解

    元素的添加、删除和查找都依赖于对象的哈希值,因此元素必须正确实现`hashCode()`和`equals()`方法。`TreeSet`则是基于红黑树实现,保持元素排序。 `Queue`接口用于实现队列数据结构,`LinkedList`同时实现了`List`...

    jdk-17_windows-x64_bin.zip

    记录类自动提供了构造函数、equals()、hashCode()和toString()方法,简化了代码编写。 3. **开关表达式(Switch Expressions)**:在JDK17中,switch语句进一步演进为开关表达式,支持更简洁的代码风格,允许在单行...

    JDK各种类、方法源代码

    通过研究JDK源码,开发者可以更深入地理解Java的工作原理,从而写出更高效、更稳定的代码。 1. **Java核心包**: - `java`包:这是Java的核心包,包含了许多基础类,如`Object`、`String`、`System`等。`Object`是...

    JDK17全版本.rar

    3. **Records(记录类)**: 记录类是一种特殊的类,主要用于数据封装,它们自动提供构造函数、equals()、hashCode() 和toString() 方法,简化了数据载体类的编写。 4. **Switch表达式增强**: 添加了更多的结构化...

    jdk-18_windows-x64_bin.exe

    2. ** Records**:这是一种简化数据类的新语法结构,允许开发者声明包含不可变数据的类,而无需编写构造函数、getter、setter或equals()、hashCode()和toString()方法。 3. **Sealed Classes**:这个特性允许控制...

    学习Object类——为什么要重写equeals和hashcode方法

    Object 类的 equals 和 hashCode 方法的重要性与实现 在 Java 编程语言中,Object 类是所有类的父类,但是在实际开发中,我们往往需要重写 Object 中的 equals 和 hashCode 方法,以便正确地比较对象的逻辑内容,而...

    java jdk 15 官网免安装版本

    5. **JEP 380: Records**:预览特性,Records提供了一种新的类类型,它简化了数据载体的表示,自动实现了equals(), hashCode() 和 toString() 方法,使得代码更加简洁。 6. **JEP 379: Matrix Multiplication**:在...

    Java equals 方法与hashcode 方法的深入解析

    `equals()` 方法用于判断两个对象是否相等,而 `hashCode()` 方法则与对象的哈希值有关,这对于理解和使用Java中的集合框架至关重要。 `equals()` 方法是Object类的一个成员方法,它的默认行为是基于引用比较,即...

    jdk1.8.zip

    jdk1.8新特性知识点: ...方法,计算出哈希码值,经过哈希算法算成数组的索引值,如果对应的索引处没有元素,直接存放,如果有对象在,那么比较它们的equals方法比较内容 如果内容一样,后一个value会将前一个value

Global site tag (gtag.js) - Google Analytics