public class HashTable{

private String[] name;    //关键字

private int sum;    //容量

public static void main(String[] args){    //测试

HashTable ht = new HashTable();

ht.add("chenhaitao");

ht.add("zhongcheng");

ht.add("baiyudong");

ht.add("huangshiyao");

ht.add("djflkd");

ht.add("gg");

System.out.println(ht.contains("baiyudong"));

ht.remove("huangshiyao");

System.out.println(ht.contains("huangshiyao"));

ht.print();

}

public HashTable(){             //初始化,初始容量是10个

name = new String[10];

sum = 0;

}

public int hash1(String s){                                       //哈希函数

return Math.abs(s.hashCode())%name.length;

}

public int hash2(String s){                                     //处理冲突的哈希函数

int result = Math.abs(s.hashCode())%(name.length-1);

System.out.println(s+"--"+result);

if(result%2==0){

return result + 1;

}

return result;

}

public boolean contains(String s){                  //哈希表里面是否包含字符串s

int start = hash1(s);

int i = start;

while (name[i] != null){

if(name[i].equals(s)){

return true;

}

i = (i + hash2(s))%name.length;

if(i == start){

return false;

}

}

return false;

}

public void add(String s){

if(sum>=name.length/2){

this.rehash();

}

int start = hash1(s);

int i = start;

while(name[i] != null){

if(s.equals(name[i])){

return;

}

i = (i + hash2(s))%name.length;

if(i == start){

return;

}

}

name[i] = s;

sum ++;

}

public void rehash(){                              //扩建一个哈希表为原表的两倍,把原来的哈希表添加到新表中

HashTable ht = new HashTable();

ht.name = new String[this.name.length * 2];

for(int i = 0; i < this.name.length; i ++){

if((this.name[i] != null)){

ht.add(this.name[i]);

}

}

this.name = ht.name;

this.sum = ht.sum;

}

public void remove(String s){                     //删除某个元素

if(this.contains(s)){

int i = this.getValue(s);

this.name[i] = null;

}

}

public int getValue(String s){                //得到s在哈希表中的位置

int start = this.hash1(s);

int i = start;

while(this.name[i] != null){

if(this.name[i].equals(s)){

return i;

}

i = (i + this.hash2(s))%this.name.length;

if(i == start){

return -1;

}

}

return -1;

}

public void print(){                       //输出哈希表中所有元素

for(int i = 0; i < name.length; i ++){

System.out.println(i+":"+name[i]);

}

}

public int size(){          //哈希表存储元素的个数

return this.sum;

}

public int length(){            //哈希表的长度

return this.name.length;

}

}

java HastTable实现的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. HashSet HashTable HashMap的区别 及其Java集合介绍

    (1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到). (2)HashSet以对象作为元素,而HashMap ...

  3. JAVA的HashTable源码分析

    Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长.Hashtable ...

  4. Java /C# 实现文件压缩

    纯粹为了记录. 参考了 https://www.cnblogs.com/zeng1994/p/7862288.html import java.util.List; import java.util. ...

  5. Java面试(二)

    1 同步方法 VS 同步代码块: java中,每一个对象都有一把锁,线程用synchronized获取对象上的锁. 非静态同步方法:锁是类的对象的锁. 静态同步方法:锁的是类本身. 同步方法块:锁是可 ...

  6. java中hashmap和hashtable和hashset的区别

    hastTable和hashMap的区别:(1)Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现.(2)这个不同即是最重要的一点:Ha ...

  7. 由Java 15废弃偏向锁,谈谈Java Synchronized 的锁机制

    Java 15 废弃偏向锁 JDK 15已经在2020年9月15日发布,详情见 JDK 15 官方计划.其中有一项更新是废弃偏向锁,官方的详细说明在:JEP 374: Disable and Depr ...

  8. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  9. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

随机推荐

  1. cocos2dx_moveby_n_moveto

    对于参数(SEC, POINT)来说,CCMoveTo是移动到WND的绝对的POINT,CCMoveBy是相对当前位置移动一个相当于(0,0)到POINT的向量.

  2. Class Fxp\Composer\AssetPlugin\Repository\NpmRepository does not exist

    使用 composer 安装 laravel 时报错, 如下: [ReflectionException] Class Fxp\Composer\AssetPlugin\Repository\NpmR ...

  3. 卸载AMH 5.0面板的具体办法

    安装AMH 5.0面板只有YES.NO和EXIT,和AMH 4.X的安装.卸载.退出有点不同,那么如何卸载AMH 5.0面板呢? 1.root登录ssh 2.输入如下命令: killall php-f ...

  4. JDK自带方法实现RSA数字签名

    JDK 6只支持MD2withRSA, MD5withRSA, SHA1withRSA 其他的如SHA512withRSA需要第三方包支持,如BC(bouncy castle) --20151126 ...

  5. CI框架篇之模型篇--初识(1)

    模型 模型是专门用来和数据库打交道的PHP类.例如,假设你想用CodeIgniter来做一个Blog. 你可以写一个模型类,里面包含插入.更新.删除Blog数据的方法. 下面的例子将向你展示一个普通的 ...

  6. ListView优化分页优化

    缘由 我们在用ListView展现数据的时候.比如展现联系人,如果联系人太多就会出现卡的现象,比如如果有1000多条数据,从数据库里查询,然后装载到List容器这段时间是比较耗时的.虽然我们可以用as ...

  7. A题笔记(9)

    No.2283 No.1387 vector<vector<char> > before, after; 可以创建一个容器的容器,注意 char 后的两个 “>” ,之间 ...

  8. IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

    进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dis ...

  9. ACM HDU 1021 Fibonacci Again

    #include<iostream> using namespace std; int main() { int n; while(cin>>n) { if((n+1)%4== ...

  10. Photon开发实战(2)——开发框架、第一个Photon程序

    Photon基础开发框架 Photon (v4)的基本框架.开发框架主要Photon和游戏逻辑(C#)两个部分,如下图最新的Photon v4支持的4种底层协议,游戏开发逻辑Photon目前主要划分为 ...