Java散列和散列码的实现
转自:https://blog.csdn.net/al_assad/article/details/52989525
- <span style="color:#000000;">import java.util.*;
- public class SimpleHashMap<K,V> extends AbstractMap<K,V>{
- static final int SIZE = 997; //默认bucket数量;
- @SuppressWarnings("unchecked")
- LinkedList<MapEntry<K,V>>[] buckets = new LinkedList[SIZE];
- //放置映射关系,返回原先的映射Value;
- public V put (K key, V value){
- int index = Math.abs(key.hashCode()) % SIZE;
- if(buckets[index] == null)
- buckets[index] = new LinkedList<MapEntry<K, V>>();
- V oldValue = null;
- LinkedList<MapEntry<K,V>> bucket = buckets[index];
- MapEntry<K, V> pair = new MapEntry<K,V>(key,value);
- ListIterator<MapEntry<K,V>> iter = bucket.listIterator();
- //检查重复key,更新value
- boolean found = false;
- while(iter.hasNext()){
- MapEntry<K,V> tempPair = iter.next();
- if(tempPair.getKey().equals(key)){
- oldValue = tempPair.getValue();
- iter.set(pair);
- found = true;
- break;
- }
- }
- if(!found)
- buckets[index].add(pair);
- return oldValue;
- }
- public V get(Object key){
- int index = Math.abs(key.hashCode()) % SIZE;
- if(buckets[index] == null)
- return null;
- for(MapEntry<K,V> pair : buckets[index]){
- if(pair.getKey().equals(key))
- return pair.getValue();
- }
- return null;
- }
- @Override
- public Set<Map.Entry<K, V>> entrySet() {
- Set<Map.Entry<K, V>> set = new HashSet<Map.Entry<K,V>>();
- for(LinkedList<MapEntry<K,V>> bucket : buckets){
- if(bucket == null)
- continue;
- for(MapEntry<K,V> pair : bucket)
- set.add(pair);
- }
- return set;
- }
- class MapEntry<K,V> implements Map.Entry<K, V>{
- K key;
- V value;
- public MapEntry(K key,V value){
- this.key = key;
- this.value = value;
- }
- @Override
- public K getKey(){
- return this.key;
- }
- @Override
- public V getValue() {
- return this.value;
- }
- @Override
- public V setValue(V value) {
- return this.value = value;
- }
- }
- /*实现可以引用在在HashMap对象的key对象,该对象必须实现hashCode方法*/
- import java.util.*;
- public class CountString {
- private static List<String> created = new ArrayList<String>();
- //用于记录一次程序运行创建的所哟 String s实例,当s发生重复时,生成唯一的id,以产生唯一的散列值;
- private String s ; //用于记录内容的数据域
- private int id = 0; //记录相同String的CountString对象的编号
- public CountString(String str){
- this.s = str;
- created.add(s);
- for(String e : created){
- if(e.equals(s))
- this.id++;
- }
- }
- public int hashCode(){
- int result = 17; //设置初始偏移量
- result = 37*result + s.hashCode(); //37稀释值
- result = 37*result + id; //进行第二次稀释,放置ID值破坏s.hasCode;
- return result;
- }
- public boolean equals(Object o){
- return o instanceof CountString && s.equals(((CountString)o).getS())
- && id == ((CountString)o).getId();
- }
- public String getS(){
- return this.s;
- }
- public int getId(){
- return this.getId();
- }
- public String toString(){
- return "String:"+s+" id:"+id+" hashCode: "+hashCode();
- }
- }
- </span>
Java散列和散列码的实现的更多相关文章
- 【Java集合学习】HashMap源码之“拉链法”散列冲突的解决
1.HashMap的概念 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io ...
- java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列
java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列 package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象 ...
- [转]java.sql.SQLException: 无效的列索引
原文地址:http://blog.sina.com.cn/s/blog_6bc811e401011a17.html java.sql.SQLException: 无效的列索引 “无效的列索引”其实是个 ...
- java.sql.SQLException: 无效的列索引
java.sql.SQLException: 无效的列索引 "无效的列索引"其实是个低级的错误,原因无非几个: 1.sql串的?号数目和提供的变量数目不一致: 例如:jdbcTem ...
- Java.sql.SQLException: 无效的列类型: 1111
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: ...
- Cause: java.sql.SQLException: 无效的列索引
今天调试代码发现“Cause: java.sql.SQLException: 无效的列索引”,查资料得出结论如下: 1.sql串的?号用''括了起来. 例如:select* from user t ...
- oracle: jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的列类型: 1111
https://www.cnblogs.com/mmlw/p/5808072.html org.mybatis.spring.MyBatisSystemException: nested except ...
- Java JTable列顺序和列宽度保存在用户本地
上周碰到了一个棘手的需求,就是要把用JTable的列顺序和列宽度保存下来,这次用户调整了列宽度,关闭程序,下次再打开时,这个列的宽还是要保持,因为SWing的特性,都是在程序启动时就确定了列顺序和列宽 ...
- java学习-zxing生成二维码矩阵的简单例子
这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件,也可使用maven添加依赖 <dependency> <gr ...
随机推荐
- Hadoop文件解压缩
Class org.apache.hadoop.io.compress .CompressionCodecFactory A factory that will find the correct co ...
- MySQL加速查询速度的独门武器:查询缓存
[导读] 与朋友或同事谈到MySQL查询缓存功能的时候,个人喜欢把查询缓存功能Query Cache比作荔枝, 是非常营养的东西,但是一次性吃太多了,就容易上火而流鼻血,虽然不是特别恰当的比喻,但是有 ...
- javascript跨域訪问探索之旅
需求: 近期工作负责一个互联网应用A(我公司应用)与还有一个互联网应用B进行通讯.通讯的方式是这种:还有一个互联网应用某些表单信息须要从我公司的互联网应用获取.首先用户訪问互联网应用B ...
- 探索Popupwindow-对话框风格的窗体(
Android中还是会经经常使用到Popupwindow.一种类似于对话框风格的窗体,当然类似于对话框风格也能够用Activity,能够參考:Android中使用Dialog风格弹出框的Activit ...
- cocoa pods 升级遇到的问题
1. cocoa pods 升级遇到的问题 运行 sudo gem update --system 报错 Updating rubygems-update ERROR: While executing ...
- Flask系列:数据库
这个系列是学习<Flask Web开发:基于Python的Web应用开发实战>的部分笔记 对于用户提交的信息,包括 账号.文章 等,需要能够将这些数据保存下来 持久存储的三种方法: 文件: ...
- mysql替换成指定字符
,,, ), 'XXXX' )-- 隐藏从第四位开始的6个字符,包括第四个字符,替换成X
- golang https server分析
https: HTTPS是http安全版本的实现,在http与tcp之间加了一层ssl/tls安全传输协议 为了防止请求被监听.篡改.冒充,在tls实现过程中引入了数字证书机制,数字证书由第三方权威机 ...
- cubieboard 资源
开发链接: http://pan.baidu.com/s/1o6r27V0 密码: 46h2 文档资料: http://pan.baidu.com/s/1kTFXMSZ 密码: 9pka 视频资料: ...
- Jquery Deferred 详解
近期由于公司项目主要由我来负责前端,所以打算优化一下代码.在jquery 里面有个Deferred的对象.为了研究这个也看了不少资料,其中阮一峰的博客写的很详细,这里转载一下. 一.什么是deferr ...