生活随笔
收集整理的這篇文章主要介紹了
【147天】尚学堂高淇Java300集视频精华笔记(108-109)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第108集:容器equals和hashcodeJDK源代碼分析
本集知識點
Java中規定,若兩個對象equals比較后內容相等(為true),則hashCode必須相等,反之不然?!驹蛞妰却娣治鰣D】
hashCode與equals方法必須同時重寫,且必須保證第一點。
父類Object的hashCode()是用內存地址計算,而equals比較的是它是否是同一個對象。
package com.collection;public class Student {private int id;private String name;@Overridepublic int hashCode() {final int prime = 31;//這里一般取質數,做個散列算法,讓值分布均勻int result = 1;result = prime * result + id;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Student other = (Student) obj;if (id != other.id)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}}
package com.collection;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class TestEquals {public static void main(String[] args){List list = new ArrayList();String s1 = "aaa";String s2 = "aaa";list.add(s1);list.add(s2);System.out.println(list.size());Map map = new HashMap();map.put(s1, "ccc");map.put(s2, "ssss");System.out.println(map.get(s1));}
}
第109集:容器ListMap底層源碼再分析bug解決
兩個細節的改進
改進遍歷的效率——可以先與中間的數比較,然后決定從前面還是后面開始找。
hashcode可能返回負值
public Node node(int index){Node temp = null;if(first!=null){if(index < (size>>1)){temp = first;for(int i=0;i<index;i++){temp = temp.next;}} else {temp = last;for(int i=size-1;i>index;i--){temp = temp.next;}}}return temp;} package com.collection;import java.util.LinkedList;public class SxtMap002 {LinkedList[] arr = new LinkedList[999];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);}}
}
總結
以上是生活随笔為你收集整理的【147天】尚学堂高淇Java300集视频精华笔记(108-109)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。