版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012292754/article/details/86606627
1 HashMap 和 HashTable
- 用法一样;
HashMap
效率高,线程不安全;HashTable
效率低,线程安全;
1.1 自己实现 Map (低效率版)
package day04.map;
/*
* 自定义实现 Map,效率低
* 根据键对象找对应的值对象,键不能重复
*
* */
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 containKey(Object key) {
for (MyEntry entry : arr) {
if (entry.key.equals(key)) {
return true;
}
}
return false;
}
public static void main(String[] args) {
MyMap m = new MyMap();
}
}
class MyEntry {
Object key;
Object value;
public MyEntry(Object key, Object value) {
this.key = key;
this.value = value;
}
}
1.2 自定义 Map(高效版)
package day04.map;
import java.util.LinkedList;
/*
* 自定义 Map 升级,提高查询效率
* */
public class MyMap2 {
//Map 的底层结构就是 数组 + 链表
LinkedList[] arr = new LinkedList[999];
int size;
public void put(Object key, Object value) {
MyEntry e = new MyEntry(key, value);
int a = key.hashCode() % arr.length;
if (arr[a] == null) {
LinkedList list = new LinkedList();
list.add(e);
arr[a] = list;
} else {
LinkedList list = arr[a];
for (int i = 0; i < list.size(); i++) {
MyEntry e2 = (MyEntry) list.get(i);
if (e2.key.equals(key)) {
e2.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) {
MyMap2 m = new MyMap2();
m.put("Mike", new Wife("Mary"));
m.put("Mike", new Wife("Sally"));
Wife w = (Wife) m.get("Mike");
System.out.println(w.name);
}
}