資源描述:
《java集合類及并發(fā)包的實(shí)現(xiàn)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、集合類Collection接口Collection的實(shí)現(xiàn)主要有List,Set,兩者之間的主要區(qū)別是,List支持重復(fù),Set不支持,List的實(shí)現(xiàn)包括:ArrayList,LinkedList,Vector,Stacl.;Set的實(shí)現(xiàn)包括:HashSet,TreeSetCollection的主要方法:add(E):添加元素remove(E):刪除get(index):得到contains(E):含有iterator():得到遍歷器ArrayList實(shí)現(xiàn)方式創(chuàng)建ArrayList默認(rèn)構(gòu)造器通過(guò)調(diào)用ArrayList(int)來(lái)完成創(chuàng)建,傳入值10
2、。代碼:super()調(diào)用了默認(rèn)構(gòu)造器,是空的。這段代碼最重要的就是,創(chuàng)建了一個(gè)Object數(shù)組,并賦給了當(dāng)前elementData屬性,數(shù)組大小是傳入的initialCapacity,因此newArrayList()將會(huì)創(chuàng)建一個(gè)大小10的數(shù)組。插入對(duì)象:add(E)插入對(duì)象時(shí),會(huì)根據(jù)Object數(shù)組當(dāng)前已有元素屬性+1得到一個(gè)minCapacity,如果大于Object數(shù)組大小,則先將Object數(shù)組賦給另一個(gè)數(shù)組,然后得到一個(gè)新的數(shù)組大小=當(dāng)前數(shù)組大小*1.5+1,如果這個(gè)值小于minCapacity,則minCapacity為新數(shù)組的大小,
3、然后使用Arrays.copyOf來(lái)產(chǎn)生新的數(shù)組。add(E,index)方法:這個(gè)在指定位置插入值,首先要確保位置存在且Object數(shù)組大小足夠,插入后,所有index之后的元素都要向后移一位,這就是多一次復(fù)制數(shù)組的代價(jià)其他插入方法:addAll(Collection),addAll(int,Collection)刪除對(duì)象:remove(E)判斷E是否為null,是則遍歷所有元素,null是否存在,存在,則所有其后元素向前復(fù)制一位,并將最后的設(shè)為null(釋放)E不是null,則通過(guò)E的equals來(lái)
4、判斷對(duì)象是否存在。獲取單個(gè)對(duì)象:get(int)使用ArrayList最好的地方,get(int)直接得到數(shù)組位置的元素(判斷int的范圍)遍歷對(duì)象:iterator()ArrayList中的內(nèi)部類Itr,hasNext(),就是當(dāng)前位置和數(shù)組元素大小比較,相等f(wàn)alse,否則truenext()方法,會(huì)比較創(chuàng)建此Iterator時(shí)的modCount屬性和當(dāng)前的modCount屬性,如果不相等,說(shuō)明在遍歷時(shí)發(fā)生了改變Object數(shù)組元素的行為(add,remove),拋出ConcurrentModificationException,相等,則取下
5、一個(gè)元素(get方法),取不到,拋出IndexOutOfBoundsException注意:ArrayList基于數(shù)組實(shí)現(xiàn),無(wú)容量限制增加元素時(shí)可能擴(kuò)大數(shù)組,但是刪除時(shí)不會(huì)減小數(shù)組大小。對(duì)于非null元素,用equals方法判斷相等線程非安全LinkedList實(shí)現(xiàn)方式基于雙向鏈表的實(shí)現(xiàn),內(nèi)部有Entry類,代表元素,有element屬性代表value,next屬性指向下一個(gè)Entry,previous屬性指向上一個(gè)元素,這種機(jī)制有利于快速實(shí)現(xiàn)集合中元素的移動(dòng)所有的方法基于鏈表機(jī)制,不做解釋非線程安全。Vector數(shù)組實(shí)現(xiàn)。與ArrayList相
6、似不同處:add(E)方法在擴(kuò)容時(shí),如果capacityIncrement屬性大于0,則數(shù)組大小為現(xiàn)有size+capacityIncrement,如果capacityIncrement<=0,則大小為現(xiàn)有size*2所以Vector可以通過(guò)傳入capacityIncrement來(lái)控制容量的擴(kuò)充add(E),remove(E),get(int)方法都是synchronized的線程安全的。Stack繼承與Vector,實(shí)現(xiàn)了LIFO,HashSet基于HashMap實(shí)現(xiàn)add(E):通過(guò)HashMap的put(Object,Object)方法,將
7、要添加的元素作為key,value傳入一個(gè)之前已創(chuàng)建的Object其他方法都是通過(guò)HashMap來(lái)實(shí)現(xiàn)的非線程安全TreeSet基于TreeMap實(shí)現(xiàn),支持排序,非線程安全Map接口并發(fā)包(java.util.concurrent)ConcurrentHashMap線程安全的HashMap實(shí)現(xiàn)ConcurrentHashMap()和HashMap一樣,有initialCapacity屬性,loadFactor屬性,還多一個(gè)concurrencyLevel屬性。三個(gè)屬性默認(rèn)值是,16,0.75和16以下方式計(jì)算ssize的值intsshift=0;
8、intssize=1;while(ssize