HashMap的自定义实现
一、背景:
package com.cy.collection; public class Wife {
String name; public Wife(String name){
this.name = name;
} @Override
public String toString() {
return "Wife [name=" + name + "]";
}
}
Map.java:
package com.cy.collection; /**
* 自定义实现Map
*/
public class Map {
private Entry[] arr = new Entry[1000]; //这里暂时不考虑扩容
private int size; //这里都是private的,不暴露size属性 /**
* 1.键不能重复,如果含有这个键,就替换value
* @param key
* @param value
*/
public void put(Object key, Object value){
for(int i=0; i<size; i++){
if(arr[i].key.equals(key)){
arr[i].value = value;
return;
}
}
arr[size++] = new Entry(key, value);
} //根据key获取
public Object get(Object key){
for(int i=0; i<size; i++){
if(arr[i].key.equals(key)){
return arr[i].value;
}
}
return null;
} //根据key删除
public boolean remove(Object key){
boolean success = false;
for(int i=0;i<size;i++){
if(arr[i].key.equals(key)){
success = true;
remove(i);
}
}
return success;
}
private void remove(int i){
int numMoved = size - i - 1;
if(numMoved>0){
System.arraycopy(arr, i+1, arr, i, numMoved);
}
arr[--size] = null; //Let gc do its work
} //containsKey
public boolean containsKey(Object key){
for(int i=0; i<size; i++){
if(arr[i].key.equals(key)){
return true;
}
}
return false;
} //containsValue 同containsKey //size
public int size(){
return size;
}
} /**
* 用来存放键值对的条目
*/
class Entry{
Object key;
Object value; public Entry(Object key, Object value) {
super();
this.key = key;
this.value = value;
}
}
Test.java测试代码:
package com.cy.collection; public class Test { public static void main(String[] args) {
Map map = new Map();
map.put("张三", new Wife("abc"));
map.put("李四", new Wife("def"));
map.put("王五", new Wife("ghi"));
System.out.println(map.get("张三"));
map.remove("李四");
System.out.println(map.size()); map.put("张三", new Wife("aaa"));
System.out.println(map.get("张三"));
System.out.println(map.containsKey("张三"));
} } 输出:
Wife [name=abc]
2
Wife [name=aaa]
true
二、map改进,哈希算法实现,使用数组和链表

package com.cy.collection; import java.util.LinkedList; /**
* 自定义实现Map升级版
* 1.提高查询的效率
*/
public class Map {
private LinkedList[] arr = new LinkedList[1000]; //Map的底层结构就是:数组+链表
private int size; /**
* 1.键不能重复,如果含有这个键,就替换value
*/
public void put(Object key, Object value){
Entry e = new Entry(key, value);
int hash = key.hashCode();
hash = hash<0?-hash:hash;
int a = hash % arr.length; if(arr[a]==null){
LinkedList list = new LinkedList();
arr[a] = list;
list.add(e);
}else{
LinkedList list = arr[a];
for(int i=0; i<list.size(); i++){
Entry en = (Entry) list.get(i);
if(en.key.equals(key)){
en.value = value; //键值重复,覆盖value
return;
}
}
list.add(e);
}
size++;
} //根据key获取值
public Object get(Object key){
int a = key.hashCode() % arr.length;
if(arr[a]!=null){
LinkedList list = arr[a];
for(int i=0; i<list.size(); i++){
Entry e = (Entry) list.get(i);
if(e.key.equals(key)){
return e.value;
}
}
}
return null;
} //size
public int size(){
return size;
}
} /**
* 用来存放键值对的条目
*/
class Entry{
Object key;
Object value; public Entry(Object key, Object value) {
super();
this.key = key;
this.value = value;
}
}
Test.java
package com.cy.collection; public class Test { public static void main(String[] args) {
Map map = new Map();
map.put("张三", new Wife("abc"));
map.put("李四", new Wife("def"));
map.put("张三", new Wife("ghi"));
System.out.println(map.get("张三"));
System.out.println(map.size());
} } 输出:
Wife [name=ghi]
2
HashMap的自定义实现的更多相关文章
- HashMap存储自定义类型键值和LinkedHashMap集合
HashMap存储自定义类型键值 1.当给HashMap中存放自定义对象时,如果自定义对象是键存在,保证键唯一,必须复写对象的hashCode和equals方法. 2.如果要保证map中存放的key和 ...
- 集合框架-Map集合-HashMap存储自定义对象
1 package cn.itcast.p6.hashmap.demo; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 im ...
- HashSet的自定义实现
package com.cy.collection; import java.util.HashMap; /** * HashSet自定义实现 * 是使用hashMap实现的 * 可以看一下HashS ...
- Java 集合学习--HashMap
一.HashMap 定义 HashMap 是一个基于散列表(哈希表)实现的键值对集合,每个元素都是key-value对,jdk1.8后,底层数据结构涉及到了数组.链表以及红黑树.目的进一步的优化Has ...
- springboot 简单自定义starter - beetl
使用idea新建springboot项目beetl-spring-boot-starter 首先添加pom依赖 packaging要设置为jar不能设置为pom<packaging>jar ...
- 通过简单的两数相加体会hashmap的好处
目录 引入题目:两数相加 HashMap相关知识: Map集合 Map集合的特点 Map常用子类 HashMap集合 LinkedHashMap集合 Map集合的常用方法 Map集合的第一种遍历方式: ...
- Java 之 HashMap 集合
一.HashMap 概述 java.util.HashMap<k,v> 集合 implements Map<k,v> 接口 HashMap 集合的特点: 1.HashMap 集 ...
- hashmap存储数据
在HashMap中,为什么不能使用基本数据类型作为key? 其实和HashMap底层的存储原理有关,HashMap存储数据的特点是:无序.无索引.不能存储重复元素. 存储元素采用的是hash表存储数据 ...
- HashMap -双列集合的遍历与常用的方法
package cn.learn.Map; /* java.util.Hashtable<k,y> implements Map<k,v> 早期双列集合,jdk1.0开始 同步 ...
随机推荐
- 给电脑换源 npm 国内镜像 cnpm
(1)通过 config 配置指向国内镜像源 npm config set registry http://registry.cnpmjs.org //配置指向源 npm info express ...
- MyBatis #{} 取值注意事项
正确写法#{key} 错误写法#{key } #{}中不能加空格,不然会报错
- 大型网站系统与Java中间件实践读书笔记
转载:http://blog.csdn.net/ioscodelover/article/details/45047869 1.分布式系统相对集中式而言,是指多台计算机互相通过消息通信进行协作而对外提 ...
- set 基础知识
#include <iostream> #include <set> using namespace std; int main() { set<int> s; s ...
- JAVA的初始化顺序:
JAVA的初始化顺序: 父类的静态成员初始化>父类的静态代码块>子类的静态成员初始化>子类的静态代码块>父类的代码块>父类的构造方法>子类的代码块>子类的构造 ...
- day09 MapReduce
, PS:上图为MapReduce原理全解剖, 图上带红色标识的部分是能够自定义的1.首先要解决读文件的问题. mapTask中有个read()方法,专门负责读取键值对,而且是整行整行的读2.在读好文 ...
- Queue接口的实现类竟然有一个是LinkedList,一个是优先队列(同一个接口,只改了不同的实现类,附源码)
输出是: Queue接口底层换一个实现类,照样的是调用Queue接口中的方法 import java.util.HashMap; import java.util.LinkedList; import ...
- Java打印水仙花数
public class Test2 { public static void main(String[] args) { //水仙花 数 指的是一个三位数(100-999) //三位数本身= 百位数 ...
- Singer 开源便捷的ETL 工具
singer 是一个强大,灵活的etl 工具,我们可以方便的提取web api,file,queue,基本上各种你可以想到的 数据源. singer 有一套自己的数据处理规范, taps, targe ...
- c++简单的ATL COM开发和调用实例
1.打开VS2010.新建ATL COM 项目.步骤:"文件" -->"新建" -->"项目",选择"Visual C ...