0 Map
HashMap:线程不安全
HashTable:线程安全
1
hashcode和equals方法要重写的时候要一起重写,保证equals一样的情况下 hashcode一定相等,一般情况下不需要重写。
hashcode: 默认返回地址, 在使用eclipse定义的Javabean中自动生成的hashcode中,会生成一个防范来进行散列。
equals: 默认根据两个对象的地址进行比较
如果equals为true,则hashcode一定相等,而如果 hashcode相等,但是 equals不一定一样。
2 自定义map, 还是用数组接收:
第一种写法:
public class SxtMap001 { SxtEntry[] arr = new SxtEntry[990]; // 还是使用数组来存储, 而数组的组成体是 自定义的bean,里面有k v两个属性 int size; public void put(Object key,Object value){ SxtEntry e = new SxtEntry(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 boolean containsValue(Object value){ for(int i=0;i<size;i++){ if(arr[i].value.equals(value)){ return true; } } return false; } public static void main(String[] args) { SxtMap001 m = new SxtMap001(); m.put("zm", new Wife("liangliang")); m.put("zm", new Wife("meimei")); Wife w = (Wife) m.get("zm"); System.out.println(w.name); } } class SxtEntry { Object key; Object value; public SxtEntry(Object key, Object value) { super(); this.key = key; this.value = value; } }
第二种写法:
public class SxtMap002 {
//特殊的数组,组成数组的元素是LinkedList eg String[] 则数组成员是String
LinkedList[] arr = new LinkedList[9]; //Map的底层结构就是:数组+链表!
int size;
public void put(Object key,Object value){
SxtEntry e = new SxtEntry(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++){
SxtEntry e2 = (SxtEntry) list.get(i);
if(e2.key.equals(key)){
e2.value = value; //键值重复直接覆盖!
return;
}
}
arr[a].add(e);
}
//a:1000-->1 b:10000-->13
}
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++){
SxtEntry e = (SxtEntry) list.get(i);
if(e.key.equals(key)){
return e.value;
}
}
}
return null;
}
public static void main(String[] args) {
SxtMap002 m = new SxtMap002();
m.put("zm", new Wife("liangliang"));
m.put("zm", new Wife("huanghuang"));
Wife w = (Wife) m.get("zm");
System.out.println(w.name);
}
}
第二种写法的图: