`
tangyanbo
  • 浏览: 268556 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

跟我一起阅读Java源代码之HashMap(一)

阅读更多

最近闲的很,想和大家一起学习并讨论下Java的一些源代码以及其实现的数据结构,

不是什么高水平的东西,有兴趣的随便看看

 

1. 为什么要用Map,以HashMap为例

    很多时候我们有这样的需求,我们需要将数据成键值对的方式存储起来,根据key来获取value(value可以是简单值,也可以是自定义对象)

    当然用对象数组也能实现这个目的,查找时可以遍历数组,比较关键字来获取对应的value

    从性能上来讲,遍历大数组会消耗性能

    从API易用性来讲,需要自己实现查找的逻辑

    所以用HashMap是必要的    

 

2. HashMap的数据结构是怎么样的

 

    我一直对HashMap的内部结构很好奇,看了源码之后发现他是用散列实现的,即基于hashcode

    大体思想是这样的

    1. 首先建立一个数组用来存取数据,假设我们定义一个Object[] table用来存取map的value

这个很容易理解,key存在哪里呢?暂时我不想存储key

    2. 获得key的hashcode经过一定算法转成一个整数

        index,这个index的取值范围必须是0=<index<table.length,然后我将其作为数组元素的下标

        比如执行这样的操作:table[index] = value;

        这样存储的问题解决了

    3. 如何通过key去获取这个value呢

        这个太简单了,首先获取key的hashcode,然后通过刚才一样的算法得出元素下标index

        然后value = table[index]

 

简单的HashTable实现如下

 

public class SimpleHashMap {

	private Object[] table;

	public SimpleHashMap() {
		table = new Object[10];
	}

	public Object get(Object key) {
		int index = indexFor(hash(key.hashCode()), 10);
		return table[index];
	}

	public void put(Object key, Object value) {
		int index = indexFor(hash(key.hashCode()), 10);
		table[index] = value;
	}

	/**
	 * 通过hash code 和table的length得到对应的数组下标
	 * 
	 * @param h
	 * @param length
	 * @return
	 */
	static int indexFor(int h, int length) {
		return h & (length - 1);
	}

	/**
	 * 通过一定算法计算出新的hash值
	 * 
	 * @param h
	 * @return
	 */
	static int hash(int h) {
		h ^= (h >>> 20) ^ (h >>> 12);
		return h ^ (h >>> 7) ^ (h >>> 4);
	}
	
	
	public static void main(String[] args){
		SimpleHashMap hashMap = new SimpleHashMap();
		hashMap.put("key", "value");
		System.out.println(hashMap.get("key"));
	}
}
 

这个简单的例子大概描述了散列实现hashmap的过程

但是还很不成熟,我发现至少存在以下两个问题

1. hashmap的size是固定的

2. 如果不同的key通过hashcode得出的index相同呢,这样的情况是存在的,如何解决?

请看系列文章二

 

分享到:
评论

相关推荐

    java源代码,java源代码

    Java源代码是编程世界的基石,它是Java程序员用Java语言编写的程序文本,包含了类、方法、变量等元素,是理解程序逻辑和功能的核心。在Java编程中,源代码通常以`.java`为扩展名,经过Java编译器的处理,会被转化为...

    java代码-使用java解决手写hashMap的源代码

    java代码-使用java解决手写hashMap的源代码 ——学习参考资料:仅用于个人学习使用!

    164个完整的Java程序源代码

    4. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashSet、HashMap等,它们在源代码中会被广泛应用,用于数据的存储和操作。 5. **输入/输出流**:Java的I/O流系统广泛用于文件读写、网络通信等场景,源...

    java简单实例程序源代码

    "java简单实例程序源代码"这个压缩包包含了一系列章节相关的Java实例源代码,适合初学者和有经验的开发者用来加深对Java语言的理解。以下是这些章节可能涉及的重要知识点的详细解释: 1. **CH11**: 这个章节可能...

    Java源码:比较经典的一些Java源代码,适合于初学者

    这个压缩包包含了140个经典的Java源代码程序,涵盖了各种基础到进阶的编程概念。下面,我们将详细讨论这些知识点。 1. **基础语法**:作为初学者,首先需要掌握Java的基础语法,包括变量声明、数据类型(如int、...

    250个java源代码

    总之,"250个Java源代码"提供了一个全面的实践平台,涵盖了许多Java编程的核心概念和技术。通过逐一分析和运行这些代码,学习者不仅能加深对Java的理解,还能提升编程能力和问题解决技巧。无论是初学者还是经验丰富...

    java8源代码内容

    这个压缩包文件“jdk1.8”包含了Java 8的源代码,这对于开发者来说是一个宝贵的资源,可以深入理解其内部工作原理,帮助在实际项目中更高效地使用Java 8的功能。 首先,Java 8的最重要的新特性之一是Lambda表达式。...

    Java全部源代码

    Java源代码包含了JDK(Java Development Kit)的所有组件,包括核心类库如java.lang、java.util、java.io等,这些类库构成了Java平台的基础。通过阅读源代码,我们可以了解到Java的API是如何实现的,比如对象的创建...

    JAVA 经典源代码

    总的来说,"JAVA 经典源代码"是一个广泛的范畴,涵盖了Java语言的核心特性、设计原则、最佳实践等多个层面。通过研究和学习这样的源码,开发者不仅可以深化对Java的理解,还能提升自己的编程技巧,为实际项目开发...

    Java核心源代码

    Java核心源代码是Java编程语言的核心组成部分,它包括了大量的类库和API,这些构成了Java开发的基础框架。在Java中,"以java开头的包"通常指的是Java标准库,这是一个庞大的集合,涵盖了各种功能,从基本的数据类型...

    java实用代码源代码

    在描述中提到的".java"文件是Java源代码文件,它是编写Java程序的基本单元。每个.java文件通常包含一个或多个类定义,编译后会生成对应的字节码文件(.class),由Java虚拟机执行。".java"文件的实用性质意味着它们...

    java api源代码

    Java API源代码是Java开发中的核心组成部分,它包含了Java标准库中的所有类和接口,这些类和接口构成了Java平台的基础。Sun Microsystems(后被Oracle收购)是Java的原始开发者,他们发布的源代码对于深入理解Java的...

    Java程序设计语言源代码

    Java源代码涉及到的基础知识包括变量、数据类型、运算符、流程控制(如if语句、for循环、while循环)、方法定义和调用。在applet相关的源代码中,可以学习到如何在Web环境中运行Java小程序,包括Applet类、初始化和...

    Java HashMap类详解

    HashMap 的存储实现可以通过查看其 put(K key, V value) 方法的源代码来了解。该方法首先判断 key 是否为 null,然后根据 key 的 hashCode 值计算 Hash 值,接着搜索指定 hash 值在对应 table 中的索引,如果 i 索引...

    Java语言程序设计源代码

    本资源包含了《Java语言程序设计》一书的源代码,这是一份宝贵的教育资源,可以帮助读者深入理解Java编程的核心概念。 首先,Java是一种面向对象的编程语言,由Sun Microsystems(现已被Oracle收购)于1995年推出。...

    Java自学程序源代码

    Java自学程序源代码是初学者和进阶者深入理解编程语言的重要资源,它提供了一手的实践材料,帮助学习者通过实例来探索和掌握Java语言的核心概念和特性。以下是一些关键的知识点,这些知识点可以从这个"Java自学程序...

    java源代码原理视频.txt

    java源代码原理,深入理解HashMap原理、高可用redis集群架构、zookeeper分布式、海量数据缓存、springAOP底层源码分析等

    21天学通JAVA源代码

    "21天学通JAVA源代码"是一本旨在帮助初学者快速掌握Java编程基础的教材,由电子工业出版社出版。这本书通过21天的学习计划,系统地介绍了Java的核心概念和技术,为读者提供了丰富的学习材料。 在学习Java时,源代码...

    57个java源代码(自学java)

    这份“57个java源代码(自学java)”的资源对于初学者来说是一份宝贵的材料,它可以帮助你逐步理解并掌握Java编程的基础知识。下面将详细解释这份资料中可能涉及的关键知识点: 1. **基础语法**:在学习Java时,首先...

    飞机订票系统java源代码

    总的来说,这个“飞机订票系统Java源代码”展示了如何利用Java的特性构建一个完整的业务系统。通过对源代码的深入分析,开发者不仅可以学习到Java编程技巧,还能了解到如何将理论知识应用到实际项目中,提升自己的...

Global site tag (gtag.js) - Google Analytics