`
stchou
  • 浏览: 205198 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java 挂链 Hash表 手动实现

阅读更多

前些天一直在纠结的 挂链 Hash表 趁着今天中午的时间 终于把其实现了。

 

总所周知的

 

两种线性结构的存储数据结构     链表    数组

 

两者的优点:

 

链表  对所存储的元素需要经常增加删除的,这个结构使用起来比较方便

 

数组 对经常需要对元素查询的,使用就方便,直接使用下标就可以了。

 

那问题是有没有结合两者优点的东西呢,有~!那就是HASH表

 

Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。

 

挂链如下图所示:




 
     这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址(我所采用的是 其中的一种解决冲突的方法 挂连法)。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

 

 

 

package lesson1;

public class HashCode {

	private Node[] HashList;//哈希链表
	private int size=0;
	private int Have=0;
	
	//构造方法创建
	public HashCode(int size){
		HashList=new Node[size];
		this.size=size;
	}
	
	//获得大小
	public int getSize(){
		return size;
	}
	//获得哈希编码
	public int getHashCode(Object data){
		
		return data.hashCode()*32767%size;
	}
	
	//增加元素
	public void add(Object data){
		int index=getHashCode(data);//得到哈希码对应的元素下标
		//创建新的节点
		Node newN =new Node(data);
		if(HashList[index]==null){//哈希数组的index为空
			HashList[index]=newN;
		}else{//否则就加入到其的下拉链表中
			Node Next=HashList[index];
			if(Next.getData().equals(data)){//重复则不添加了
				return ;
			}
			while(Next.getNext()!=null){//递归找到最后为空的下来链表
				if(Next.getData().equals(data)){//重复则不添加了
					return ;
				}
				Next=Next.getNext();
			}
			Next.setNext(newN);//设置为其的下拉链表。即拉链法的核心
		}
		Have++;//统计元素个数
		if(Have+5>size){
			reHash();//再次哈希,降低冲突
		}
	}
	
	//删除一个
	public void remove(Object node){
		int index=getHashCode(node);
		if(HashList[index].getData()==node){//在首节点的情况
			if(HashList[index].getNext()==null){
				HashList[index]=null;//没有挂链的就直接移除了
			}else{//有挂链
				HashList[index]=HashList[index].getNext();
			}
			
			return ;
		}
		//要删除的在拉链中
		Node temp = HashList[index];
		Node last = null;
		//boolean flag=false;
		while(!temp.getData().equals(node)&&temp!=null){
			last=temp;
			temp=temp.getNext();
		}

		if(temp!=null&&temp.getData().equals(node)&&last!=null){
			last.setNext(temp.getNext());
		}
	}
	
	//再次哈希
	public void reHash(){
		 Node[] TempList =  HashList;
		 size = size *2;
		 HashList=new Node[size];
		 Have=0;
		 //在哈希放入原HashList中去
		 for (int i=0;i<size/2;i++){
			 if(TempList[i]!=null){
				 add(TempList[i].getData());
				 //加入挂链中的内容
				 while(TempList[i].getNext()!=null){
					 TempList[i]=TempList[i].getNext();
					 add(TempList[i].getData());
				 }
			 }
		 }
	}
	
	//打印全部的出来
	public void printAll(){
		for (int i=0;i<size;i++){
			Node temp =HashList[i];
			while(temp!=null){
				System.out.println(temp.getData());
				temp=temp.getNext();
			}
		}
	}
	
}



//节点的定义
class Node{
	private Object data;//节点的值
	public Node next;//下一个节点
	
	
	public Node(Object data){
		this.data=data;
	}
	//得到值
	public Object getData(){
		return data;
	}
	
	//得到下一个节点
	public Node getNext(){
		return next;
	}
	//设置下一个
	public void setNext(Node next){
		this.next=next;
	}
}

 

 

 

输入数据测试:

package lesson1;

public class hashMain {

	public static void main(String[] args){
		HashCode code = new HashCode(10);
		code.add(10);
		code.add(20);
		code.add(1);
		code.add(2);
		code.add(3);
		code.add(4);
		code.add(5);
		code.add(6);
		code.add(7);
		code.add(8);
		code.add(9);
		code.add(11);
		code.add(11);
		code.add(11);
		code.add(11);
		code.remove(20);
		code.printAll();
	}
}

 
得到:

3
6
9
1
4
7
10
2
5
8
11

 

效率是绝对是比链表高的,

 

感兴趣的可以自己测试下。

 

   Hash表 在追求效率方便还是有比较大的用处的。

 

   本人也是刚刚接触这个东西,有什么不足请大家多多指教~

 

  • 大小: 23.7 KB
6
1
分享到:
评论
2 楼 stchou 2010-11-19  
谢谢啦,我还没有注意到该问题,谢谢指导~
langyu 写道
1. 它的用处在哪,本意是做为set使用?
2. 这个方法可能会返回负数
public int getHashCode(Object data){            
    return data.hashCode()*32767%size;  
}  

3. 得注意放入对象的hashCode及equals方法

1 楼 langyu 2010-11-19  
1. 它的用处在哪,本意是做为set使用?
2. 这个方法可能会返回负数
public int getHashCode(Object data){            
    return data.hashCode()*32767%size;  
}  

3. 得注意放入对象的hashCode及equals方法

相关推荐

    挂链工具

    挂链工具的重要性在于,它们可以帮助SEO专业人员更有效地进行链接建设,节省手动操作的时间,并且能够以数据驱动的方式制定策略。但是,需要注意的是,过度依赖挂链工具或者采取不道德的挂链手段(如大规模群发低...

    SEO挂链工具SEO挂链工具

    SEO挂链工具就是利用这一机制,帮助用户在多个平台快速创建这些链接,节省手动操作的时间和精力。然而,需要注意的是,过度或不合规的挂链可能被搜索引擎视为垃圾链接,反而导致网站被降权甚至被封禁。 接下来,...

    黑链专用ftp挂链工具

    "FTP挂链工具"就是这类操作的一种辅助软件,它利用FTP(File Transfer Protocol)协议,允许用户远程管理服务器上的文件,包括上传、下载、删除等操作。 FTP挂链工具的主要功能是帮助用户便捷地在目标服务器上植入...

    FTP批量挂链工具 批量挂黒链

    FTP批量挂链工具是一种针对网站管理的工具,主要用于在多个FTP服务器上快速部署特定的链接代码,例如“黑链”。这种工具通常被用于SEO优化、网站推广或是非法的黑帽SEO活动,因为“挂黒链”指的是在网站上不透明地...

    网站提供挂链

    【网站提供挂链】是指网站为用户或站长提供的一个服务,允许他们将自己的链接挂在网站上,以提升其网站的曝光度、流量或者搜索引擎排名。挂链通常被用作一种网络营销策略,通过与其他网站建立链接关系,可以提高自身...

    苹果FTP批量扫描,附带批量挂链软件

    FTP批量扫描技术是一种网络工具,主要用于自动化地查找和连接FTP服务器,从而实现快速搜索和管理大量FTP站点。在IT行业中,这项技术常被用于网站管理员、SEO专家或网络安全专业人士进行大规模的数据采集、备份或者...

    拷贝具有随机指针节点的链表,

    在这个文件中,我们可以期待看到如何用Java实现链表节点的类,这个类将包含数据字段、常规的next指针以及随机的random指针。复制链表的过程可能会采用迭代或递归的方法,具体取决于代码设计。关键步骤可能包括: 1....

    FTP扫描工具挂链专用

    FTP扫描工具有时会被滥用,用于在未授权的情况下在FTP服务器上放置恶意链接,这种行为被称为黑帽SEO,会对被挂链的网站和网络环境带来负面影响。 为了有效利用FTP扫描工具,用户需要了解以下知识点: 1. **FTP协议...

    黑链工具包,全自动挂链,查链,PR查询,分类,自动补链

    黑链工具包,可以查询弱口令FTP,并实现全自动挂链,查链,PR查询,分类,掉链自动补链等等功能,是目前最好用,最稳定的黑链工具.

    ftp暴力破解 挂链工具

    ftp暴力破解 挂链工具 暴力破解功能异常强大 ,挂链工具有时候需要配合手动比较好,提高网站权重的必备shi

    批量扫描工具和批量挂链工具

    这是一种seo的工具,但不建议使用。望大家适量用吧。

    苹果FTP批量查链挂链工具

    苹果FTP批量查链挂链工具是一款专为苹果用户设计的高效工具,主要用于自动化地检查FTP服务器的连接状态和挂链情况。在IT行业中,FTP(File Transfer Protocol)是一种广泛使用的网络协议,允许用户通过网络传输文件...

    网站SEO黑链智能收集批量挂链软件V6.16+注册机

    网站SEO黑链智能收集批量挂链软件V6.16+注册机

    批量扫描工具和批量挂链工具1

    【标题】:“批量扫描工具和批量挂链工具1”指的是在网络优化中使用的工具,主要用于提升网站权重和搜索引擎排名。这类工具通常包括两个主要功能:批量扫描和批量挂链。 【批量扫描工具】:批量扫描工具的主要作用...

    FTP密探%2B自动挂链完美破解

    FTP密探%2B自动挂链完美破解FTP密探%2B自动挂链完美破解

    苹果FTP密探扫描+挂链

    "苹果FTP密探扫描+挂链"工具是针对SEO(Search Engine Optimization,搜索引擎优化)的专业工具,它结合了FTP扫描和链接挂载的功能,帮助用户更好地管理和优化其网站的搜索引擎排名。 FTP扫描功能主要是对目标...

    FTP挂链工具

    FTP挂链工具是一种用于在互联网上进行文件传输的软件应用,它使得用户能够方便地将本地计算机上的文件上传到远程服务器,或者从服务器下载文件到本地。FTP(File Transfer Protocol)是互联网上的一种标准协议,专门...

    电信设备-多功能移动手机挂链.zip

    2. **功能详解**:逐一解析挂链的各项功能,如SIM卡读取功能如何帮助用户在没有备用手机的情况下更换SIM卡,数据传输功能如何实现手机与其他设备的便捷互联,以及应急电源功能的容量和充电效率等。 3. **技术规格**...

    FTP密探+批量挂链.zip

    FTP密探+批量挂链

    手机挂链圆珠笔PPT小插图.rar

    "手机挂链圆珠笔PPT小插图.rar" 是一个包含与文具相关的小插图素材的压缩文件,适合用于制作教育、商务或个人演示文稿,提升视觉效果并吸引观众注意力。 首先,我们要了解什么是RAR文件。RAR是一种流行的压缩文件...

Global site tag (gtag.js) - Google Analytics