容器的基本概念
Collection函數(shù)庫是util包下的一些接口和類,類用來產(chǎn)生對象存放數(shù)據(jù),接口是訪問數(shù)據(jù)的方式。
List有序可重復,Set無序不可重復,Map是鍵值對。
List類
List list = new ArrayList();add();size();isEmpty();remove();set();get();
ArrayList底層實現(xiàn)是數(shù)組,線程不安全,效率高,查詢快,增刪改慢;LinkedList底層實現(xiàn)是鏈表,線程不安全,效率高,增刪改快,查詢慢;Vector線程安全,效率低。
源碼中查找元素使用了二分法提升效率。
實現(xiàn)ArrayList
實現(xiàn)ArrayList需要定義Object數(shù)組變量裝對象,size表示容量;定義無參和有參構(gòu)造器便于初始化;數(shù)組擴容問題:重定義size并拷貝元素到新數(shù)組;數(shù)組擴容用于添加add方法之中判斷;get()要判斷index是否越界;remove(int index)用arraycopy改變索引位置;remove(Object o)底層用equals判斷;set()修改元素并返回值。
實現(xiàn)LinkedList
先定義一個節(jié)點類,有指向前,后,和裝元素的屬性,提供訪問和改變方法;主類中應該有first,last,size域;add()添加元素應該判斷鏈表頭是否為空;get(int index)以first開始遍歷至index返回Node.obj;remove(int index)是把后一個前指針指向前一個的后指針;add(int index,Object o)把新元素的前指針指向上一個元素的后指針,新元素的后指針指向舊元素的前指針。
Map和HashMap的基本用法
Map類中存儲的鍵值對通過鍵來標識,鍵值不能重復。
put(k,v):存放對象;get(k):通過k得到v;remove(Object k);containsKey(k);containsValue(v);int size();boolean isEmpty();clear();void putAll(Map m);
HashMap和HashTable的區(qū)別在于后者線程安全,效率低。
實現(xiàn)HashMap
要另外定義一個類存放key和value屬性;以類對象數(shù)組存放鍵值對;取元素key或value循環(huán)判斷得到結(jié)果;判斷鍵重復時覆蓋值;
利用hashcode取余提高查詢效率。
Map底層實現(xiàn):數(shù)組+鏈表(數(shù)組存放鏈表,鏈表存放鍵值對)。
Map中使用hashcode出現(xiàn)負數(shù):
hash = hash<0?-hash:hash;
int a = hash%arr.length;
equals和hashcode
Java中規(guī)定:兩個內(nèi)容相同的對象(即equals為true)應該具有相同的hashcode值,反之則不然。
數(shù)據(jù)的存儲
1.利用JavaBean+構(gòu)造器->創(chuàng)建實例填充數(shù)據(jù)->用容器List裝載實例進行容器操作數(shù)據(jù)。
2.用Map裝載字段名和記錄->用List裝載Map對象->利用Map的特性訪問數(shù)據(jù)。
3.一個表對應一個類,一個字段對應一個屬性。
Set和HashSet
Set的不可重復是利用了Map的鍵元素不可重復!
迭代器遍歷List和Set
所有實現(xiàn)了Collection接口的容器類都有一個iterator方法用以返回一個實現(xiàn)了Iterator接口的對象。
Iterator對象稱作迭代器,實現(xiàn)了對容器類元素的遍歷操作。
boolean hasNext();Object next();void remove();<--在執(zhí)行完next之后該操作只能執(zhí)行一次。