下面参考java.util.HashMap<K, V>,写了一个简单的散列表,只实现了其中的put和get方法,使用链接法"碰撞冲突"。代码最后,自定义了一个People类,并覆盖了equals,hashCode,toString方法,实现了Comparable接口。利用People类检验散列表的正确性,并利用Arrays或Collections对People进行排序。

import java.util.Arrays;
//import java.util.Collections; class ListNode<K, V> {//为解决"碰撞冲突",使用链接法的结点结构。
ListNode<K, V> next;
K key;
V val;
public ListNode(K k, V v) {
key = k; val = v;
}
}
class HashMap<K, V> {//一个简单的散列表,实现了put和get方法。
ListNode<K, V>[] table = null; //构造一个散列表:一个存放链表的数组。
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //
int size;
public HashMap() {
setUp(DEFAULT_INITIAL_CAPACITY);
}
public HashMap(int capacity) {
setUp(capacity);
}
@SuppressWarnings("unchecked")
public void setUp(int capacity) {
size = capacity;
table = (ListNode<K, V>[])new ListNode[size];
}
public int hash(Object k) { //散列函数
return Math.abs(k.hashCode() % table.length);
}
public V put(K key, V value) { //return the old value
if(key == null)
return putForNullKey(value);
int i = hash(key);
for(ListNode<K, V> e = table[i]; e != null; e = e.next) {
if(e.key == key || key.equals(e.key)) {
V oldVal = e.val;
e.val = value;
return oldVal;
}
}
addListNode(i, key, value);
return null;
}
public V putForNullKey(V value) {
for (ListNode<K, V> e = table[0]; e != null; e = e.next) { // 只考虑table中下标为0的位置。
if(e.key == null) {
V oldVal = e.val;
e.val = value;
return oldVal;
}
}
table[0] = new ListNode<>(null, value);
return null;
}
public V get(K key) {
if(key == null)
return getForNullKey();
int i = hash(key);
for(ListNode<K, V> e = table[i]; e != null; e = e.next) {
if(e.key == key || key.equals(e.key))
return e.val;
}
return null;
}
public V getForNullKey() {
for(ListNode<K, V> e = table[0]; e != null; e = e.next) {
if(e.key == null)
return e.val;
}
return null;
}
public void addListNode(int i, K key, V value) {
ListNode<K, V> tmp = table[i];
table[i] = new ListNode<>(key, value);
table[i].next = tmp;
}
}
class People implements Comparable<People> { // 自定义People类,并覆盖了equals,hashCode,toString方法,实现了Comparable接口。
String name;
int age;
public People(String n, int a) {
name = n; age = a;
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(!(obj instanceof People))
return false;
return this.name.equals(((People)obj).name) && this.age == ((People)obj).age;
}
@Override
public int hashCode() {
return name.hashCode()*37 + age;
}
@Override
public String toString() {
return name + "," + age;
}
@Override
public int compareTo(People o) {
return this.age - o.age;
}
}
public class TestClass { //测试类
public static void main(String[] args) {
People[] people = new People[] { new People("xue", 25),
new People("hong", 20), new People("jun", 21)};
Arrays.sort(people);
// Collections.sort(Arrays.asList(people));
for (People peo : people) {
System.out.println(peo);
}
HashMap<People, Integer> hm = new HashMap<People, Integer>();
for (int i = 0; i < people.length; i++) {
hm.put(people[i], i);
}
for (int i = 0; i < people.length; i++) {
System.out.println(hm.get(people[i]));
}
}
}

实现一个简单的散列表(HashMap)的更多相关文章

  1. 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))

    本文根据<大话数据结构>一书,实现了Java版的一个简单的散列表(哈希表). 基本概念 对关键字key,将其值存放在f(key)的存储位置上.由此,在查找时不需比较,只需计算出f(key) ...

  2. HashMap、lru、散列表

    HashMap HashMap的数据结构:HashMap实际上是一个数组和链表("链表散列")的数据结构.底层就是一个数组结构,数组中的每一项又是一个链表. hashCode是一个 ...

  3. 用js来实现那些数据结构12(散列表)

    上一篇写了如何实现简单的Map结构,因为东西太少了不让上首页.好吧... 这一篇文章说一下散列表hashMap的实现.那么为什么要使用hashMap?hashMap又有什么优势呢?hashMap是如何 ...

  4. 散列表和JAVA中的hash

    引文 hello,今天写的数据结构是散列表(hash表),也算是一种基础数据结构了吧.学过计算机的人大概都能说出来这是个以空间换时间的东西,那么具体怎么实现的是今天要讨论的问题. 为什么需要它?主要还 ...

  5. 哈希表(散列表),Hash表漫谈

    1.序 该篇分别讲了散列表的引出.散列函数的设计.处理冲突的方法.并给出一段简单的示例代码. 2.散列表的引出 给定一个关键字集合U={0,1......m-1},总共有不大于m个元素.如果m不是很大 ...

  6. Python与数据结构[4] -> 散列表[0] -> 散列表与散列函数的 Python 实现

    散列表 / Hash Table 散列表与散列函数 散列表是一种将关键字映射到特定数组位置的一种数据结构,而将关键字映射到0至TableSize-1过程的函数,即为散列函数. Hash Table: ...

  7. Python与数据结构[4] -> 散列表[2] -> 开放定址法与再散列的 Python 实现

     开放定址散列法和再散列 目录 开放定址法 再散列 代码实现 1 开放定址散列法 前面利用分离链接法解决了散列表插入冲突的问题,而除了分离链接法外,还可以使用开放定址法来解决散列表的冲突问题. 开放定 ...

  8. 数据结构---散列表查找(哈希表)概述和简单实现(Java)

    散列表查找定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,是的每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到给定值的key的对应f(key) ...

  9. Java HashMap源码分析(含散列表、红黑树、扰动函数等重点问题分析)

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

随机推荐

  1. php 全文搜索搜索-讯搜使用

    相信很多朋友遇到过,需要全文搜索的场景,百度了一圈发现了一个xunsearch 首先本地采集了1万篇文章,发现效率还可以. 使用上也很简单,直接上代码 //接收关键词 $xs = new XS('xp ...

  2. html5 点击播放video的方法

    html5 点击播放video的方法<pre> <video videosrc="{$vo.shipinurl}" controls="" x ...

  3. VS反编译查看源码时,会把类实现的所有接口都直接显示

    今天在看ArrayList,发现一个很有意思的问题.从VS里反编译看,ArrayList继承了ICollection. IEnumerable.IList和ICloneable,而IList又继承了I ...

  4. PHP---无限极分类数组处理

    $array = array(    0=>array('id'=>1,'uid'=>0,'menuname'=>'菜单1','url'=>0,'addtime'=> ...

  5. 一张图讲解最少机器搭建FastDFS高可用分布式集群安装说明

     很幸运参与零售云快消平台的公有云搭建及孵化项目.零售云快消平台源于零售云家电3C平台私有项目,是与公司业务强耦合的.为了适用于全场景全品类平台,集团要求项目平台化,我们抢先并承担了此任务.并由我来主 ...

  6. [LC]530题 二叉搜索树的最小绝对差

    ①题目 给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值. 示例 : 输入: 1   \   3  / 2 输出:1 解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...

  7. Spring框架学习笔记(7)——Spring Boot 实现上传和下载

    最近忙着都没时间写博客了,做了个项目,实现了下载功能,没用到上传,写这篇文章也是顺便参考学习了如何实现上传,上传和下载做一篇笔记吧 下载 主要有下面的两种方式: 通过ResponseEntity实现 ...

  8. nyoj 242-计算球体积 (pi*r*r*r*4/3)

    242-计算球体积 内存限制:64MB 时间限制:3000ms 特判: No 通过数:21 提交数:74 难度:1 题目描述: 根据输入的半径值,计算球的体积. 输入描述: 输入数据有多组,每组占一行 ...

  9. Windows平台LoadLibrary加载动态库搜索路径的问题

    一.背景 在给Adobe Premiere/After Effects等后期制作软件开发第三方插件的时候,我们总希望插件依赖的动态库能够脱离插件的位置,单独存储到另外一个地方.这样一方面可以与其他程序 ...

  10. 力扣(LeetCode)按奇偶排序数组II 个人题解

    给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数. 对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数:当 A[i] 为偶数时, i 也是偶数. 你可以返回任何满足上述条件的数组 ...