「实现哈希表java」实现哈希表的建立和查找

博主:adminadmin 2023-01-10 07:54:09 843

今天给各位分享实现哈希表java的知识,其中也会对实现哈希表的建立和查找进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

数据结构(java版)哈希表的设计

1.什么是哈希表?

哈希表是一种数据结构,它提供了快速的插入操作和查找操作。其基于数组来实现。

2.哈希化

1)直接将关键字作为索引。

2)将单词转换成索引。

1将字母转换成ASCII码,然后进行相加

2幂的连乘

3压缩可选值

3.压缩后仍然可能出现的问题。

冲突:不能保证每个单词都映射到数组的空白单元。

解决办法:

1开放地址法

2链地址法

/**

* 员工信息类

* @author Administrator

*

*/

public class Info {

private String key;

private String name;

public Info(String key, String name) {

this.key = key;

this.name = name;

}

public String getKey() {

return key;

}

public void setKey(String key) {

this.key = key;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

import java.math.BigInteger;

public class HashTable {

private Info[] arr;

/**

* 默认的构造方法

*/

public HashTable() {

arr = new Info[100];

}

/**

* 指定数组初始化大小

*/

public HashTable(int maxSize) {

arr = new Info[maxSize];

}

/**

* 插入数据

*/

public void insert(Info info) {

arr[hashCode(info.getKey())] = info;

}

/**

* 查找数据

*/

public Info find(String key) {

return arr[hashCode(key)];

}

public int hashCode(String key) {

// int hashVal = 0;

// for(int i = key.length() - 1; i = 0; i--) {

// int letter = key.charAt(i) - 96;

// hashVal += letter;

// }

// return hashVal;

BigInteger hashVal = new BigInteger("0");

BigInteger pow27 = new BigInteger("1");

for(int i = key.length() - 1; i = 0; i--) {

int letter = key.charAt(i) - 96;

BigInteger letterB = new BigInteger(String.valueOf(letter));

hashVal = hashVal.add(letterB.multiply(pow27));

pow27 = pow27.multiply(new BigInteger(String.valueOf(27)));

}

return hashVal.mod(new BigInteger(String.valueOf(arr.length))).intValue();

}

}

public class TestHashTable {

public static void main(String[] args) {

HashTable ht = new HashTable();

ht.insert(new Info("a","张三"));

ht.insert(new Info("ct","李四"));

ht.insert(new Info("wangwu","王五"));

System.out.println(ht.find("a").getName());

System.out.println(ht.find("ct").getName());

}

}

JAVA创建一个哈希表储存数据并输出,要完整代码

我就不写了,给个提示吧:

建一个类,名字就叫员工,它有三个属性,分别是你要的三个数据,名字、工龄、工号。然后,每次put的时候这样:put('1234',员工1);以员工工号为key,类员工为value

java.util.hashtable实现了哪个interface

一、Map

map接口,集合类的接口,声明了map的常用方法。所有的map都继承自改接口

二、java.io.Serializable接口,

接口里没有声明任何方法,该接口用来实现对象的序列化反序列化功能

三、java.lang.Cloneable

接口里没有声明任何方法,该接口实现对象复制功能

四. AbstractMap

重要的类:AbstractMapK,V

AbstractMap抽象类实现了一些简单且通用的方法,

在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以说是教科书式的典范。

抽象类通常作为一种骨架实现,为各自子类实现公共的方法。

Java中Map类型的数据结构有相当多,AbstractMap作为它们的骨架实现实现了Map接口部分方法,也就是说为它的子类各种Map提供了公共的方法,没有实现的方法各种Map可能有所不同。

抽象类不能通过new关键字直接创建抽象类的实例,但它可以有构造方法。AbstractMap提供了一个protected修饰的无参构造方法,意味着只有它的子类才能访问(当然它本身就是一个抽象类,其他类也不能直接对其实例化),也就是说只有它的子类才能调用这个无参的构造方法。

在Map接口中其内部定义了一个Entry接口,这个接口是Map映射的内部实现用于维护一个key-value键值对,key-value存储在这个Map.Entry中。AbstractMap对这个内部接口进行了实现,一共有两个:一个是可变的SimpleEntry和一个是不可变的SimpleImmutableEntry。

1. SimpleEntry

1.1 定义

实现了Map.EntryK, V接口,并且实现了Serializable(可被序列化)。它的方法比较简单都是取值存值的操作,对于key值的定义是一个final修饰意味着是一个不可变的引用。

1.2 setValue

ll另外其setValue方法稍微特殊,存入value值返回的并不是存入的值,而是返回的以前的旧值。

源码:

1.3 equals和hashCode

需要重点学习的是它重写的equals和hashCode方法。

eq方法

 要想正确重写equals方法并能正确使用,通常还需要重写hashCode方法。因为集合中的元素,判断是否一样时,先hash再equals,这也是个知识点,详细的,学习一下原理。

hashcode源码:可以看成求hashcode值时,即返回的int数据,是key.hashCode() ^ value.hashCode(),即key、value的hashcode值异或

2. SimpleImmutableEntry

2.1 定义

源码:

它相比于SimpleEntry其key和value成员变量都被定义为了final类型。即定义为不可变的Entry,不提供setValue方法,不能通过setValue方法进行修改。

2.2 setValue

调用setValue方法将会抛出UnsupportedOperationException异常。即定义为不可变的Entry,不提供setValue方法,不能通过setValue方法进行修改。

它的equals和hashCode方法和SimpleEntry一致。

3. 实现的Map接口方法

接下来查看AbstractMap抽象类实现了哪些Map接口中的方法。

3.1 public int size()

Map中定义了一个entrySet方法,返回的是Map.Entry的Set集合,直接调用Set集合的size方法即是Map的大小。

3.2 public boolean isEmpty()

调用size方法,等于0即为空。

3.3 public boolean containsValue(Object value)

这个方法的实现较为简单,通过调用entrySet方法获取Set集合的迭代器遍历Map.Entry,获取对应的value与参数value比较。Map可以存储为null的value值,由于value=null在Map中存储比较特殊(不能计算hashCode值),所以在这里也做了判断参数value是否为空。

public boolean containsKey(Object key)

这个方法实现和containsValue一致。

3.4 public V get(Object key)

这个方法实现和containsValue类似,不同的是上面相等返回boolean,这个方法返回value值。

3.5 public V put(K key, V value)

向Map中存入key-value键值对的方法并没有具体实现,会直接抛出一个UnsupportedOperationException异常。

6 public V remove(Object key)

通过参数key删除Map中指定的key-value键值对。这个方法也很简单,也是通过迭代器遍历Map.Entry的Set集合,找到对应key值,通过调用 Iterator.remove() 方法删除Map.Entry。

7. public void putAll(Map? extends K, ? extends V m)

这个方法也很简单遍历传入的Map,调用put方法存入就可以了。

public void clear()

调用entrySet方法获取Set集合再调用Set#clear()方法清空。

keyset

 返回Map key值的Set集合。AbstractMap中定义了一个成员变量“transient SetK keySet”,在JDK7中keySet变量是由volatile修饰的,但在JDK8中并没有使用volatile修饰。在对keySet变量的注释中解释道,访问这些字段的方法本身就没有同步,加上volatile也不能保证线程安全。关于keySet方法的实现就有点意思了。

首先思考该方法是返回key值的Set集合,很自然的能想到一个简单的实现方式,遍历Entry数组取出key值放到Set集合中,类似下面代码:

这就意味着每次调用keySet方法都会遍历Entry数组,数据量大时效率会大大降低。不得不说JDK源码是写得非常好,它并没有采取遍历的方式。如果不遍历Entry,那又如何知道此时Map新增了一个key-value键值对呢?

答案就是在keySet方法内部重新实现了一个新的自定义Set集合,在这个自定义Set集合中又重写了iterator方法,这里是关键,iterator方法返回Iterator接口,而在这里又重新实现了Iterator迭代器,通过调用entrySet方法再调用它的iterator方法。下面结合代码来分析:

五、 Dictionary

Dictionary 类是一个抽象类,用来存储键/值对,作用和Map类相似。

给出键和值,你就可以将值存储在Dictionary对象中。一旦该值被存储,就可以通过它的键来获取它。所以和Map一样, Dictionary 也可以作为一个键/值对列表。Dictionary类已经过时了。在实际开发中,你可以实现Map接口来获取键/值的存储功能。

打开CSDN,阅读体验更佳

HashMap、TreeMap、Hashable和LinkedHashMap_kgduu的博客

HashMap、TreeMap、Hashable和LinkedHashMap Map是最重要的数据结构之一。开始会告诉怎么用HashMap、TreeMap、Hashtable和LinkedHashMap 1、Map概述 在Java SE中有4种Map的实现:HashMap、TreeMap、Hashtable和LinkedHashMap. HashMap:用哈...

继续访问

Python 接口:从协议到抽象基类_weixin_30492047的博客

首先,基本的事实是,Python语言没有 interface 关键字,而且除了抽象基类,每个类都有接口:类实现或继承的公开属性(方法或数据属性),包括特殊方法,如__getitem__ 或 __add__。 按照定义,受保护的属性和私有属性不在接口中:即便“受保护...

继续访问

最新发布 Java集合(九)HashMap接口

HashMap小结:(1)Map接口的常用实现类:HashMap、Hashtable和Properties(2)HashMap是Map接口使用频率最高的实现类(3)HashMap是以key-val对的方式来存储数据(HashMap$Node类型)(4)key不能重复,但是值可以重复,允许使用null键和null值(5)如果添加相同的key,则会覆盖原来的key-val,等同于修改.(key不会替换,val会替换)我们来把断点放在map.put("no1","张三丰“);

继续访问

Hashtable和HashMap的异同

Hashtable和HashMap两者的原理相同,功能相同,很多情况下可以互用。 Hashtable和HashMap的主要区别如下: 1、Hashtable继承自Dictionary类,而HashMap实现了Map接口 2、Hashtable线程安全,HashMap重速度、轻安全,是线程非安全的,所以当运行到线程环境中时,需要程序员自己管理线程的同步问题。 3、Hashtable不允许null值(key和value都不允许),HashMap允许null值(key和value都允许) 其他异同点可参照博客:

继续访问

Hashable / Hasher_weixin_33909059的博客

哈希函数的选择应该作为实现细节,而不是设计中的固定部分;因此,使用者不应该依赖于编译器自动生成的 Hashable 函数的具体特征。最可能的实现是在每个成员的哈希值上调用标准库中的_mixInt函数,然后将他们逻辑异或(^),如同目前Collection类...

继续访问

php的数据结构_PHP 的数据结构扩展_myh991235的博客

Sequence 是类数组数据结构的基础接口,定义了很多重要且方便的方法,比如 contains, map, filter, reduce, find, first, last 等。从图中可知,Vector, Deque, Stack, Queue 都直接或者间接的实现了这个接口。 Hashable 在图中看起来比...

继续访问

33.Java之Map接口实现类(HashMap、HashTable、Properties、TreeSet 和 TreeMap基本介绍,HashMap 底层机制)

Map 接口的常用实现类:HashMap、Hashtable 和 Properties 33.1 HashMap 基本介绍 是 Map 接口使用频率最高的实现类 是以 Key-value 的方式来存储数据(HashMap$Node类型) Key 不能重复,但是值可以重复,允许使用 Null 键和 Null 值 如果添加相同的 Key,则会覆盖原来的 Key-value,等同于修改(Key不会替换,value会替换) 与 HashSet 一样,不保证映射的顺序(即添加顺序与输出顺序不一样),因为底层是以

继续访问

Map接口:HashMap与HashTable的区别

1)HashMap和Hashtable都实现了Map接口,但是继承的父类不同: public class Hashtable extends Dictionary implements Map public class HashMap extends AbstractMap implements Map2)HashMap是非synchronized,执行速度快,而HashTab...

继续访问

php7 唯一数字_PHP7中高效的数据结构_王雷Neo的博客

实现Hashable接口的数据结构是Map和Set。 Map 一个Map 是一个键值对的连续集合,和数组几乎一致。键可以是任何类型,但是必须唯一。 强项: 性能和内存效率和数组几乎一致 当长度降低的时候自动释放内存 ...

继续访问

java常见笔试_Java 常见笔试题(2)_weixin_39998462的博客

java.util.Hashtable实现了哪个接口? A. java.util.Map B. java.util.List C. java.util.Hashable D. java.util.Collection 9. 1. class A implements Runnable{ 2. int i; 3.

继续访问

实现原理_HashTable实现原理

概要前一章,我们学习了HashMap。这一章,我们对Hashtable进行学习。我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable。第1部分 Hashtable介绍第2部分 Hashtable数据结构第3部分 Hashtable源码解析(基于JDK1.6.0_45)第4部分 Hashtable遍历方式第5部分 Hashtable示例转载请注明出处...

继续访问

Hashtable源码分析

前言:Hashtable线程安全的集合类,虽然它线程安全,然而在日常开发中使用的频率很低,毕竟锁的颗粒度太大了。但是这并不妨碍我们对其内部原理进行了解。 注:本文jdk源码版本为jdk1.8.0_172。 1.Hashtable基本概念 Hashtable与HashMap一样,都是以键值对的形式存储数据。但是Hashtable的键值不能为null,而HashMap的键值是可以为...

继续访问

Swift自定义Class实现Hashable_weixin_30273763的博客

增加代码后,发现编译器依然报错"Type 'Bit' does not conform to protocol 'Equatable'"-没有实现Equatable协议。 2.实现Equatable Commend+click点击Hashable定义,进入后再点击Equatable协议定义,可以看到如下定义: ...

继续访问

Array,Vertor,Arraylist,Hashable,Hashmap等几个易混淆的概念_tjjhz...

1.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现 2.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

继续访问

Hashtable简述

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。......

继续访问

Map接口与实现类HashTable

Map接口与实现类HashTable 源码位置 rt.jar/java.util包下 源码类 public class HashtableK,V extends DictionaryK,V implements MapK,V, Cloneable, java.io.Serializable 特点 1、集合中key不能重复,若put时集合已含有此key,那新值会替换旧值;key,value不能为null 2、HashTable/Map中存放数

继续访问

Java面试知识整理_加温的啤酒的博客_java面试知识整理

都实现了list接口,都是有序的 vector线程是安全的,arraylist线程是不安全的 vector数据增长是原来的一倍,arraylist是数据增长是原来的0.5倍 hashmap和hashable的区别 hashmap是hashable的轻量级实现,hashmap允许空键值,hashable不允许 ...

继续访问

javase基础知识总结_id_1314520的博客

interface接口: 默认所有方法都是抽象的,并且public修饰的. 属性: 默认为public修饰的常量(public final修饰的) abstract抽象类: 类名被abstract修饰的类; 里面可以有抽象方法, 也可以没有抽象方法; 实现接口类,可以重写也可以不重写接口...

继续访问

集合—Map接口实现类-Hashtable

本次博客带领大家学习集合中的Map接口实现类-Hashtable。

继续访问

Hashtable 和 HashMap

HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。 1.HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。 2...

继续访问

hashMap和hashTable的区别以及HashMap的底层原理?

hashMap和hashTable的区别? 1、继承的父类不同 HashTable继承Dictionary类,而hashMap继承了AbstractMap类,但是二者都实现了map接口。 2、线程安全性不同 Hashtable 线程安全,因为它每个方法中都加入了Synchronize。HashMap是线程不安全的。 HashMap底层是一个Entry数组,当发生hash冲突的时候,ha......

继续访问

java---Map接口的实现类HashMap和Hashtable

package LyfPractice;import java.util.*;/** * Created by fangjiejie on 2016/12/19. */ /*Hashmap和Hashtable的区别 1.相同:都实现了Map接口,实现了key和value的保存与映射,有很多相同的方法 2.不同: Hashmap:是map接口的实现类 ,非同步,线程不安全 ,速度快,可以有

继续访问

Map 接口实现类-Hashtable

Map 接口实现类-Hashtable

继续访问

29. Map接口继承关系 / Map接口概述 / HashMap底层实现原理及相关知识 / Map常用方法 / TreeMap、Properties

Map接口继承关系 Map接口概述 Map与Collection并列存在。用于保存具有映射关系的数据:key-value Map 中的 key 和 value 都可以是任何引用类型的数据 Map 中的 key 用Set来存放, 不允许重复,即同一个 Map 对象所对应 的类,须重写hashCode()和equals()方法 常用String类作为Map的“键” key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到 唯一的、确定的 value Map接口的常用实现类: HashM

继续访问

Map接口的实现类----HashMap

Map接口的实现类----HashMap。

继续访问

JAVA基础 接口与继承 HashMap使用

抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量 接口不可继承抽象类,抽象类可实现多个接口。接口与接口之间是继承,用extends,可继承多个接口 mport java.util.HashMap; import java.util.Map; interface T...

继续访问

【Java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想

JDK源码的类定义 public class HashMapK,V extends AbstractMapK,V implements MapK,V, Cloneable, Serializable public class LinkedHashMapK,V extends HashMapK,V implements...

继续访问

Map接口及其实现类HashMap、LinkedHashMap和Hashtable的简单介绍

一、Map集合的特点 Map集合是一个双列集合,一个元素包含两个值(一个是key,一个是value)Map集合的特点 Map集合中的元素,key和value的数据类型可以相同也可以不同 Map集合中的元素,key是不允许重复的,value是可以重复的 Map集合中的元素,key和value是一一对应的 Map的常用方法 1、public V put (K key, V value)方法 作用:把指定的键与指定的值添加到Map集合中 返回值V的含义:存储键值对的时候,key如果不重复,返回值v是null;

继续访问

Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

转 Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例 概要 前一章,我们学习了HashMap。这一章,我们对Hashtable进行学习。 我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Has

继续访问

HashTable实现原理

有两个类都提供了一个多种用途的hashTable机制,他们都可以将可以key和value结合起来构成键值对通过put(key,value)方法保存起来,然后通过get(key)方法获取相对应的value值。一个是前面提到的HashMap,还有一个就是马上要讲解的HashTable。对于HashTable而言,它在很大程度上和HashMap的实现差不多,如果我们对HashMap比较了解的话,对Has

用java编写哈希表,输入一组数据,创建一个哈希表,然后进行元素的查询、删除

#包括中

#包括中

#包括

/ /#包括

#定义50 HASH_LEN / /哈希表的长度

#定义男47

#定义NAME_NO 30 / /数字名称

typedef结构名称

{

的char * PY; / /名称的字母

K; / /拼音对应的整数

}名称;

名称名单[HASH_LEN];

typedef的struct hterm的/ /哈希表

{,

炭* PY / /名称的字母

K; / /拼音对应的整数

诠释SI / /查找长度

} HASH; BR / HASH HashList的[HASH_LEN];

/ * -----------------------名称(结构数组)来初始化 - -------------------------------- * /

的无效InitNameList()

{

名单[0]。 PY =的“chenghongxiu”;

名单[1]。 PY =“元昊”;

名单[2]。 PY =“襄阳”;

名单[3]。 PY =的“zhanghen”;

名单[4]。 PY =的“chenghongxiu”;

名单[5]。 PY =“杨小凯”;的

名单[6]。 PY =“六朋”;

名单[7]。 PY =的“shenyonghai”;

名单[8]。 PY =“chengdaoquan”名单[9]。 PY =的“ludaoqing”;

名单[10]。 PY =的“gongyunxiang”;

名单[11]。 PY =的“sunzhenxing”;

名单[12]。 PY =的“sunrongfei”;

名单[13]。 PY =的“sunminglong”;

名单[14]。 PY =“张皓”;

名单[15]。 PY =“田苗”;

名单[16]。 PY =的“yaojianzhong”;

名单[17]。 PY =的“yaojianqing”;

名单[18]。 PY =的“yaojianhua”;

名单[19]。 PY =的“yaohaifeng”;

名单[20]。 PY =的“chengyanhao”;

名单[21]。 PY =的“yaoqiufeng”;

名单[22]。 PY =的“qianpengcheng”;

名单[23]。 PY =的“yaohaifeng”;

名单[24]。 PY =的“bianyan”;

名单[25]。 PY =“linglei”;

名单[26]。 PY =的“fuzhonghui”;

名单[27]。 PY =的“huanhaiyan”;

名单[28]。 PY =的“liudianqin”;

名单[29]。 PY =的“wangbinnian”

字符* F;

INT R,S0;

(INT I = 0; NAME_NO; + +)

{

S0 = 0;

F =名单[I]。 PY

相关(r = 0; *(F + R)= NULL与r + +)/ /方法:每个字符的字符串对应的ASCII码的总和,所得到的整数作为哈希表的关键字

S0 =(F + R)+ S0;

名单[I]。 K = S0;

}

}

/ * -----------------------建立哈希表--------------------------------- * /

的无效CreateHashList()

{(INT I = 0; NAME_NO; + +)

{

HashList [I]。 PY =“”;

HashList [I]。 K = 0;

HashList [I]。 SI = 0;

}

(I = 0; NAME_NO + +)

{

总和= 0;

ADR =(名单[I] K)%M / /哈希函数

- = ADR;

(HashList [ADR] SI == 0)/ /如果没有冲突

{ HashList [ADR]。 K =的名单[I]。 K;,

HashList [ADR]。 PY =的名单[I]。 PY;,

HashList [ADR]。 SI = 1;

} 其他/ /冲突

{

{

D =(D +((名单[I] K))%10 + 1)%M / /伪哈希总和=总和+1 / /发现号加1

}(HashList [D] K!= 0);

BR / HashList的研究[D]。 K =的名单[I]。 K;

HashList的研究[D]。 PY =的名单[I]。 PY;

HashList的研究[D]。 SI =总和+1;

}

}

}

/ * ------------------- ------------------查找------------------------------- ----- * /

的无效FindList()

{

的printf(“\ n \ n已请输入名字的拼音:”); / /输入名称

字符名[20] = {0};

scanf函数(“%”,名称)

INT S0 = 0;

(R = 0; 20,R + +)/ /找到对应的字母的名称一个整数(关键字)

S0 + =名称[R]。

总和= 1; BR / ADR = S0%M,/ /使用哈希函数

= ADR;

如果判断(HashList [ADR]。K == S0)/ /三例

的printf(“\ N名:%s关键字:%d个查找长度:1”,HashList [J]。PY,S0);

否则,如果(HashList [ADR]。K == 0)

的printf(“有没有这样的记录!”); 其他

{

G = 0;

{

D =(D + S0%10 +1)%M; / /伪散货的列

总和=总和+1;

(HashList的研究[D]。K == 0)

{

的printf(“无记录!”); br / G = 1;

}

(HashList并[d],K = S0)

{

的printf(“\ N名:%s关键字:%d个查找长度为:%d的”HashList [J]。PY,S0,总和);

G = 1;

}

},(G == 0);

}

}

/ * -------------------- ------------展览哈萨克斯坦希腊表---------------------------- * /

无效显示()

{

的printf(“\ n \ n已地址\吨关键字\ T \ T查找长度\ TH(键)\ T \吨拼音\ N”); / /显示格式 BR p(INT I = 0; 15; + +)

{

的printf(“%d的”,I);

的printf(“\吨%D“HashList [I] K);

的printf(”\ T \ T%D“,HashList [I] SI);

的printf(”\ T \ T%D“ (HashList [I] K)%M);

的printf(“\%”,HashList的[]。PY);

的printf(“\ N”);

}

的printf(“按任意键继续显示... \ N”); / /由于数据较多,所以分屏显示(Win9x/DOS仍然可以看到所有的数据)

用getchar();

(I = 15; 30; i + +)

{

的printf(“%d”处,I);

printf的(“\ T%D”,HashList [I],K);

的printf(“\ T \ T%D”,HashList [I] SI);

的printf(“\ T \ T%D“(HashList [I] K)%M);

的printf(”\%“,HashList的[I]。PY);

的printf(”\ N“)

}

的printf(“按任意键继续呈现... \ N”);

的getchar的();

(I = 30; I 40 +)

{

的printf(“%d的”,我);

的printf(“\吨为%d”,HashList [I],K); /的printf(“\ T \ T%D”,HashList [I] SI);

的printf(“\ T \ T%D”(HashList [I] K)%M); /的printf(“\%”,HashList [I] PY);

的printf(“\”);

}

的printf(“按任意键继续呈现... \ N“);

的getchar的();

(I = 40; 50; + +)

{

的printf(”为%d“,I);

的printf(”\吨为%d“,HashList [I] K)

的printf(”\ T \ T%D“,HashList [I] SI) ;

的printf(“\吨\ T为%d”,(HashList [I],K)%M);

的printf(“\%”,HashList的[]。PY); BR /的printf(“\ N”);

}

浮法平均= 0;

(= 0; NAME_NO; + +)BR /平均+ = HashList [I]。 SI;

/ = NAME_NO;

的printf(“\ N \ N平均查找长度:ASL(%D)=%f \ N \ N”,NAME_NO平均);

}

/ * --------------------------------主要功能------ ---------------------- * /

无效的主要()

{

/ * :: SetConsoleTitle(“哈希表操作“)/ / Windows API函数,设置控制台窗口标题

手柄HCON = :: GetStdHandle(STD_OUTPUT_HANDLE); / /得到标准输出设备处理

:: SetConsoleTextAttribute(HCON,10 | 0 )/ /设置文本颜色

* /

的printf(“\ N ------------------------哈希表的创建查找----------------------“);

InitNameList();

CreateHashList();

(1)

{

的printf(“\ N \ N”);

的printf(“1。显示哈希表\”);

printf(“请2查找\ N“);

的printf(”3。退出\ n“);

错误:

字符CH1 =的getchar的();

(CH1 = '1')

显示();

其他(CH1 = '2')

FindList();

其他(CH1 = '3')返回;

其他

{

的printf(“\ n请输入正确的选择!”);

转到犯错;

}

} }

java:哈希表的原理与用法?

Hashtable,原理嘛就不知道了。只知道说其是提供了两个集合之间映射的能力,并且拥有每个元素的查询时间近乎恒定的特性。两个集合之间映射的能力,简单的说,就是像是存放系统属性的Properties类一样(该类继承自Hashtable),Properties类中将String映射到String,你可以用setProperty(String key, String value)把一对值对(key,value)存入Properties中,用getProperty(String key) 取得key对应的value值。用System.getProperties()你可以获得一个系统属性的哈希表,直接println出来你就可以看到整个哈希表所构成的集合了。第一个元素应该是java.runtime.name=Java(TM) SE Runtime Environment这个。这里你可以看得出"java.runtime.name"被映射到了"Java(TM) SE Runtime Environment"。在这里你也可以调用System.getProperties().getProperty("java.runtime.name")得到字符串"Java(TM) SE Runtime Environment"。这就是哈希表所提供的功能了,将一个元素映射到另一个元素,这之间的映射所构成的集合就是哈希表了。

你可以自己看看API文档,里面有详细的解说,不过嘛,嘿嘿,中文版的那个翻译啊,哎,惨不忍睹啊,感触最多的是——主谓宾都难找啊。

JAVA中用哈希表怎么进行排序

Hashtable类

Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。

添加数据使用put(key,

value),取出数据使用get(key),这两个基本操作的时间开销为常数。

Hashtable通过initial capacity和load

factor两个参数调整性能。通常缺省的load factor

0.75较好地实现了时间和空间的均衡。增大load

factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。

使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:

Hashtable numbers = new

Hashtable();

numbers.put(“one”,

new Integer(1));

numbers.put(“two”, new

Integer(2));

numbers.put(“three”,

new Integer(3));

要取出一个数,比如2,用相应的key:

Integer

n = (Integer)numbers.get(“two”);

System.out.println(“two = ”

+ n);

由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。

如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。

Hashtable是同步的

实现哈希表java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于实现哈希表的建立和查找、实现哈希表java的信息别忘了在本站进行查找喔。