Map接口的实现类:HashMap和TreeMap
三个特点:存放键值对,根据键对象找对应的值对象,键不能重复。
如下方法中,对Map的put和get都是使用的数组索引。
/**
*
*/
package com.sunlei;
/**
*@author 作者:sunlei
*@version 创建时间:2018年3月1日下午4:39:25
*说明
*/
public class MyMap {
MyEntry[] arr = new MyEntry[990];
int size;
public void put(Object key,Object value) {
MyEntry e = new MyEntry(key,value);
for(int i=0;i<size;i++) {
if(arr[i].key.equals(key)) {
arr[i].value = value;
return ;
}
}
arr[size++] = e;
}
public Object get(Object key){
for(int i=0;i<size;i++) {
if(arr[i].key.equals(key)) {
return arr[i].value;
}
}
return null;
}
public boolean containsKey(Object key) {
for(int i=0;i<size;i++) {
if(arr[i].key.equals(key)) {
return true;
}
}
return false;
}
public static void main(String[] args) {
MyMap map = new MyMap();
map.put("sunlei", "123");
map.put("zhangsan", "456");
Object value = map.get("sunlei");
System.out.println(value);
System.out.println(map.containsKey("sunlei"));
}
}
class MyEntry{
Object key;
Object value;
public MyEntry() {
}
public MyEntry(Object key,Object value) {
super();
this.key = key;
this.value = value;
}
}
在JDK中底层实现Map是通过数组+链表实现的:
通过a = key.hashCode()%arr.length;来确定存放数组的索引,通过链表来解决hash冲突。
/**
*
*/
package com.sunlei;
import java.util.LinkedList;
/**
*@author 作者:sunlei
*@version 创建时间:2018年3月2日上午9:17:21
*/
public class MyMap02 {
LinkedList[] arr = new LinkedList[999];
int size;
public void put(Object key,Object value){
MyEntry e = new MyEntry(key,value);
int hash = key.hashCode();
hash = hash < 0 ? -hash : hash; //判断hashcode是否为负数
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++) {
MyEntry me = (MyEntry) list.get(i);
if(me.key.equals(key)) {
me.value = value;
return;
}
}
arr[a].add(e);
}
}
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++) {
MyEntry e = (MyEntry) list.get(i);
if(e.key.equals(key)) {
return e.value;
}
}
}
return null;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MyMap02 map = new MyMap02();
map.put("孙磊", "123");
map.put("孙磊", "456");
Object value = map.get("孙磊");
System.out.println(value);
}
}