package com.wpr.collection;

import java.util.LinkedList;
import java.util.List; public class HashTable<AnyType> { private static final int DEFAULT_TABLE_SIZE = 101; private List<AnyType>[] theList;
private int curSize; public HashTable() {
this(DEFAULT_TABLE_SIZE);
} public HashTable(int size) {
//构造一个质数长度的链表
this.theList = new LinkedList[nextPrime(size)];
for(int i=0;i<theList.length;i++){
theList[i]= new LinkedList<>();
}
}
/**
* 插入,如果元素已经存在,直接返回
* @param x
*/
public void insert(AnyType x){
List<AnyType> temp = theList[myHast(x)];
if(!temp.contains(x)){
temp.add(x);
if(++curSize>theList.length)
reHash();
}
}
/**
* 表的size太小,数据的长度和表长相等时重新调整表长,装填因子为1
*/
private void reHash() {
List<AnyType>[] old = theList;
theList = new LinkedList[theList.length*2];
//更新hashTable
for(int i=0;i<theList.length;i++)
theList[i]=new LinkedList<>();
curSize = 0; for(int i=0;i<old.length;i++){
for(AnyType x:old[i])
insert(x);
}
} public void clear(){
for(List l:theList){
l.clear();
}
}
public void remove(AnyType x){
List<AnyType> temp = theList[myHast(x)];
if(temp.contains(x)){
temp.remove(x);
curSize--;
}
}
public boolean contain(AnyType x){
List<AnyType> temp = theList[myHast(x)];
return temp.contains(x);
}
/**
* 计算数据的hash值
* @param x
* @return
*/
private int myHast(AnyType x) {
int hashValue = x.hashCode(); hashValue%=theList.length;
if(hashValue<0)
hashValue+=theList.length;
return hashValue;
} /**
* 返回一个比size大的质数
* @param size
* @return
*/
private int nextPrime(int size) {
if(size%2==0)
size++;
while(!isPrime(size)){
size +=2;
}
return 0;
}
/**
* 判断size是否为质数
* @param size
* @return
*/
private boolean isPrime(int size) {
if(size%2==0||size==1)
return false;
if(size==2 || size==3)
return true;
for(int i=3;i<Math.sqrt(size);i+=2){
if(size%i==0)
return false;
}
return true;
}
}

My集合框架第四弹 HashTable(链表解决冲突)的更多相关文章

  1. Java集合框架的四个接口

    接口 [四个接口  collection  list  set  map 的区别] collection 存储不唯一的无序的数据 list 存储有序的不唯一的数据 set   存储无序的唯一的数据 m ...

  2. Java源码解析——集合框架(四)——LinkedListLinkedList原码分析

    LinkedList源码分析 LinkedList也和ArrayList一样实现了List接口,但是它执行插入和删除操作时比ArrayList更加高效,因为它是基于链表的.基于链表也决定了它在随机访问 ...

  3. Java基础知识强化之集合框架笔记67:Hashtable的实现原理

    至于Hashtable的实现原理,直接参考网友的博客,总结很全面: 深入Java集合学习系列:Hashtable的实现原理

  4. java 集合框架(十四)Queue

    一.概述 Queue一种队列结构集合,用来存储将要进行处理的元素.通常以FIFO的方式排序元素,但这并不是必须的.比如优先度队列就是一个例外,它是以元素的值来排序.但无论怎样,每个Queue的实现都必 ...

  5. My集合框架第三弹 AVL树

    旋转操作: 由于任意一个结点最多只有两个儿子,所以当高度不平衡时,只可能是以下四种情况造成的: 1. 对该结点的左儿子的左子树进行了一次插入. 2. 对该结点的左儿子的右子树进行了一次插入. 3. 对 ...

  6. Java集合框架(四)—— Queue、LinkedList、PriorityQueue

    Queue接口 Queue用于模拟了队列这种数据结构,队列通常是指“先进先出”(FIFO)的容器.队列的头部保存在队列中时间最长的元素,队列的尾部保存在队列中时间最短的元素.新元素插入(offer)到 ...

  7. 一、集合框架(HashMap和Hashtable的区别)

    一.HashMap和Hashtable 都实现了Map接口,都是以key-value形式保存数据. 区别一: HashMap可以存放null Hashtable不能存放null 区别二: HashMa ...

  8. java集合框架之HashMap和Hashtable的区别

    参考http://how2j.cn/k/collection/collection-hashmap-vs-hashtable/692.html#nowhere HashMap和Hashtable的区别 ...

  9. My集合框架第六弹 左式堆

    左式堆(Leftist Heaps)又称作最左堆.左倾堆.左式堆作为堆的一种,保留了堆的一些属性. 第1,左式堆仍然以二叉树的形式构建: 第2,左式堆的任意结点的值比其子树任意结点值均小(最小堆的特性 ...

随机推荐

  1. 07day2

    居然是动规专场.这样不好吧?   采药 [问题描述] 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到 ...

  2. 【英语】Bingo口语笔记(70) - 最易忽略的2个连读技巧

  3. Eclipse将android项目打包jar文件

    Eclipse+android打包jar文件 蔡建良 2016-3-12 以Android-SlideExpandableListView开源框架为例,将源码Library打包成jar文件并包含R.c ...

  4. GET与POST在什么情况下使用

    GET与POST 你可能想了解GET和POST之间有什么区别,并想知道什么时候使用它们.从理论上讲,如果请求是幂等的就可以使用GET,所谓幂等是指多个请求返回相同的结果.实际上,相应的服务器方法可能会 ...

  5. cocos2dx+lua中cc.EventListenerMouse:create()的bug

    今天在调试项目的时候用到了鼠标事件的监听 在创建事件监听器的时候出了问题 cc.EventListenerMouse:create() 这句返回值为nil 原来这是cocos2dx引擎的一个bug,t ...

  6. [Papers]NSE, $u$, Lorentz space [Bjorland-Vasseur, JMFM, 2011]

    $$\bex \int_0^T\frac{\sen{\bbu}_{L^{q,\infty}}^p}{\ve+\ln \sex{e+\sen{\bbu}_{L^\infty}}}\rd s<\in ...

  7. Cent OS5.2安装Hyper-V集成光盘

    一.Hyper-V安装windows系统没有问题,windows2000以后系统都可以,一切顺利. 驱动程序:IDE.SCSI.网络.视频和鼠标 要想实现更强的功能,宿主机需要安装Hyper-V集成光 ...

  8. pdm 中怎么修改表的Name值时使Code值不变

    修改方法:PowerDesign中的选项菜单里修改,在[Tool]-->[General Options]->[Dialog]->[Operating modes]->[Nam ...

  9. HTTP协议学习笔记-1

    基本概念 首先需要了解几个概念: WEB客户端和服务器: WEB客户端当然就是指我们用使用的某个网站 服务器就是WEB资源源头,我们从服务器去请求数据,服务器把请求的数据发给WEB客户端 媒体类型: ...

  10. 编码的UI测试项目——Visual Studio 2013

    今天实现了一次编码的UI测试项目,以下是我进行测试的过程: 1.新建测试项目 在visual studio中(我用的版本是2013 update2)点击文件->新建->项目,选择“编码的U ...