學習內容:css
hashmap原理:java
經常使用API是put(K,V)和get(K)。map中鍵是惟一的,咱們調用put存值時,HashMap首先會調用K的hashCode方法,獲取哈希碼,經過哈希碼快速找到某個存放位置,這個位置能夠被稱之爲bucketIndex,經過hashCode的協定能夠知道,若是hashCode不一樣,equals必定爲false,若是hashCode相同,equals不必定爲true。因此理論上,hashCode可能存在衝突的狀況,有個專業名詞叫碰撞,當碰撞發生時,計算出的bucketIndex也是相同的,這時會取到bucketIndex位置已存儲的元素,最終經過equals來比較,equals方法就是哈希碼碰撞時纔會執行的方法,因此前面說HashMap不多會用到equals。HashMap經過hashCode和equals最終判斷出K是否已存在,若是已存在,則使用新V值替換舊V值,並返回舊V值,若是不存在 ,則存放新的鍵值對<K, V>到bucketIndex位置。ide
public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } //容許鍵爲空值 if (key == null) return putForNullKey(value); //key!=null,計算期hash值 int hash = hash(key); //根據hashcode獲取key在table的bucketIndex int i = indexFor(hash, table.length); /取出bucketIndex上的元素,循環鏈表 for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; //當插入的key和當前循環到的key hashcode相同,而且(內存地址相同 //或equals爲true時,則認爲key重複 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { //key重複時,取出舊值,用新插入的value覆蓋,並返回舊值 V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } //要插入的key沒有重複,添加新的鍵值對到map modCount++; addEntry(hash, key, value, i); return null; }
2.hashset和hashmap的異同學習
hashset實現的是collection接口,存儲的是惟一的對象,底層實現就是hashmap,全部key對應同一個 valuethis
hashmap實現map接口,存儲鍵值對,鍵惟一spa
-------------------------------------------------------------------------------------code
做業:orm
1,hashmap實現原理,見上對象
2,hashset和hashmap的區別,見上接口
3,集合的嵌套
public static void main(String[] args) { List<Classes> css=new ArrayList<>(); for (int i = 1; i < 11; i++) { List<Student> sts = new ArrayList<>(); for (int j = 1; j < 51; j++) { sts.add(new Student("mingming" + j, j)); } Classes c = new Classes(i, sts); css.add(c); } Map<Grade, List<Classes>> map = new HashMap<Grade, List<Classes>>(); Grade grade=new Grade(1); map.put(grade, css); System.out.println(map.get(grade).size()); System.out.println(map.get(grade).get(0).getSts().size()); }
public class Grade { private int grade; public Grade(int grade) { super(); this.grade = grade; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } }
public class Classes { private int number; private List<Student> sts; public Classes(int number, List<Student> sts) { super(); this.number = number; this.sts = sts; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public List<Student> getSts() { return sts; } public void setSts(List<Student> sts) { this.sts = sts; } }
public class Student { private String name; private int id; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public Student(String name, int id) { super(); this.name = name; this.id = id; } }
4,文件的複製
public static void main(String[] args) throws Exception { long begin=System.currentTimeMillis(); System.out.println("開始複製時間:"+begin); FileReader reader=new FileReader("d:\\a.txt"); char[] buf=new char[512]; FileWriter writer=new FileWriter("d:\\b.txt"); int len=0; while((len=reader.read(buf))!=-1){ writer.write(buf, 0, len); } System.out.println("複製完成,共耗時"+(System.currentTimeMillis()-begin)); writer.close(); reader.close(); }
修改buf大小,發現buf在512個字符時用時最短