轉載出處:http://blog.csdn.net/zhoubin1992/article/details/46481759
在Android編程或者面試中經常會遇到JAVA 面向對象和集合的知識點。自己結合實際的編程以及閱讀網上資料總結一下。
java面向對象
==和equal()的區別
- 基本數據類型。
byte,short,char,int,long,float,double,boolean 他們之間的比較,應用雙等號(==),比較的是他們的值。 - 複合數據類型(類)
當他們用(==)進行比較的時候,比較的是他們在JVM中的存放地址,所以,除非是同一個new出來的對象,他們的比較後的結果爲true,否則比較後結果爲false。 JAVA當中所有的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行爲也是比較對象的內存地址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。 - String的equal()
(1)String類中的equals首先比較地址,如果是同一個對象的引用,可知對象相等,返回true。
(2)若果不是同一個對象,equals方法挨個比較兩個字符串對象內的字符,只有完全相等才返回true,否則返回false。
String、StringBuffer、StringBuilder的區別
String 字符串常量(對象不可變,線程安全)
private final char value[];
StringBuffer 字符串變量(線程安全)
StringBuilder 字符串變量(非線程安全)
char[] value;
如果程序不是多線程的,那麼使用StringBuilder效率高於StringBuffer。
在大部分情況下 StringBuilder > StringBuffer> String
final, finally, finalize的區別
- final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
- finally是異常處理語句結構的一部分,表示總是執行。
- finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。
Overload和Override的區別
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被”屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱爲方法的重載(Overloading)。
java 繼承
extends關鍵字,子類擴展了父類,也具有父類的全部成員變量和方法,但是Java的子類不能獲得父類的構造器。
Java沒有C++中的多繼承特徵,每個類最多隻有一個直接父類(單繼承)
當調用子類構造器來初始化子類對象時,父類構造器總會在子類構造器之前執行。
創建任何Java對象,最先執行的總是java.lang.object類的構造器,從該類所在繼承樹最頂層類的構造器開始執行,然後依次向下執行。
Java多態
如果Java引用變量的編譯時類型和運行時類型不一致是,就可能出現多態。
運行時該引用變量的方法總是表現出子類方法的行爲特徵。(出現重寫)
Java中多態的實現方式:接口實現,繼承父類進行方法重寫(父類引用指向子類對象),同一個類中進行方法重載。
抽象類和接口的區別
接口和抽象類的概念不一樣。接口是對動作的抽象(吃),抽象類是對根源的抽象(人)。
一個類只能繼承一個類(抽象類),但是可以實現多個接口(吃,行)。
1. 接口可以多繼承,抽象類不行
2. 抽象類中可以定義一些子類的公共方法,子類只需要增加新的功能,不需要重複寫已經存在的方法;而接口中只是對方法的申明和常量的定義。
3. 接口中基本數據類型爲public static 而抽類象不是,是普通變量類型。
4. 抽象類和接口都不能直接實例化,如果要實例化,抽象類變量必須指向實現所有抽象方法的子類對象,接口變量必須指向實現所有接口方法的類對象。
5. 抽象類裏的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現接口的時候,如不能全部實現接口方法,那麼該類也只能爲抽象類。
內部類作用
放在一個類的內部的類我們就叫內部類。
作用
1. 內部類可以很好的實現隱藏,方便將存在一定邏輯關係的類組織在一起。
一般的非內部類,是不允許有private與protected權限的,但內部類可以。
2. 內部類擁有外圍類的所有元素的訪問權限。
3. 可是實現多重繼承,每個內部類都能獨立的繼承一個接口的實現,所以無論外部類是否已經繼承了某個(接口的)實現,對於內部類都沒有影響。內部類使得多繼承的解決方案變得完整。
4. 可以避免修改接口而實現同一個類中兩種同名方法的調用。
5. 方便編寫線程代碼。
java對象序列化
- 概念
序列化:把Java對象轉換爲字節序列的過程。
反序列化:把字節序列恢復爲Java對象的過程。
只有實現了Serializable和Externalizable接口的類的對象才能被序列化。
讀取對象的順序與寫入時的順序要一致。
對象的默認序列化機制寫入的內容是:對象的類,類簽名,以及非瞬態和非靜態字段的值。 - 用途
對象的序列化主要有兩種用途:
1) 把對象轉換成平臺無關的二進制流永久地保存到硬盤上,通常存放在一個文件中;
2) 在網絡上傳送對象的字節序列。
java集合
HashSet類
hashSet用Hash算法來存儲集合中的元素,具有很好的存取和查找性能。
特點:
1. 無序
2. 不是同步的
3. 集合元素值可爲null
4. 不允許包含相同的元素
存入一個元素:
HashSet調用該對象的hashCode()方法得到hashCode值,根據該hashCode值確定該對象的存儲位置。
訪問一個元素:
HashSet先計算該元素的hashCode值,然後直接到該hashCode值對應的位置去取出該元素。
如果元素相同則添加失敗add()返回false。
HashSet集合判斷兩個元素相同的標準是兩個對象equals()方法比較相等,並且hashCode值也相等。
如果兩個對象的hashCode值相同,equals()返回false時,會在同一個位置用鏈式結構來保存。導致性能下降。
ArrayList和Vector有何異同點
ArrayList和Vector在很多時候都很類似。
1. 兩者都是基於索引的,內部由一個數組支持。
2. 兩者維護插入的順序,我們可以根據插入順序來獲取元素。
3. ArrayList和Vector的迭代器實現都是fail-fast的。
4. ArrayList和Vector兩者允許null值,也可以使用索引值對元素進行隨機訪問。
以下是ArrayList和Vector的不同點。
1. Vector是同步的,而ArrayList不是。然而,如果你尋求在迭代的時候對列表進行改變,你應該使用CopyOnWriteArrayList。
2. ArrayList比Vector快,它因爲有同步,不會過載。
3. ArrayList更加通用,因爲我們可以使用Collections工具類輕易地獲取同步列表和只讀列表。
HashMap類和Hashtable類
HashMap和Hashtable判斷兩個key相等的標準是兩個key的equals()方法比較返回true,並且hashCode值也相等。
對同一個Key,只會有一個對應的value值存在。
如何算是同一個Key? 首先,兩個key對象的hash值相同,其次,key對象的equals方法返回真
所以用做key的對象必須重寫equals()和hashCode()方法,保證兩個方法的判斷標準一致——兩個key的equals方法返回真,hashCode值也相同。
HashMap和Hashtable的區別
- HashMap允許key和value爲null,而HashTable不允許。
- HashTable是同步的(線程安全),而HashMap不是(線程不安全)。所以HashMap適合單線程環境,HashTable適合多線程環境。HashMap比HashTable的性能高點。
- HashMap和Hashtable中key-value對無序。但在Java1.4中引入了LinkedHashMap,HashMap的一個子類,假如你想要遍歷順序,你很容易從HashMap轉向LinkedHashMap,但是HashTable不是這樣的,它的順序是不可預知的。
- HashMap提供對key的Set進行iterator遍歷,因此它是fail-fast的,但Hashtable提供對key的Enumeration進行遍歷,它不支持fail-fast。(fail-fast 機制是java集合(Collection)中的一種錯誤機制。當多個線程對同一個集合的內容進行操作時,就可能會產生fail-fast事件。例如:當某一個線程A通過iterator去遍歷某集合的過程中,若該集合的內容被其他線程所改變了;那麼線程A訪問集合時,就會拋出ConcurrentModificationException異常,產生fail-fast事件。)
- Hashtable被認爲是個遺留的類,如果你尋求在迭代的時候修改Map,你應該使用CocurrentHashMap。
- HashTable中hash數組默認大小是11,增加的方式是 old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數。
hashCode()和equals()方法有何重要性
- hashCode是根類Obeject中的方法。
默認情況下,Object中的hashCode() 返回對象的32位jvm內存地址。也就是說如果對象不重寫該方法,則返回相應對象的32爲JVM內存地址。 - HashMap使用Key對象的hashCode()和equals()方法去決定key-value對的索引。當我們試着從HashMap中獲取值的時候,這些方法也會被用到。如果這些方法沒有被正確地實現,在這種情況下,兩個不同Key也許會產生相同的hashCode()和equals()輸出,HashMap將會認爲它們是相同的,然後覆蓋它們,而非把它們存儲到不同的地方。同樣的,所有不允許存儲重複數據的集合類都使用hashCode()和equals()去查找重複,所以正確實現它們非常重要。equals()和hashCode()的實現應該遵循以下規則:
2.1 如果o1.equals(o2),那麼o1.hashCode() == o2.hashCode()總是爲true的。
2.2 如果o1.hashCode() == o2.hashCode(),並不意味着o1.equals(o2)會爲true。
在Java中,HashMap是如何工作的?
HashMap在Map.Entry靜態內部類實現中存儲key-value對。HashMap使用哈希算法,在put和get方法中,它使用hashCode()和equals()方法。當我們通過傳遞key-value對調用put方法的時候,HashMap使用Key hashCode()和哈希算法來找出存儲key-value對的索引。Entry存儲在LinkedList中,所以如果存在entry,它使用equals()方法來檢查傳遞的key是否已經存在,如果存在,它會覆蓋value,如果不存在,它會創建一個新的entry然後保存。當我們通過傳遞key調用get方法時,它再次使用hashCode()來找到數組中的索引,然後使用equals()方法找出正確的Entry,然後返回它的值。
其它關於HashMap比較重要的問題是容量、負荷係數和閥值調整。HashMap默認的初始容量是32,負荷係數是0.75。閥值是爲負荷係數乘以容量,無論何時我們嘗試添加一個entry,如果map的大小比閥值大的時候,HashMap會對map的內容進行重新哈希,且使用更大的容量。容量總是2的冪,所以如果你知道你需要存儲大量的key-value對,比如緩存從數據庫裏面拉取的數據,使用正確的容量和負荷係數對HashMap進行初始化是個不錯的做法。
HashMap源碼剖析
跟着蘭亭風雨走就行了,很強大:
http://blog.csdn.net/ns_code/article/details/36034955
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">package java.util; import java.io.*; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 默認的初始容量(容量爲HashMap中槽的數目)是16,且實際容量必須是2的整數次冪。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> DEFAULT_INITIAL_CAPACITY = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 最大容量(必須是2的冪且小於2的30次方,傳入容量過大將被這個值替換) </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> MAXIMUM_CAPACITY = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> << <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">30</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 默認加載因子爲0.75 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> DEFAULT_LOAD_FACTOR = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.75</span>f; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 存儲數據的Entry數組,長度是2的冪。 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// HashMap採用鏈表法解決衝突,每一個Entry本質上是一個單向鏈表 </span> transient Entry[] table; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// HashMap的底層數組中已用槽的數量 </span> transient <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// HashMap的閾值,用於判斷是否需要調整HashMap的容量(threshold = 容量*加載因子) </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> threshold; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 加載因子實際大小 </span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> loadFactor; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// HashMap被改變的次數 </span> transient <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">volatile</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> modCount; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 指定“容量大小”和“加載因子”的構造函數 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-title" style="box-sizing: border-box;">HashMap</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> initialCapacity, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> loadFactor) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (initialCapacity < <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> IllegalArgumentException(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Illegal initial capacity: "</span> + initialCapacity); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// HashMap的最大容量只能是MAXIMUM_CAPACITY </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加載因此不能小於0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (loadFactor <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> || Float.isNaN(loadFactor)) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> IllegalArgumentException(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Illegal load factor: "</span> + loadFactor); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 找出“大於initialCapacity”的最小的2的冪 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> capacity = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (capacity < initialCapacity) capacity <<= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 設置“加載因子” </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.loadFactor = loadFactor; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 設置“HashMap閾值”,當HashMap中存儲數據的數量達到threshold時,就需要將HashMap的容量加倍。 </span> threshold = (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>)(capacity * loadFactor); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 創建Entry數組,用來保存數據 </span> table = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Entry[capacity]; init(); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 指定“容量大小”的構造函數 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-title" style="box-sizing: border-box;">HashMap</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> initialCapacity) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>(initialCapacity, DEFAULT_LOAD_FACTOR); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 默認構造函數。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-title" style="box-sizing: border-box;">HashMap</span>() { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 設置“加載因子”爲默認加載因子0.75 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.loadFactor = DEFAULT_LOAD_FACTOR; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 設置“HashMap閾值”,當HashMap中存儲數據的數量達到threshold時,就需要將HashMap的容量加倍。 </span> threshold = (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 創建Entry數組,用來保存數據 </span> table = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Entry[DEFAULT_INITIAL_CAPACITY]; init(); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 包含“子Map”的構造函數 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-title" style="box-sizing: border-box;">HashMap</span>(Map<? extends K, ? extends V> m) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>(Math.max((<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>) (m.size() / DEFAULT_LOAD_FACTOR) + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 將m中的全部元素逐個添加到HashMap中 </span> putAllForCreate(m); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//求hash值的方法,重新計算hash值</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> hash(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> h) { h ^= (h >>> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span>) ^ (h >>> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> h ^ (h >>> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>) ^ (h >>> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回h在數組中的索引值,這裏用&代替取模,旨在提升效率 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// h & (length-1)保證返回值的小於length </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> indexFor(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> h, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> length) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> h & (length-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-title" style="box-sizing: border-box;">size</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> size; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> boolean <span class="hljs-title" style="box-sizing: border-box;">isEmpty</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> size == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 獲取key對應的value </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> V <span class="hljs-title" style="box-sizing: border-box;">get</span>(Object key) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (key == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> getForNullKey(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 獲取key的hash值 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> hash = hash(key.hashCode()); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 在“該hash值對應的鏈表”上查找“鍵值等於key”的元素 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (Entry<K,V> e = table[indexFor(hash, table.length)]; e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; e = e.next) { Object k; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//判斷key是否相同</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e.hash == hash && ((k = e.key) == key || key.equals(k))) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> e.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//沒找到則返回null</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 獲取“key爲null”的元素的值 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// HashMap將“key爲null”的元素存儲在table[0]位置,但不一定是該鏈表的第一個位置! </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> V <span class="hljs-title" style="box-sizing: border-box;">getForNullKey</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (Entry<K,V> e = table[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]; e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; e = e.next) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e.key == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> e.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// HashMap是否包含key </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> boolean <span class="hljs-title" style="box-sizing: border-box;">containsKey</span>(Object key) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> getEntry(key) != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回“鍵爲key”的鍵值對 </span> final Entry<K,V> getEntry(Object key) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 獲取哈希值 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// HashMap將“key爲null”的元素存儲在table[0]位置,“key不爲null”的則調用hash()計算哈希值 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> hash = (key == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) ? <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> : hash(key.hashCode()); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 在“該hash值對應的鏈表”上查找“鍵值等於key”的元素 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (Entry<K,V> e = table[indexFor(hash, table.length)]; e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; e = e.next) { Object k; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e.hash == hash && ((k = e.key) == key || (key != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> && key.equals(k)))) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> e; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 將“key-value”添加到HashMap中 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> V <span class="hljs-title" style="box-sizing: border-box;">put</span>(K key, V <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若“key爲null”,則將該鍵值對添加到table[0]中。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (key == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> putForNullKey(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若“key不爲null”,則計算該key的哈希值,然後將其添加到該哈希值對應的鏈表中。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> hash = hash(key.hashCode()); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = indexFor(hash, table.length); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (Entry<K,V> e = table[i]; e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; e = e.next) { Object k; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若“該key”對應的鍵值對已經存在,則用新的value取代舊的value。然後退出! </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>; e.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>; e.recordAccess(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> oldValue; } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若“該key”對應的鍵值對不存在,則將“key-value”添加到table中 </span> modCount++; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//將key-value添加到table[i]處</span> addEntry(hash, key, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>, i); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// putForNullKey()的作用是將“key爲null”鍵值對添加到table[0]位置 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> V <span class="hljs-title" style="box-sizing: border-box;">putForNullKey</span>(V <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (Entry<K,V> e = table[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]; e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; e = e.next) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e.key == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) { V oldValue = e.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>; e.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>; e.recordAccess(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> oldValue; } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 如果沒有存在key爲null的鍵值對,則直接題阿見到table[0]處! </span> modCount++; addEntry(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 創建HashMap對應的“添加方法”, </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 它和put()不同。putForCreate()是內部方法,它被構造函數等調用,用來創建HashMap </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 而put()是對外提供的往HashMap中添加元素的方法。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">putForCreate</span>(K key, V <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> hash = (key == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) ? <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> : hash(key.hashCode()); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = indexFor(hash, table.length); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若該HashMap表中存在“鍵值等於key”的元素,則替換該元素的value值 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (Entry<K,V> e = table[i]; e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; e = e.next) { Object k; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e.hash == hash && ((k = e.key) == key || (key != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> && key.equals(k)))) { e.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>; } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若該HashMap表中不存在“鍵值等於key”的元素,則將該key-value添加到HashMap中 </span> createEntry(hash, key, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>, i); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 將“m”中的全部元素都添加到HashMap中。 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 該方法被內部的構造HashMap的方法所調用。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">putAllForCreate</span>(Map<? extends K, ? extends V> m) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 利用迭代器將元素逐個添加到HashMap中 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (Iterator<? extends Map.Entry<? extends K, ? extends V>> i = m.entrySet().iterator(); i.hasNext(); ) { Map.Entry<? extends K, ? extends V> e = i.next(); putForCreate(e.getKey(), e.getValue()); } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 重新調整HashMap的大小,newCapacity是調整後的容量 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> resize(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> newCapacity) { Entry[] oldTable = table; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> oldCapacity = oldTable.length; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果就容量已經達到了最大值,則不能再擴容,直接返回</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (oldCapacity == MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 新建一個HashMap,將“舊HashMap”的全部元素添加到“新HashMap”中, </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 然後,將“新HashMap”賦值給“舊HashMap”。 </span> Entry[] newTable = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Entry[newCapacity]; transfer(newTable); table = newTable; threshold = (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>)(newCapacity * loadFactor); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 將HashMap中的全部元素都添加到newTable中 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> transfer(Entry[] newTable) { Entry[] src = table; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> newCapacity = newTable.length; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; j < src.length; j++) { Entry<K,V> e = src[j]; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) { src[j] = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">do</span> { Entry<K,V> next = e.next; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = indexFor(e.hash, newCapacity); e.next = newTable[i]; newTable[i] = e; e = next; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>); } } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 將"m"的全部元素都添加到HashMap中 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">putAll</span>(Map<? extends K, ? extends V> m) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 有效性判斷 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> numKeysToBeAdded = m.size(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (numKeysToBeAdded == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 計算容量是否足夠, </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若“當前閥值容量 < 需要的容量”,則將容量x2。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (numKeysToBeAdded > threshold) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> targetCapacity = (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>)(numKeysToBeAdded / loadFactor + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (targetCapacity > MAXIMUM_CAPACITY) targetCapacity = MAXIMUM_CAPACITY; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> newCapacity = table.length; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (newCapacity < targetCapacity) newCapacity <<= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (newCapacity > table.length) resize(newCapacity); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 通過迭代器,將“m”中的元素逐個添加到HashMap中。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (Iterator<? extends Map.Entry<? extends K, ? extends V>> i = m.entrySet().iterator(); i.hasNext(); ) { Map.Entry<? extends K, ? extends V> e = i.next(); put(e.getKey(), e.getValue()); } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 刪除“鍵爲key”元素 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> V <span class="hljs-title" style="box-sizing: border-box;">remove</span>(Object key) { Entry<K,V> e = removeEntryForKey(key); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> (e == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> ? <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> : e.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 刪除“鍵爲key”的元素 </span> final Entry<K,V> removeEntryForKey(Object key) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 獲取哈希值。若key爲null,則哈希值爲0;否則調用hash()進行計算 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> hash = (key == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) ? <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> : hash(key.hashCode()); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = indexFor(hash, table.length); Entry<K,V> prev = table[i]; Entry<K,V> e = prev; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 刪除鏈表中“鍵爲key”的元素 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 本質是“刪除單向鏈表中的節點” </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) { Entry<K,V> next = e.next; Object k; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e.hash == hash && ((k = e.key) == key || (key != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> && key.equals(k)))) { modCount++; size--; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (prev == e) table[i] = next; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> prev.next = next; e.recordRemoval(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> e; } prev = e; e = next; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> e; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 刪除“鍵值對” </span> final Entry<K,V> removeMapping(Object o) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!(o instanceof Map.Entry)) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; Map.Entry<K,V> entry = (Map.Entry<K,V>) o; Object key = entry.getKey(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> hash = (key == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) ? <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> : hash(key.hashCode()); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = indexFor(hash, table.length); Entry<K,V> prev = table[i]; Entry<K,V> e = prev; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 刪除鏈表中的“鍵值對e” </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 本質是“刪除單向鏈表中的節點” </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) { Entry<K,V> next = e.next; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e.hash == hash && e.equals(entry)) { modCount++; size--; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (prev == e) table[i] = next; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> prev.next = next; e.recordRemoval(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> e; } prev = e; e = next; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> e; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 清空HashMap,將所有的元素設爲null </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">clear</span>() { modCount++; Entry[] tab = table; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < tab.length; i++) tab[i] = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; size = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 是否包含“值爲value”的元素 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> boolean <span class="hljs-title" style="box-sizing: border-box;">containsValue</span>(Object <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若“value爲null”,則調用containsNullValue()查找 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span> == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> containsNullValue(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若“value不爲null”,則查找HashMap中是否有值爲value的節點。 </span> Entry[] tab = table; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < tab.length ; i++) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (Entry e = tab[i] ; e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> ; e = e.next) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>.equals(e.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>)) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 是否包含null值 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> boolean <span class="hljs-title" style="box-sizing: border-box;">containsNullValue</span>() { Entry[] tab = table; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < tab.length ; i++) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (Entry e = tab[i] ; e != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> ; e = e.next) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span> == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 克隆一個HashMap,並返回Object對象 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Object <span class="hljs-title" style="box-sizing: border-box;">clone</span>() { HashMap<K,V> result = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> { result = (HashMap<K,V>)super.clone(); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (CloneNotSupportedException e) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// assert false; </span> } result.table = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Entry[table.length]; result.entrySet = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; result.modCount = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; result.size = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; result.init(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 調用putAllForCreate()將全部元素添加到HashMap中 </span> result.putAllForCreate(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> result; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Entry是單向鏈表。 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 它是 “HashMap鏈式存儲法”對應的鏈表。 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 它實現了Map.Entry 接口,即實現getKey(), getValue(), setValue(V value), equals(Object o), hashCode()這些函數 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> class Entry<K,V> implements Map.Entry<K,V> { final K key; V <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 指向下一個節點 </span> Entry<K,V> next; final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> hash; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 構造函數。 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 輸入參數包括"哈希值(h)", "鍵(k)", "值(v)", "下一節點(n)" </span> Entry(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> h, K k, V v, Entry<K,V> n) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span> = v; next = n; key = k; hash = h; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> final K <span class="hljs-title" style="box-sizing: border-box;">getKey</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> key; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> final V <span class="hljs-title" style="box-sizing: border-box;">getValue</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> final V <span class="hljs-title" style="box-sizing: border-box;">setValue</span>(V newValue) { V oldValue = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span> = newValue; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> oldValue; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 判斷兩個Entry是否相等 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若兩個Entry的“key”和“value”都相等,則返回true。 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 否則,返回false </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> final boolean <span class="hljs-title" style="box-sizing: border-box;">equals</span>(Object o) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!(o instanceof Map.Entry)) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>; Map.Entry e = (Map.Entry)o; Object k1 = getKey(); Object k2 = e.getKey(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (k1 == k2 || (k1 != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> && k1.equals(k2))) { Object v1 = getValue(); Object v2 = e.getValue(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (v1 == v2 || (v1 != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> && v1.equals(v2))) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 實現hashCode() </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-title" style="box-sizing: border-box;">hashCode</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> (key==<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> ? <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> : key.hashCode()) ^ (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>==<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> ? <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> : <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>.hashCode()); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> final String <span class="hljs-title" style="box-sizing: border-box;">toString</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> getKey() + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"="</span> + getValue(); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 當向HashMap中添加元素時,繪調用recordAccess()。 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 這裏不做任何處理 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> recordAccess(HashMap<K,V> m) { } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 當從HashMap中刪除元素時,繪調用recordRemoval()。 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 這裏不做任何處理 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> recordRemoval(HashMap<K,V> m) { } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 新增Entry。將“key-value”插入指定位置,bucketIndex是位置索引。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> addEntry(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> hash, K key, V <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> bucketIndex) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 保存“bucketIndex”位置的值到“e”中 </span> Entry<K,V> e = table[bucketIndex]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 設置“bucketIndex”位置的元素爲“新Entry”, </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 設置“e”爲“新Entry的下一個節點” </span> table[bucketIndex] = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Entry<K,V>(hash, key, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>, e); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若HashMap的實際大小 不小於 “閾值”,則調整HashMap的大小 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (size++ >= threshold) resize(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> * table.length); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 創建Entry。將“key-value”插入指定位置。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> createEntry(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> hash, K key, V <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> bucketIndex) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 保存“bucketIndex”位置的值到“e”中 </span> Entry<K,V> e = table[bucketIndex]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 設置“bucketIndex”位置的元素爲“新Entry”, </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 設置“e”爲“新Entry的下一個節點” </span> table[bucketIndex] = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Entry<K,V>(hash, key, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>, e); size++; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// HashIterator是HashMap迭代器的抽象出來的父類,實現了公共了函數。 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 它包含“key迭代器(KeyIterator)”、“Value迭代器(ValueIterator)”和“Entry迭代器(EntryIterator)”3個子類。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">abstract</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> HashIterator<E> implements Iterator<E> { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 下一個元素 </span> Entry<K,V> next; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// expectedModCount用於實現fast-fail機制。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> expectedModCount; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 當前索引 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> index; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 當前元素 </span> Entry<K,V> current; HashIterator() { expectedModCount = modCount; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (size > <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// advance to first entry </span> Entry[] t = table; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 將next指向table中第一個不爲null的元素。 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 這裏利用了index的初始值爲0,從0開始依次向後遍歷,直到找到不爲null的元素就退出循環。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (index < t.length && (next = t[index++]) == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) ; } } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> final boolean <span class="hljs-title" style="box-sizing: border-box;">hasNext</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> next != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 獲取下一個元素 </span> final Entry<K,V> nextEntry() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (modCount != expectedModCount) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ConcurrentModificationException(); Entry<K,V> e = next; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> NoSuchElementException(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 注意!!! </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 一個Entry就是一個單向鏈表 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 若該Entry的下一個節點不爲空,就將next指向下一個節點; </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 否則,將next指向下一個鏈表(也是下一個Entry)的不爲null的節點。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ((next = e.next) == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) { Entry[] t = table; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (index < t.length && (next = t[index++]) == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) ; } current = e; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> e; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 刪除當前元素 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">remove</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (current == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> IllegalStateException(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (modCount != expectedModCount) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ConcurrentModificationException(); Object k = current.key; current = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; HashMap.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.removeEntryForKey(k); expectedModCount = modCount; } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// value的迭代器 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> ValueIterator extends HashIterator<V> { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> V <span class="hljs-title" style="box-sizing: border-box;">next</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> nextEntry().<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>; } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// key的迭代器 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> KeyIterator extends HashIterator<K> { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> K <span class="hljs-title" style="box-sizing: border-box;">next</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> nextEntry().getKey(); } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Entry的迭代器 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> EntryIterator extends HashIterator<Map.Entry<K,V>> { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Map.Entry<K,V> <span class="hljs-title" style="box-sizing: border-box;">next</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> nextEntry(); } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回一個“key迭代器” </span> Iterator<K> newKeyIterator() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> KeyIterator(); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回一個“value迭代器” </span> Iterator<V> newValueIterator() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ValueIterator(); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回一個“entry迭代器” </span> Iterator<Map.Entry<K,V>> newEntryIterator() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> EntryIterator(); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// HashMap的Entry對應的集合 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> transient Set<Map.Entry<K,V>> entrySet = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回“key的集合”,實際上返回一個“KeySet對象” </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Set<K> <span class="hljs-title" style="box-sizing: border-box;">keySet</span>() { Set<K> ks = keySet; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> (ks != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> ? ks : (keySet = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> KeySet())); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Key對應的集合 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// KeySet繼承於AbstractSet,說明該集合中沒有重複的Key。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> KeySet extends AbstractSet<K> { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Iterator<K> <span class="hljs-title" style="box-sizing: border-box;">iterator</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> newKeyIterator(); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-title" style="box-sizing: border-box;">size</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> size; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> boolean <span class="hljs-title" style="box-sizing: border-box;">contains</span>(Object o) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> containsKey(o); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> boolean <span class="hljs-title" style="box-sizing: border-box;">remove</span>(Object o) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> HashMap.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.removeEntryForKey(o) != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">clear</span>() { HashMap.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.clear(); } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回“value集合”,實際上返回的是一個Values對象 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Collection<V> <span class="hljs-title" style="box-sizing: border-box;">values</span>() { Collection<V> vs = values; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> (vs != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> ? vs : (values = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Values())); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// “value集合” </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Values繼承於AbstractCollection,不同於“KeySet繼承於AbstractSet”, </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Values中的元素能夠重複。因爲不同的key可以指向相同的value。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> Values extends AbstractCollection<V> { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Iterator<V> <span class="hljs-title" style="box-sizing: border-box;">iterator</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> newValueIterator(); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-title" style="box-sizing: border-box;">size</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> size; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> boolean <span class="hljs-title" style="box-sizing: border-box;">contains</span>(Object o) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> containsValue(o); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">clear</span>() { HashMap.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.clear(); } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回“HashMap的Entry集合” </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Set<Map.Entry<K,V>> <span class="hljs-title" style="box-sizing: border-box;">entrySet</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> entrySet0(); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回“HashMap的Entry集合”,它實際是返回一個EntrySet對象 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> Set<Map.Entry<K,V>> <span class="hljs-title" style="box-sizing: border-box;">entrySet0</span>() { Set<Map.Entry<K,V>> es = entrySet; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> es != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> ? es : (entrySet = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> EntrySet()); } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// EntrySet對應的集合 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// EntrySet繼承於AbstractSet,說明該集合中沒有重複的EntrySet。 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> EntrySet extends AbstractSet<Map.Entry<K,V>> { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Iterator<Map.Entry<K,V>> <span class="hljs-title" style="box-sizing: border-box;">iterator</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> newEntryIterator(); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> boolean <span class="hljs-title" style="box-sizing: border-box;">contains</span>(Object o) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!(o instanceof Map.Entry)) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>; Map.Entry<K,V> e = (Map.Entry<K,V>) o; Entry<K,V> candidate = getEntry(e.getKey()); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> candidate != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> && candidate.equals(e); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> boolean <span class="hljs-title" style="box-sizing: border-box;">remove</span>(Object o) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> removeMapping(o) != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-title" style="box-sizing: border-box;">size</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> size; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">clear</span>() { HashMap.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.clear(); } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// java.io.Serializable的寫入函數 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 將HashMap的“總的容量,實際容量,所有的Entry”都寫入到輸出流中 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">writeObject</span>(java.io.ObjectOutputStream s) throws IOException { Iterator<Map.Entry<K,V>> i = (size > <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) ? entrySet0().iterator() : <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Write out the threshold, loadfactor, and any hidden stuff </span> s.defaultWriteObject(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Write out number of buckets </span> s.writeInt(table.length); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Write out size (number of Mappings) </span> s.writeInt(size); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Write out keys and values (alternating) </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (i != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (i.hasNext()) { Map.Entry<K,V> e = i.next(); s.writeObject(e.getKey()); s.writeObject(e.getValue()); } } } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> final <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">long</span> serialVersionUID = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">362498820763181265</span>L; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// java.io.Serializable的讀取函數:根據寫入方式讀出 </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 將HashMap的“總的容量,實際容量,所有的Entry”依次讀出 </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">readObject</span>(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Read in the threshold, loadfactor, and any hidden stuff </span> s.defaultReadObject(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Read in number of buckets and allocate the bucket array; </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> numBuckets = s.readInt(); table = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Entry[numBuckets]; init(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Give subclass a chance to do its thing. </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Read in size (number of Mappings) </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size = s.readInt(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Read the keys and values, and put the mappings in the HashMap </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i<size; i++) { K key = (K) s.readObject(); V <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span> = (V) s.readObject(); putForCreate(key, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>); } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回“HashMap總的容量” </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> capacity() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> table.length; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回“HashMap的加載因子” </span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> loadFactor() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> loadFactor; } } </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li><li style="box-sizing: border-box; padding: 0px 5px;">133</li><li style="box-sizing: border-box; padding: 0px 5px;">134</li><li style="box-sizing: border-box; padding: 0px 5px;">135</li><li style="box-sizing: border-box; padding: 0px 5px;">136</li><li style="box-sizing: border-box; padding: 0px 5px;">137</li><li style="box-sizing: border-box; padding: 0px 5px;">138</li><li style="box-sizing: border-box; padding: 0px 5px;">139</li><li style="box-sizing: border-box; padding: 0px 5px;">140</li><li style="box-sizing: border-box; padding: 0px 5px;">141</li><li style="box-sizing: border-box; padding: 0px 5px;">142</li><li style="box-sizing: border-box; padding: 0px 5px;">143</li><li style="box-sizing: border-box; padding: 0px 5px;">144</li><li style="box-sizing: border-box; padding: 0px 5px;">145</li><li style="box-sizing: border-box; padding: 0px 5px;">146</li><li style="box-sizing: border-box; padding: 0px 5px;">147</li><li style="box-sizing: border-box; padding: 0px 5px;">148</li><li style="box-sizing: border-box; padding: 0px 5px;">149</li><li style="box-sizing: border-box; padding: 0px 5px;">150</li><li style="box-sizing: border-box; padding: 0px 5px;">151</li><li style="box-sizing: border-box; padding: 0px 5px;">152</li><li style="box-sizing: border-box; padding: 0px 5px;">153</li><li style="box-sizing: border-box; padding: 0px 5px;">154</li><li style="box-sizing: border-box; padding: 0px 5px;">155</li><li style="box-sizing: border-box; padding: 0px 5px;">156</li><li style="box-sizing: border-box; padding: 0px 5px;">157</li><li style="box-sizing: border-box; padding: 0px 5px;">158</li><li style="box-sizing: border-box; padding: 0px 5px;">159</li><li style="box-sizing: border-box; padding: 0px 5px;">160</li><li style="box-sizing: border-box; padding: 0px 5px;">161</li><li style="box-sizing: border-box; padding: 0px 5px;">162</li><li style="box-sizing: border-box; padding: 0px 5px;">163</li><li style="box-sizing: border-box; padding: 0px 5px;">164</li><li style="box-sizing: border-box; padding: 0px 5px;">165</li><li style="box-sizing: border-box; padding: 0px 5px;">166</li><li style="box-sizing: border-box; padding: 0px 5px;">167</li><li style="box-sizing: border-box; padding: 0px 5px;">168</li><li style="box-sizing: border-box; padding: 0px 5px;">169</li><li style="box-sizing: border-box; padding: 0px 5px;">170</li><li style="box-sizing: border-box; padding: 0px 5px;">171</li><li style="box-sizing: border-box; padding: 0px 5px;">172</li><li style="box-sizing: border-box; padding: 0px 5px;">173</li><li style="box-sizing: border-box; padding: 0px 5px;">174</li><li style="box-sizing: border-box; padding: 0px 5px;">175</li><li style="box-sizing: border-box; padding: 0px 5px;">176</li><li style="box-sizing: border-box; padding: 0px 5px;">177</li><li style="box-sizing: border-box; padding: 0px 5px;">178</li><li style="box-sizing: border-box; padding: 0px 5px;">179</li><li style="box-sizing: border-box; padding: 0px 5px;">180</li><li style="box-sizing: border-box; padding: 0px 5px;">181</li><li style="box-sizing: border-box; padding: 0px 5px;">182</li><li style="box-sizing: border-box; padding: 0px 5px;">183</li><li style="box-sizing: border-box; padding: 0px 5px;">184</li><li style="box-sizing: border-box; padding: 0px 5px;">185</li><li style="box-sizing: border-box; padding: 0px 5px;">186</li><li style="box-sizing: border-box; padding: 0px 5px;">187</li><li style="box-sizing: border-box; padding: 0px 5px;">188</li><li style="box-sizing: border-box; padding: 0px 5px;">189</li><li style="box-sizing: border-box; padding: 0px 5px;">190</li><li style="box-sizing: border-box; padding: 0px 5px;">191</li><li style="box-sizing: border-box; padding: 0px 5px;">192</li><li style="box-sizing: border-box; padding: 0px 5px;">193</li><li style="box-sizing: border-box; padding: 0px 5px;">194</li><li style="box-sizing: border-box; padding: 0px 5px;">195</li><li style="box-sizing: border-box; padding: 0px 5px;">196</li><li style="box-sizing: border-box; padding: 0px 5px;">197</li><li style="box-sizing: border-box; padding: 0px 5px;">198</li><li style="box-sizing: border-box; padding: 0px 5px;">199</li><li style="box-sizing: border-box; padding: 0px 5px;">200</li><li style="box-sizing: border-box; padding: 0px 5px;">201</li><li style="box-sizing: border-box; padding: 0px 5px;">202</li><li style="box-sizing: border-box; padding: 0px 5px;">203</li><li style="box-sizing: border-box; padding: 0px 5px;">204</li><li style="box-sizing: border-box; padding: 0px 5px;">205</li><li style="box-sizing: border-box; padding: 0px 5px;">206</li><li style="box-sizing: border-box; padding: 0px 5px;">207</li><li style="box-sizing: border-box; padding: 0px 5px;">208</li><li style="box-sizing: border-box; padding: 0px 5px;">209</li><li style="box-sizing: border-box; padding: 0px 5px;">210</li><li style="box-sizing: border-box; padding: 0px 5px;">211</li><li style="box-sizing: border-box; padding: 0px 5px;">212</li><li style="box-sizing: border-box; padding: 0px 5px;">213</li><li style="box-sizing: border-box; padding: 0px 5px;">214</li><li style="box-sizing: border-box; padding: 0px 5px;">215</li><li style="box-sizing: border-box; padding: 0px 5px;">216</li><li style="box-sizing: border-box; padding: 0px 5px;">217</li><li style="box-sizing: border-box; padding: 0px 5px;">218</li><li style="box-sizing: border-box; padding: 0px 5px;">219</li><li style="box-sizing: border-box; padding: 0px 5px;">220</li><li style="box-sizing: border-box; padding: 0px 5px;">221</li><li style="box-sizing: border-box; padding: 0px 5px;">222</li><li style="box-sizing: border-box; padding: 0px 5px;">223</li><li style="box-sizing: border-box; padding: 0px 5px;">224</li><li style="box-sizing: border-box; padding: 0px 5px;">225</li><li style="box-sizing: border-box; padding: 0px 5px;">226</li><li style="box-sizing: border-box; padding: 0px 5px;">227</li><li style="box-sizing: border-box; padding: 0px 5px;">228</li><li style="box-sizing: border-box; padding: 0px 5px;">229</li><li style="box-sizing: border-box; padding: 0px 5px;">230</li><li style="box-sizing: border-box; padding: 0px 5px;">231</li><li style="box-sizing: border-box; padding: 0px 5px;">232</li><li style="box-sizing: border-box; padding: 0px 5px;">233</li><li style="box-sizing: border-box; padding: 0px 5px;">234</li><li style="box-sizing: border-box; padding: 0px 5px;">235</li><li style="box-sizing: border-box; padding: 0px 5px;">236</li><li style="box-sizing: border-box; padding: 0px 5px;">237</li><li style="box-sizing: border-box; padding: 0px 5px;">238</li><li style="box-sizing: border-box; padding: 0px 5px;">239</li><li style="box-sizing: border-box; padding: 0px 5px;">240</li><li style="box-sizing: border-box; padding: 0px 5px;">241</li><li style="box-sizing: border-box; padding: 0px 5px;">242</li><li style="box-sizing: border-box; padding: 0px 5px;">243</li><li style="box-sizing: border-box; padding: 0px 5px;">244</li><li style="box-sizing: border-box; padding: 0px 5px;">245</li><li style="box-sizing: border-box; padding: 0px 5px;">246</li><li style="box-sizing: border-box; padding: 0px 5px;">247</li><li style="box-sizing: border-box; padding: 0px 5px;">248</li><li style="box-sizing: border-box; padding: 0px 5px;">249</li><li style="box-sizing: border-box; padding: 0px 5px;">250</li><li style="box-sizing: border-box; padding: 0px 5px;">251</li><li style="box-sizing: border-box; padding: 0px 5px;">252</li><li style="box-sizing: border-box; padding: 0px 5px;">253</li><li style="box-sizing: border-box; padding: 0px 5px;">254</li><li style="box-sizing: border-box; padding: 0px 5px;">255</li><li style="box-sizing: border-box; padding: 0px 5px;">256</li><li style="box-sizing: border-box; padding: 0px 5px;">257</li><li style="box-sizing: border-box; padding: 0px 5px;">258</li><li style="box-sizing: border-box; padding: 0px 5px;">259</li><li style="box-sizing: border-box; padding: 0px 5px;">260</li><li style="box-sizing: border-box; padding: 0px 5px;">261</li><li style="box-sizing: border-box; padding: 0px 5px;">262</li><li style="box-sizing: border-box; padding: 0px 5px;">263</li><li style="box-sizing: border-box; padding: 0px 5px;">264</li><li style="box-sizing: border-box; padding: 0px 5px;">265</li><li style="box-sizing: border-box; padding: 0px 5px;">266</li><li style="box-sizing: border-box; padding: 0px 5px;">267</li><li style="box-sizing: border-box; padding: 0px 5px;">268</li><li style="box-sizing: border-box; padding: 0px 5px;">269</li><li style="box-sizing: border-box; padding: 0px 5px;">270</li><li style="box-sizing: border-box; padding: 0px 5px;">271</li><li style="box-sizing: border-box; padding: 0px 5px;">272</li><li style="box-sizing: border-box; padding: 0px 5px;">273</li><li style="box-sizing: border-box; padding: 0px 5px;">274</li><li style="box-sizing: border-box; padding: 0px 5px;">275</li><li style="box-sizing: border-box; padding: 0px 5px;">276</li><li style="box-sizing: border-box; padding: 0px 5px;">277</li><li style="box-sizing: border-box; padding: 0px 5px;">278</li><li style="box-sizing: border-box; padding: 0px 5px;">279</li><li style="box-sizing: border-box; padding: 0px 5px;">280</li><li style="box-sizing: border-box; padding: 0px 5px;">281</li><li style="box-sizing: border-box; padding: 0px 5px;">282</li><li style="box-sizing: border-box; padding: 0px 5px;">283</li><li style="box-sizing: border-box; padding: 0px 5px;">284</li><li style="box-sizing: border-box; padding: 0px 5px;">285</li><li style="box-sizing: border-box; padding: 0px 5px;">286</li><li style="box-sizing: border-box; padding: 0px 5px;">287</li><li style="box-sizing: border-box; padding: 0px 5px;">288</li><li style="box-sizing: border-box; padding: 0px 5px;">289</li><li style="box-sizing: border-box; padding: 0px 5px;">290</li><li style="box-sizing: border-box; padding: 0px 5px;">291</li><li style="box-sizing: border-box; padding: 0px 5px;">292</li><li style="box-sizing: border-box; padding: 0px 5px;">293</li><li style="box-sizing: border-box; padding: 0px 5px;">294</li><li style="box-sizing: border-box; padding: 0px 5px;">295</li><li style="box-sizing: border-box; padding: 0px 5px;">296</li><li style="box-sizing: border-box; padding: 0px 5px;">297</li><li style="box-sizing: border-box; padding: 0px 5px;">298</li><li style="box-sizing: border-box; padding: 0px 5px;">299</li><li style="box-sizing: border-box; padding: 0px 5px;">300</li><li style="box-sizing: border-box; padding: 0px 5px;">301</li><li style="box-sizing: border-box; padding: 0px 5px;">302</li><li style="box-sizing: border-box; padding: 0px 5px;">303</li><li style="box-sizing: border-box; padding: 0px 5px;">304</li><li style="box-sizing: border-box; padding: 0px 5px;">305</li><li style="box-sizing: border-box; padding: 0px 5px;">306</li><li style="box-sizing: border-box; padding: 0px 5px;">307</li><li style="box-sizing: border-box; padding: 0px 5px;">308</li><li style="box-sizing: border-box; padding: 0px 5px;">309</li><li style="box-sizing: border-box; padding: 0px 5px;">310</li><li style="box-sizing: border-box; padding: 0px 5px;">311</li><li style="box-sizing: border-box; padding: 0px 5px;">312</li><li style="box-sizing: border-box; padding: 0px 5px;">313</li><li style="box-sizing: border-box; padding: 0px 5px;">314</li><li style="box-sizing: border-box; padding: 0px 5px;">315</li><li style="box-sizing: border-box; padding: 0px 5px;">316</li><li style="box-sizing: border-box; padding: 0px 5px;">317</li><li style="box-sizing: border-box; padding: 0px 5px;">318</li><li style="box-sizing: border-box; padding: 0px 5px;">319</li><li style="box-sizing: border-box; padding: 0px 5px;">320</li><li style="box-sizing: border-box; padding: 0px 5px;">321</li><li style="box-sizing: border-box; padding: 0px 5px;">322</li><li style="box-sizing: border-box; padding: 0px 5px;">323</li><li style="box-sizing: border-box; padding: 0px 5px;">324</li><li style="box-sizing: border-box; padding: 0px 5px;">325</li><li style="box-sizing: border-box; padding: 0px 5px;">326</li><li style="box-sizing: border-box; padding: 0px 5px;">327</li><li style="box-sizing: border-box; padding: 0px 5px;">328</li><li style="box-sizing: border-box; padding: 0px 5px;">329</li><li style="box-sizing: border-box; padding: 0px 5px;">330</li><li style="box-sizing: border-box; padding: 0px 5px;">331</li><li style="box-sizing: border-box; padding: 0px 5px;">332</li><li style="box-sizing: border-box; padding: 0px 5px;">333</li><li style="box-sizing: border-box; padding: 0px 5px;">334</li><li style="box-sizing: border-box; padding: 0px 5px;">335</li><li style="box-sizing: border-box; padding: 0px 5px;">336</li><li style="box-sizing: border-box; padding: 0px 5px;">337</li><li style="box-sizing: border-box; padding: 0px 5px;">338</li><li style="box-sizing: border-box; padding: 0px 5px;">339</li><li style="box-sizing: border-box; padding: 0px 5px;">340</li><li style="box-sizing: border-box; padding: 0px 5px;">341</li><li style="box-sizing: border-box; padding: 0px 5px;">342</li><li style="box-sizing: border-box; padding: 0px 5px;">343</li><li style="box-sizing: border-box; padding: 0px 5px;">344</li><li style="box-sizing: border-box; padding: 0px 5px;">345</li><li style="box-sizing: border-box; padding: 0px 5px;">346</li><li style="box-sizing: border-box; padding: 0px 5px;">347</li><li style="box-sizing: border-box; padding: 0px 5px;">348</li><li style="box-sizing: border-box; padding: 0px 5px;">349</li><li style="box-sizing: border-box; padding: 0px 5px;">350</li><li style="box-sizing: border-box; padding: 0px 5px;">351</li><li style="box-sizing: border-box; padding: 0px 5px;">352</li><li style="box-sizing: border-box; padding: 0px 5px;">353</li><li style="box-sizing: border-box; padding: 0px 5px;">354</li><li style="box-sizing: border-box; padding: 0px 5px;">355</li><li style="box-sizing: border-box; padding: 0px 5px;">356</li><li style="box-sizing: border-box; padding: 0px 5px;">357</li><li style="box-sizing: border-box; padding: 0px 5px;">358</li><li style="box-sizing: border-box; padding: 0px 5px;">359</li><li style="box-sizing: border-box; padding: 0px 5px;">360</li><li style="box-sizing: border-box; padding: 0px 5px;">361</li><li style="box-sizing: border-box; padding: 0px 5px;">362</li><li style="box-sizing: border-box; padding: 0px 5px;">363</li><li style="box-sizing: border-box; padding: 0px 5px;">364</li><li style="box-sizing: border-box; padding: 0px 5px;">365</li><li style="box-sizing: border-box; padding: 0px 5px;">366</li><li style="box-sizing: border-box; padding: 0px 5px;">367</li><li style="box-sizing: border-box; padding: 0px 5px;">368</li><li style="box-sizing: border-box; padding: 0px 5px;">369</li><li style="box-sizing: border-box; padding: 0px 5px;">370</li><li style="box-sizing: border-box; padding: 0px 5px;">371</li><li style="box-sizing: border-box; padding: 0px 5px;">372</li><li style="box-sizing: border-box; padding: 0px 5px;">373</li><li style="box-sizing: border-box; padding: 0px 5px;">374</li><li style="box-sizing: border-box; padding: 0px 5px;">375</li><li style="box-sizing: border-box; padding: 0px 5px;">376</li><li style="box-sizing: border-box; padding: 0px 5px;">377</li><li style="box-sizing: border-box; padding: 0px 5px;">378</li><li style="box-sizing: border-box; padding: 0px 5px;">379</li><li style="box-sizing: border-box; padding: 0px 5px;">380</li><li style="box-sizing: border-box; padding: 0px 5px;">381</li><li style="box-sizing: border-box; padding: 0px 5px;">382</li><li style="box-sizing: border-box; padding: 0px 5px;">383</li><li style="box-sizing: border-box; padding: 0px 5px;">384</li><li style="box-sizing: border-box; padding: 0px 5px;">385</li><li style="box-sizing: border-box; padding: 0px 5px;">386</li><li style="box-sizing: border-box; padding: 0px 5px;">387</li><li style="box-sizing: border-box; padding: 0px 5px;">388</li><li style="box-sizing: border-box; padding: 0px 5px;">389</li><li style="box-sizing: border-box; padding: 0px 5px;">390</li><li style="box-sizing: border-box; padding: 0px 5px;">391</li><li style="box-sizing: border-box; padding: 0px 5px;">392</li><li style="box-sizing: border-box; padding: 0px 5px;">393</li><li style="box-sizing: border-box; padding: 0px 5px;">394</li><li style="box-sizing: border-box; padding: 0px 5px;">395</li><li style="box-sizing: border-box; padding: 0px 5px;">396</li><li style="box-sizing: border-box; padding: 0px 5px;">397</li><li style="box-sizing: border-box; padding: 0px 5px;">398</li><li style="box-sizing: border-box; padding: 0px 5px;">399</li><li style="box-sizing: border-box; padding: 0px 5px;">400</li><li style="box-sizing: border-box; padding: 0px 5px;">401</li><li style="box-sizing: border-box; padding: 0px 5px;">402</li><li style="box-sizing: border-box; padding: 0px 5px;">403</li><li style="box-sizing: border-box; padding: 0px 5px;">404</li><li style="box-sizing: border-box; padding: 0px 5px;">405</li><li style="box-sizing: border-box; padding: 0px 5px;">406</li><li style="box-sizing: border-box; padding: 0px 5px;">407</li><li style="box-sizing: border-box; padding: 0px 5px;">408</li><li style="box-sizing: border-box; padding: 0px 5px;">409</li><li style="box-sizing: border-box; padding: 0px 5px;">410</li><li style="box-sizing: border-box; padding: 0px 5px;">411</li><li style="box-sizing: border-box; padding: 0px 5px;">412</li><li style="box-sizing: border-box; padding: 0px 5px;">413</li><li style="box-sizing: border-box; padding: 0px 5px;">414</li><li style="box-sizing: border-box; padding: 0px 5px;">415</li><li style="box-sizing: border-box; padding: 0px 5px;">416</li><li style="box-sizing: border-box; padding: 0px 5px;">417</li><li style="box-sizing: border-box; padding: 0px 5px;">418</li><li style="box-sizing: border-box; padding: 0px 5px;">419</li><li style="box-sizing: border-box; padding: 0px 5px;">420</li><li style="box-sizing: border-box; padding: 0px 5px;">421</li><li style="box-sizing: border-box; padding: 0px 5px;">422</li><li style="box-sizing: border-box; padding: 0px 5px;">423</li><li style="box-sizing: border-box; padding: 0px 5px;">424</li><li style="box-sizing: border-box; padding: 0px 5px;">425</li><li style="box-sizing: border-box; padding: 0px 5px;">426</li><li style="box-sizing: border-box; padding: 0px 5px;">427</li><li style="box-sizing: border-box; padding: 0px 5px;">428</li><li style="box-sizing: border-box; padding: 0px 5px;">429</li><li style="box-sizing: border-box; padding: 0px 5px;">430</li><li style="box-sizing: border-box; padding: 0px 5px;">431</li><li style="box-sizing: border-box; padding: 0px 5px;">432</li><li style="box-sizing: border-box; padding: 0px 5px;">433</li><li style="box-sizing: border-box; padding: 0px 5px;">434</li><li style="box-sizing: border-box; padding: 0px 5px;">435</li><li style="box-sizing: border-box; padding: 0px 5px;">436</li><li style="box-sizing: border-box; padding: 0px 5px;">437</li><li style="box-sizing: border-box; padding: 0px 5px;">438</li><li style="box-sizing: border-box; padding: 0px 5px;">439</li><li style="box-sizing: border-box; padding: 0px 5px;">440</li><li style="box-sizing: border-box; padding: 0px 5px;">441</li><li style="box-sizing: border-box; padding: 0px 5px;">442</li><li style="box-sizing: border-box; padding: 0px 5px;">443</li><li style="box-sizing: border-box; padding: 0px 5px;">444</li><li style="box-sizing: border-box; padding: 0px 5px;">445</li><li style="box-sizing: border-box; padding: 0px 5px;">446</li><li style="box-sizing: border-box; padding: 0px 5px;">447</li><li style="box-sizing: border-box; padding: 0px 5px;">448</li><li style="box-sizing: border-box; padding: 0px 5px;">449</li><li style="box-sizing: border-box; padding: 0px 5px;">450</li><li style="box-sizing: border-box; padding: 0px 5px;">451</li><li style="box-sizing: border-box; padding: 0px 5px;">452</li><li style="box-sizing: border-box; padding: 0px 5px;">453</li><li style="box-sizing: border-box; padding: 0px 5px;">454</li><li style="box-sizing: border-box; padding: 0px 5px;">455</li><li style="box-sizing: border-box; padding: 0px 5px;">456</li><li style="box-sizing: border-box; padding: 0px 5px;">457</li><li style="box-sizing: border-box; padding: 0px 5px;">458</li><li style="box-sizing: border-box; padding: 0px 5px;">459</li><li style="box-sizing: border-box; padding: 0px 5px;">460</li><li style="box-sizing: border-box; padding: 0px 5px;">461</li><li style="box-sizing: border-box; padding: 0px 5px;">462</li><li style="box-sizing: border-box; padding: 0px 5px;">463</li><li style="box-sizing: border-box; padding: 0px 5px;">464</li><li style="box-sizing: border-box; padding: 0px 5px;">465</li><li style="box-sizing: border-box; padding: 0px 5px;">466</li><li style="box-sizing: border-box; padding: 0px 5px;">467</li><li style="box-sizing: border-box; padding: 0px 5px;">468</li><li style="box-sizing: border-box; padding: 0px 5px;">469</li><li style="box-sizing: border-box; padding: 0px 5px;">470</li><li style="box-sizing: border-box; padding: 0px 5px;">471</li><li style="box-sizing: border-box; padding: 0px 5px;">472</li><li style="box-sizing: border-box; padding: 0px 5px;">473</li><li style="box-sizing: border-box; padding: 0px 5px;">474</li><li style="box-sizing: border-box; padding: 0px 5px;">475</li><li style="box-sizing: border-box; padding: 0px 5px;">476</li><li style="box-sizing: border-box; padding: 0px 5px;">477</li><li style="box-sizing: border-box; padding: 0px 5px;">478</li><li style="box-sizing: border-box; padding: 0px 5px;">479</li><li style="box-sizing: border-box; padding: 0px 5px;">480</li><li style="box-sizing: border-box; padding: 0px 5px;">481</li><li style="box-sizing: border-box; padding: 0px 5px;">482</li><li style="box-sizing: border-box; padding: 0px 5px;">483</li><li style="box-sizing: border-box; padding: 0px 5px;">484</li><li style="box-sizing: border-box; padding: 0px 5px;">485</li><li style="box-sizing: border-box; padding: 0px 5px;">486</li><li style="box-sizing: border-box; padding: 0px 5px;">487</li><li style="box-sizing: border-box; padding: 0px 5px;">488</li><li style="box-sizing: border-box; padding: 0px 5px;">489</li><li style="box-sizing: border-box; padding: 0px 5px;">490</li><li style="box-sizing: border-box; padding: 0px 5px;">491</li><li style="box-sizing: border-box; padding: 0px 5px;">492</li><li style="box-sizing: border-box; padding: 0px 5px;">493</li><li style="box-sizing: border-box; padding: 0px 5px;">494</li><li style="box-sizing: border-box; padding: 0px 5px;">495</li><li style="box-sizing: border-box; padding: 0px 5px;">496</li><li style="box-sizing: border-box; padding: 0px 5px;">497</li><li style="box-sizing: border-box; padding: 0px 5px;">498</li><li style="box-sizing: border-box; padding: 0px 5px;">499</li><li style="box-sizing: border-box; padding: 0px 5px;">500</li><li style="box-sizing: border-box; padding: 0px 5px;">501</li><li style="box-sizing: border-box; padding: 0px 5px;">502</li><li style="box-sizing: border-box; padding: 0px 5px;">503</li><li style="box-sizing: border-box; padding: 0px 5px;">504</li><li style="box-sizing: border-box; padding: 0px 5px;">505</li><li style="box-sizing: border-box; padding: 0px 5px;">506</li><li style="box-sizing: border-box; padding: 0px 5px;">507</li><li style="box-sizing: border-box; padding: 0px 5px;">508</li><li style="box-sizing: border-box; padding: 0px 5px;">509</li><li style="box-sizing: border-box; padding: 0px 5px;">510</li><li style="box-sizing: border-box; padding: 0px 5px;">511</li><li style="box-sizing: border-box; padding: 0px 5px;">512</li><li style="box-sizing: border-box; padding: 0px 5px;">513</li><li style="box-sizing: border-box; padding: 0px 5px;">514</li><li style="box-sizing: border-box; padding: 0px 5px;">515</li><li style="box-sizing: border-box; padding: 0px 5px;">516</li><li style="box-sizing: border-box; padding: 0px 5px;">517</li><li style="box-sizing: border-box; padding: 0px 5px;">518</li><li style="box-sizing: border-box; padding: 0px 5px;">519</li><li style="box-sizing: border-box; padding: 0px 5px;">520</li><li style="box-sizing: border-box; padding: 0px 5px;">521</li><li style="box-sizing: border-box; padding: 0px 5px;">522</li><li style="box-sizing: border-box; padding: 0px 5px;">523</li><li style="box-sizing: border-box; padding: 0px 5px;">524</li><li style="box-sizing: border-box; padding: 0px 5px;">525</li><li style="box-sizing: border-box; padding: 0px 5px;">526</li><li style="box-sizing: border-box; padding: 0px 5px;">527</li><li style="box-sizing: border-box; padding: 0px 5px;">528</li><li style="box-sizing: border-box; padding: 0px 5px;">529</li><li style="box-sizing: border-box; padding: 0px 5px;">530</li><li style="box-sizing: border-box; padding: 0px 5px;">531</li><li style="box-sizing: border-box; padding: 0px 5px;">532</li><li style="box-sizing: border-box; padding: 0px 5px;">533</li><li style="box-sizing: border-box; padding: 0px 5px;">534</li><li style="box-sizing: border-box; padding: 0px 5px;">535</li><li style="box-sizing: border-box; padding: 0px 5px;">536</li><li style="box-sizing: border-box; padding: 0px 5px;">537</li><li style="box-sizing: border-box; padding: 0px 5px;">538</li><li style="box-sizing: border-box; padding: 0px 5px;">539</li><li style="box-sizing: border-box; padding: 0px 5px;">540</li><li style="box-sizing: border-box; padding: 0px 5px;">541</li><li style="box-sizing: border-box; padding: 0px 5px;">542</li><li style="box-sizing: border-box; padding: 0px 5px;">543</li><li style="box-sizing: border-box; padding: 0px 5px;">544</li><li style="box-sizing: border-box; padding: 0px 5px;">545</li><li style="box-sizing: border-box; padding: 0px 5px;">546</li><li style="box-sizing: border-box; padding: 0px 5px;">547</li><li style="box-sizing: border-box; padding: 0px 5px;">548</li><li style="box-sizing: border-box; padding: 0px 5px;">549</li><li style="box-sizing: border-box; padding: 0px 5px;">550</li><li style="box-sizing: border-box; padding: 0px 5px;">551</li><li style="box-sizing: border-box; padding: 0px 5px;">552</li><li style="box-sizing: border-box; padding: 0px 5px;">553</li><li style="box-sizing: border-box; padding: 0px 5px;">554</li><li style="box-sizing: border-box; padding: 0px 5px;">555</li><li style="box-sizing: border-box; padding: 0px 5px;">556</li><li style="box-sizing: border-box; padding: 0px 5px;">557</li><li style="box-sizing: border-box; padding: 0px 5px;">558</li><li style="box-sizing: border-box; padding: 0px 5px;">559</li><li style="box-sizing: border-box; padding: 0px 5px;">560</li><li style="box-sizing: border-box; padding: 0px 5px;">561</li><li style="box-sizing: border-box; padding: 0px 5px;">562</li><li style="box-sizing: border-box; padding: 0px 5px;">563</li><li style="box-sizing: border-box; padding: 0px 5px;">564</li><li style="box-sizing: border-box; padding: 0px 5px;">565</li><li style="box-sizing: border-box; padding: 0px 5px;">566</li><li style="box-sizing: border-box; padding: 0px 5px;">567</li><li style="box-sizing: border-box; padding: 0px 5px;">568</li><li style="box-sizing: border-box; padding: 0px 5px;">569</li><li style="box-sizing: border-box; padding: 0px 5px;">570</li><li style="box-sizing: border-box; padding: 0px 5px;">571</li><li style="box-sizing: border-box; padding: 0px 5px;">572</li><li style="box-sizing: border-box; padding: 0px 5px;">573</li><li style="box-sizing: border-box; padding: 0px 5px;">574</li><li style="box-sizing: border-box; padding: 0px 5px;">575</li><li style="box-sizing: border-box; padding: 0px 5px;">576</li><li style="box-sizing: border-box; padding: 0px 5px;">577</li><li style="box-sizing: border-box; padding: 0px 5px;">578</li><li style="box-sizing: border-box; padding: 0px 5px;">579</li><li style="box-sizing: border-box; padding: 0px 5px;">580</li><li style="box-sizing: border-box; padding: 0px 5px;">581</li><li style="box-sizing: border-box; padding: 0px 5px;">582</li><li style="box-sizing: border-box; padding: 0px 5px;">583</li><li style="box-sizing: border-box; padding: 0px 5px;">584</li><li style="box-sizing: border-box; padding: 0px 5px;">585</li><li style="box-sizing: border-box; padding: 0px 5px;">586</li><li style="box-sizing: border-box; padding: 0px 5px;">587</li><li style="box-sizing: border-box; padding: 0px 5px;">588</li><li style="box-sizing: border-box; padding: 0px 5px;">589</li><li style="box-sizing: border-box; padding: 0px 5px;">590</li><li style="box-sizing: border-box; padding: 0px 5px;">591</li><li style="box-sizing: border-box; padding: 0px 5px;">592</li><li style="box-sizing: border-box; padding: 0px 5px;">593</li><li style="box-sizing: border-box; padding: 0px 5px;">594</li><li style="box-sizing: border-box; padding: 0px 5px;">595</li><li style="box-sizing: border-box; padding: 0px 5px;">596</li><li style="box-sizing: border-box; padding: 0px 5px;">597</li><li style="box-sizing: border-box; padding: 0px 5px;">598</li><li style="box-sizing: border-box; padding: 0px 5px;">599</li><li style="box-sizing: border-box; padding: 0px 5px;">600</li><li style="box-sizing: border-box; padding: 0px 5px;">601</li><li style="box-sizing: border-box; padding: 0px 5px;">602</li><li style="box-sizing: border-box; padding: 0px 5px;">603</li><li style="box-sizing: border-box; padding: 0px 5px;">604</li><li style="box-sizing: border-box; padding: 0px 5px;">605</li><li style="box-sizing: border-box; padding: 0px 5px;">606</li><li style="box-sizing: border-box; padding: 0px 5px;">607</li><li style="box-sizing: border-box; padding: 0px 5px;">608</li><li style="box-sizing: border-box; padding: 0px 5px;">609</li><li style="box-sizing: border-box; padding: 0px 5px;">610</li><li style="box-sizing: border-box; padding: 0px 5px;">611</li><li style="box-sizing: border-box; padding: 0px 5px;">612</li><li style="box-sizing: border-box; padding: 0px 5px;">613</li><li style="box-sizing: border-box; padding: 0px 5px;">614</li><li style="box-sizing: border-box; padding: 0px 5px;">615</li><li style="box-sizing: border-box; padding: 0px 5px;">616</li><li style="box-sizing: border-box; padding: 0px 5px;">617</li><li style="box-sizing: border-box; padding: 0px 5px;">618</li><li style="box-sizing: border-box; padding: 0px 5px;">619</li><li style="box-sizing: border-box; padding: 0px 5px;">620</li><li style="box-sizing: border-box; padding: 0px 5px;">621</li><li style="box-sizing: border-box; padding: 0px 5px;">622</li><li style="box-sizing: border-box; padding: 0px 5px;">623</li><li style="box-sizing: border-box; padding: 0px 5px;">624</li><li style="box-sizing: border-box; padding: 0px 5px;">625</li><li style="box-sizing: border-box; padding: 0px 5px;">626</li><li style="box-sizing: border-box; padding: 0px 5px;">627</li><li style="box-sizing: border-box; padding: 0px 5px;">628</li><li style="box-sizing: border-box; padding: 0px 5px;">629</li><li style="box-sizing: border-box; padding: 0px 5px;">630</li><li style="box-sizing: border-box; padding: 0px 5px;">631</li><li style="box-sizing: border-box; padding: 0px 5px;">632</li><li style="box-sizing: border-box; padding: 0px 5px;">633</li><li style="box-sizing: border-box; padding: 0px 5px;">634</li><li style="box-sizing: border-box; padding: 0px 5px;">635</li><li style="box-sizing: border-box; padding: 0px 5px;">636</li><li style="box-sizing: border-box; padding: 0px 5px;">637</li><li style="box-sizing: border-box; padding: 0px 5px;">638</li><li style="box-sizing: border-box; padding: 0px 5px;">639</li><li style="box-sizing: border-box; padding: 0px 5px;">640</li><li style="box-sizing: border-box; padding: 0px 5px;">641</li><li style="box-sizing: border-box; padding: 0px 5px;">642</li><li style="box-sizing: border-box; padding: 0px 5px;">643</li><li style="box-sizing: border-box; padding: 0px 5px;">644</li><li style="box-sizing: border-box; padding: 0px 5px;">645</li><li style="box-sizing: border-box; padding: 0px 5px;">646</li><li style="box-sizing: border-box; padding: 0px 5px;">647</li><li style="box-sizing: border-box; padding: 0px 5px;">648</li><li style="box-sizing: border-box; padding: 0px 5px;">649</li><li style="box-sizing: border-box; padding: 0px 5px;">650</li><li style="box-sizing: border-box; padding: 0px 5px;">651</li><li style="box-sizing: border-box; padding: 0px 5px;">652</li><li style="box-sizing: border-box; padding: 0px 5px;">653</li><li style="box-sizing: border-box; padding: 0px 5px;">654</li><li style="box-sizing: border-box; padding: 0px 5px;">655</li><li style="box-sizing: border-box; padding: 0px 5px;">656</li><li style="box-sizing: border-box; padding: 0px 5px;">657</li><li style="box-sizing: border-box; padding: 0px 5px;">658</li><li style="box-sizing: border-box; padding: 0px 5px;">659</li><li style="box-sizing: border-box; padding: 0px 5px;">660</li><li style="box-sizing: border-box; padding: 0px 5px;">661</li><li style="box-sizing: border-box; padding: 0px 5px;">662</li><li style="box-sizing: border-box; padding: 0px 5px;">663</li><li style="box-sizing: border-box; padding: 0px 5px;">664</li><li style="box-sizing: border-box; padding: 0px 5px;">665</li><li style="box-sizing: border-box; padding: 0px 5px;">666</li><li style="box-sizing: border-box; padding: 0px 5px;">667</li><li style="box-sizing: border-box; padding: 0px 5px;">668</li><li style="box-sizing: border-box; padding: 0px 5px;">669</li><li style="box-sizing: border-box; padding: 0px 5px;">670</li><li style="box-sizing: border-box; padding: 0px 5px;">671</li><li style="box-sizing: border-box; padding: 0px 5px;">672</li><li style="box-sizing: border-box; padding: 0px 5px;">673</li><li style="box-sizing: border-box; padding: 0px 5px;">674</li><li style="box-sizing: border-box; padding: 0px 5px;">675</li><li style="box-sizing: border-box; padding: 0px 5px;">676</li><li style="box-sizing: border-box; padding: 0px 5px;">677</li><li style="box-sizing: border-box; padding: 0px 5px;">678</li><li style="box-sizing: border-box; padding: 0px 5px;">679</li><li style="box-sizing: border-box; padding: 0px 5px;">680</li><li style="box-sizing: border-box; padding: 0px 5px;">681</li><li style="box-sizing: border-box; padding: 0px 5px;">682</li><li style="box-sizing: border-box; padding: 0px 5px;">683</li><li style="box-sizing: border-box; padding: 0px 5px;">684</li><li style="box-sizing: border-box; padding: 0px 5px;">685</li><li style="box-sizing: border-box; padding: 0px 5px;">686</li><li style="box-sizing: border-box; padding: 0px 5px;">687</li><li style="box-sizing: border-box; padding: 0px 5px;">688</li><li style="box-sizing: border-box; padding: 0px 5px;">689</li><li style="box-sizing: border-box; padding: 0px 5px;">690</li><li style="box-sizing: border-box; padding: 0px 5px;">691</li><li style="box-sizing: border-box; padding: 0px 5px;">692</li><li style="box-sizing: border-box; padding: 0px 5px;">693</li><li style="box-sizing: border-box; padding: 0px 5px;">694</li><li style="box-sizing: border-box; padding: 0px 5px;">695</li><li style="box-sizing: border-box; padding: 0px 5px;">696</li><li style="box-sizing: border-box; padding: 0px 5px;">697</li><li style="box-sizing: border-box; padding: 0px 5px;">698</li><li style="box-sizing: border-box; padding: 0px 5px;">699</li><li style="box-sizing: border-box; padding: 0px 5px;">700</li><li style="box-sizing: border-box; padding: 0px 5px;">701</li><li style="box-sizing: border-box; padding: 0px 5px;">702</li><li style="box-sizing: border-box; padding: 0px 5px;">703</li><li style="box-sizing: border-box; padding: 0px 5px;">704</li><li style="box-sizing: border-box; padding: 0px 5px;">705</li><li style="box-sizing: border-box; padding: 0px 5px;">706</li><li style="box-sizing: border-box; padding: 0px 5px;">707</li><li style="box-sizing: border-box; padding: 0px 5px;">708</li><li style="box-sizing: border-box; padding: 0px 5px;">709</li><li style="box-sizing: border-box; padding: 0px 5px;">710</li><li style="box-sizing: border-box; padding: 0px 5px;">711</li><li style="box-sizing: border-box; padding: 0px 5px;">712</li><li style="box-sizing: border-box; padding: 0px 5px;">713</li><li style="box-sizing: border-box; padding: 0px 5px;">714</li><li style="box-sizing: border-box; padding: 0px 5px;">715</li><li style="box-sizing: border-box; padding: 0px 5px;">716</li><li style="box-sizing: border-box; padding: 0px 5px;">717</li><li style="box-sizing: border-box; padding: 0px 5px;">718</li><li style="box-sizing: border-box; padding: 0px 5px;">719</li><li style="box-sizing: border-box; padding: 0px 5px;">720</li><li style="box-sizing: border-box; padding: 0px 5px;">721</li><li style="box-sizing: border-box; padding: 0px 5px;">722</li><li style="box-sizing: border-box; padding: 0px 5px;">723</li><li style="box-sizing: border-box; padding: 0px 5px;">724</li><li style="box-sizing: border-box; padding: 0px 5px;">725</li><li style="box-sizing: border-box; padding: 0px 5px;">726</li><li style="box-sizing: border-box; padding: 0px 5px;">727</li><li style="box-sizing: border-box; padding: 0px 5px;">728</li><li style="box-sizing: border-box; padding: 0px 5px;">729</li><li style="box-sizing: border-box; padding: 0px 5px;">730</li><li style="box-sizing: border-box; padding: 0px 5px;">731</li><li style="box-sizing: border-box; padding: 0px 5px;">732</li><li style="box-sizing: border-box; padding: 0px 5px;">733</li><li style="box-sizing: border-box; padding: 0px 5px;">734</li><li style="box-sizing: border-box; padding: 0px 5px;">735</li><li style="box-sizing: border-box; padding: 0px 5px;">736</li><li style="box-sizing: border-box; padding: 0px 5px;">737</li><li style="box-sizing: border-box; padding: 0px 5px;">738</li><li style="box-sizing: border-box; padding: 0px 5px;">739</li><li style="box-sizing: border-box; padding: 0px 5px;">740</li><li style="box-sizing: border-box; padding: 0px 5px;">741</li><li style="box-sizing: border-box; padding: 0px 5px;">742</li><li style="box-sizing: border-box; padding: 0px 5px;">743</li><li style="box-sizing: border-box; padding: 0px 5px;">744</li><li style="box-sizing: border-box; padding: 0px 5px;">745</li><li style="box-sizing: border-box; padding: 0px 5px;">746</li><li style="box-sizing: border-box; padding: 0px 5px;">747</li><li style="box-sizing: border-box; padding: 0px 5px;">748</li><li style="box-sizing: border-box; padding: 0px 5px;">749</li><li style="box-sizing: border-box; padding: 0px 5px;">750</li><li style="box-sizing: border-box; padding: 0px 5px;">751</li><li style="box-sizing: border-box; padding: 0px 5px;">752</li><li style="box-sizing: border-box; padding: 0px 5px;">753</li><li style="box-sizing: border-box; padding: 0px 5px;">754</li></ul>
以後我還會繼續添加遇到的知識總結。參考了不少網絡資源,目錄不一一列出了。
——————————————
6.15更新
——————————————
對面向對象的理解
三個特徵:繼承、封裝、多態。
1. 類的繼承性是指從已有的一個類來extends子類,子類具有了父類的所有特徵,同時,子類也可以有新的特性。
2. 類的封裝是指類把所有的操作都封閉起來,僅僅提供接口出來讓其他人使用,使用的人沒有必要懂得類裏面的操作,只需要懂得操作接口就可以了。同時,封裝也提高了程序的可替換性。
3. 類的多態性是一個對象的某項功能可以處理不同類型的問題,或者一個子類可以將父類的某個功能替換成新的功能,具體到編程的方面來說實現類的多態有override和overload,也就是覆寫和重載。
修飾符static
static 可修飾屬性、方法和代碼塊:
- static修飾的屬性爲一個類的共享變量,屬於整個類,在不實例化對象的情況下就能訪問。
- static修飾方法表明此方法爲類方法(靜態方法),靜態方法不需要有對象,可以使用類名調用,靜態方法不能訪問非靜態成員,包括成員的變量和方法,因爲此時是通過類調用的,沒有對象的概念。this是不可用的。
- 當static修飾代碼塊時(注:此代碼塊要在此類的任何一個方法之外),那麼這個代碼塊在代碼被裝載進虛擬機生成對象的時候可被裝載一次,以後再也不執行了,一般靜態代碼塊被用來初始化靜態成員。
HashMap和TreeMap在性能上有什麼樣的差別呢?
Java裏的TreeMap用一個紅黑樹來保證key/value的排序。紅黑樹是平衡二叉樹。保證二叉樹的平衡性,使得插入,刪除和查找都比較快,時間複雜度都是O(log n)。不過它沒有HashMap快,HashMap的時間複雜度是O(1)。
但是TreeMap的優點在於它裏面鍵值是排過序的,這樣就提供了一些其他的很有用的功能。
Vector、ArrayList和LinkedList比較
1.Vector是線程同步的,所以它也是線程安全的,而ArrayList和LinkedList是非線程安全的。如果不考慮到線程的安全因素,一般用ArrayList和LinkedList效率比較高。
2.ArrayList和Vector是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
3.如果集合中的元素的數目大於目前集合數組的長度時,Vector增長率爲目前數組長度的100%,而ArrayList增長率爲目前數組長度的50%.如果在集合中使用數據量比較大的數據,用vector有一定的優勢;反之,用ArrayList有優勢。
3.如果查找一個指定位置的數據,Vector和ArrayList使用的時間是相同的,花費時間爲O(1),而LinkedList需要遍歷查找,花費時間爲O(i),效率不如前兩者。
4.而如果移動、刪除一個指定位置的數據花費的時間爲0(n-i)n爲總長度,這個時候就應該考慮使用LinkedList,因爲它移動一個指定位置的數據所花費的時間爲0(1)。
5.對於在指定位置插入數據,LinedList比較佔優勢,因爲ArrayList要移動數據。
快速失敗(fail-fast)和安全失敗(fail-safe)的區別是什麼?
java.util包下面的所有的集合類都是快速失敗的,而java.util.concurrent包下面的所有的類都是安全失敗的。
快速失敗的迭代器會拋出ConcurrentModificationException異常,而安全失敗的迭代器永遠不會拋出這樣的異常。
Enumeration接口和Iterator接口的區別有哪些?
- Enumeration速度是Iterator的2倍,同時佔用更少的內存。
- Iterator遠遠比Enumeration安全,因爲其他線程不能夠修改正在被iterator遍歷的集合裏面的對象。
- Iterator允許調用者刪除底層集合裏面的元素,這對Enumeration來說是不可能的。
集合使用小總結
- 涉及到堆棧,隊列等操作,應該考慮用List;
- 需要快速插入,刪除元素,應該使用LinkedList;
- 需要快速隨機訪問元素,應該使用ArrayList。
- 程序在單線程環境中,或者訪問僅僅在一個線程中進行,考慮非同步的類,其效率較高;非線程安全的數據結構能帶來更好的性能。
- 多個線程可能同時操作一個類,應該使用同步的類。
- 對哈希表的操作,作爲key的對象要正確複寫equals和hashCode方法。
- 使用Map時,查找、更新、刪除、新增最好使用HashMap或HashTable
- 對Map進行自然順序或自定義鍵順序遍歷時,最好使用TreeMap;
推薦兩個我看過的總結:115個Java面試題和答案
http://www.importnew.com/10980.html
Java基礎知識總結
http://www.cnblogs.com/oubo/archive/2012/01/13/2394640.html