數據結構(也稱為集合類)大致分類如下:
Map圖接口(包含HashMap和TreeMap);
Collection集合接口(包含List接口和Set接口):
List線性表接口(包含ArrayList和LinkedList);
Set集合接口(包含HashSet和TreeSet);
1.線性表之順序表ArrayList簡介:
ArrayList是大小可變的動態數組,其遍歷效率高,更新效率較低;
常用的方法如下:
獲取ArrayList的長度(包含的元素個數)方法:size(); return int
向ArrayList尾部添加元素方法:add(Object o); void
向ArrayList指定位置添加元素方法:add(int i,Object o); void
用新元素替換ArrayList指定位置的元素的方法:set(int i,Object newo); return 原有的元素值
刪除ArrayList指定位置的元素的方法:remove(int i); return 被刪除的元素
獲取ArrayList指定位置的元素的方法:get(int i);
2.線性表之鏈表LinkedList簡介:
LinkedList是使用指針關聯的雙向鏈表,其獲取下一個元素的方式是通過指向下一個元素的地址對象(通常叫做指針)獲取的,由於它的鏈式存儲結構,LinkedList在任意位置的元素插入(或刪除)效率都比較快,因為元素插入(或刪除)不需要移動LinkedList中的其它元素,當需要一個頻繁插入(或刪除)的線性結構時,首選的List實現類應該是LinkedList。 1.LinkedList對於ArrayList來說,其遍歷速度較慢,因為他獲取下一個元素的時間為尋址時間。 2.LinkedList適合存儲數據元素變動較大的線性集合,可以更快速的對指定位置的元素進行增加、刪除、修改和查詢功能。
常用的方法如下:
獲取LinkedList的長度(包含的元素個數)方法:size(); return int
向LinkedList尾部添加元素方法:add(Object o); void
向LinkedList指定位置添加元素方法:add(int i,Object o); void
用新元素替換LinkedList指定位置的元素的方法:set(int i,Object newo); return 原有的元素值
刪除LinkedList指定位置的元素的方法:remove(int i); return 被刪除的元素
獲取LinkedList指定位置的元素的方法:get(int i);
3.動態數組Vector簡介:
Vector是一個Object類型的可變長的數組,其元素類型可以是任意的數據類型(Object的子類),我們使用Vector通常是存儲元素類型不同,但描述對象又統一的集合。
Vector與ArrayList的區別是Vector是線程安全的,故Vector相對於ArrayList的速度稍慢一些。
其用法與ArrayList基本相同;
常用的方法如下:
獲取LinkedList的長度(包含的元素個數)方法:size(); return int
向LinkedList尾部添加元素方法:add(Object o); void
向LinkedList指定位置添加元素方法:add(int i,Object o); void
用新元素替換LinkedList指定位置的元素的方法:set(int i,Object newo); return 原有的元素值
刪除LinkedList指定位置的元素的方法:remove(int i); return 被刪除的元素
獲取LinkedList指定位置的元素的方法:get(int i);
4.集合Set簡介:
Java中使用Set接口描述一個集合,集合Set是Collection的子接口,Set不允許其數據元素重復出現,也就是說在Set中每一個數據元素都是唯一的。
另外Set中的元素是散列分布的,所以其沒有位置索引;
Set接口定義的常用方法如下:
獲取set的長度(包含的元素個數)方法:size(); return int
向set添加元素方法:add(Object o); return boolean
刪除set元素o的方法:remove(Object o); return boolean
判斷元素o是否存在於Set中的方法:contains(Object o); return boolean
將Set裝入迭代器中而進行操作的方法(因為Set沒有索引,所以不方便直接對其進行操作,從而需要借助其迭代器方法):iterator(); return iterator
(1).迭代器iterator簡介:
- 迭代器允許調用者利用定義良好的語義在迭代期間從迭代器所指向的 collection 移除元素。
- 常用方法:
- hasNext();判斷迭代器中是否有下一個元素;return boolean
- next(); 返回迭代的下一個元素;
- remove();直接在其迭代的集合中刪除迭代的最后一個元素; void;每次調用 next 只能調用一次此方法。如果進行迭代時用調用此方法之外的其他方式修改了該迭代器所指向的 collection,則迭代器的行為是不確定的。
- 注意:無法直接通過迭代器修改集合元素!
(2).集合的運算簡介:
addAll(Collection c);求集合之間的並集;
retainAll(Collection c);求集合之間的交集;
removeAll(Collection c);求集合之間的差集;
containsAll(Collection c);判斷c是否是this的子集;
(3).HashSet簡介:
HashSet通過Hash算法排布集合內的元素,所謂的Hash算法就是把任意長度的輸入(又叫做預映射),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射。對於不同類型的信息,其散列值公式亦不完全相同。
當我們使用HashSet存儲自定義類時,需要在自定義類中重寫equals和hashCode方法,主要原因是集合內不允許有重復的數據元素,在集合校驗元素的有效性時(數據元素不可重復),需要調用equals和hashCode驗證。
HashSet在判斷數據元素是否重復時: 1. 檢查hashCode值是否與集合中已有相同。
2. 如果hashCode相同再調用equals方法進一步檢查。(equals返回真表示重復)
(4.)TreeSet簡介:
TreeSet是一個有序集合,其元素按照升序排列,默認是按照自然順序排列,也就是說TreeSet中的對象元素需要實現Comparable接口。
TreeSet類中跟HashSet類一樣也沒有get()方法來獲取指定位置的元素,所以也只能通過迭代器方法來獲取。
TreeSet雖然是有序的,但是並沒有具體的索引,當插入一個新的數據元素的時候,TreeSet中原有的數據元素可能需要重新排序,所以TreeSet插入和刪除數據元素的效率較低。
當我們使用TreeSet存儲自定義類時,需要在自定義類中重寫compareTo方法,以提供比對形式,否在TreeSet不能對用戶自定義的類型進行正確的樹狀排序。
(5.)包裝器Collections簡介:
此類完全由在 collection 上進行操作或返回 collection 的靜態方法組成。
它包含在 collection 上操作的多態算法,即“包裝器”,包裝器返回由指定 collection 支持的新 collection,以及少數其他內容
常用靜態方法如下:
5.映射集(圖)Map簡介:
Java中使用Map接口描述映射結構,映射Map是一個獨立的接口,描述的是鍵key-值value的對應關系,Map不允許鍵重復,並且每個鍵只能對應一個值。
常用方法:
size();獲取Map尺寸(即包含的鍵值對數);
put(Object key,Object value);向Map中添加鍵值對;
remove(Object key);根據key刪除對應的鍵值對,返回被刪除的值;
get(Object key);根據key獲取對應的value值;
containKey(Object key);判斷Map中是否包含該鍵key;
keySet();返回所有的鍵組成的集合;
entrySet();將Map中的鍵值對存入到集合中,該集合中的元素類型是entry;
entry的元素類型和map一樣;
entry常用方法:
getKey();獲取當前的鍵;
getValue();獲取當前的值;
values();返回Map中的所有值組成的collection對象;
(1).HashMap簡介:
HashMap通過hash算法排布存儲Map中的鍵(key),HashMap也是最常用的圖狀數據結構,其存儲的數據元素是成對出現的,也就是說每一個鍵(key)對應一個值(value)。 HashMap中的數據元素不是按照我們添加的順序排布的,並且其內存模式也不是連續的,但是其key值的排布是根據Hash算法獲得的,所以在數據元素的檢索方面速度還是較快的。 HashMap不能直接裝入迭代器,必須將HashMap的所有鍵key裝入迭代器,再進行遍歷,或者是使用Entry類,將所有數據元素轉化為Entry的集合進行處理。
HashMap不允許出現重復的鍵(key),並且每個鍵(key)只能對應一個值(value)。
(2).TreeMap簡介:
TreeMap是一種有序的映射關系,即每對鍵key-值value在TreeMap中是有序排列的,並且這個序列遵循自然序列,當我們向TreeMap插入新的數據元素時,TreeMap可能會重新排序,所以TreeMap中的任何元素在整個映射組中是不固定的。
當我們的TreeMap鍵(key)是自定義類時,需要在自定義類中重寫compareTo方法,以提供比對形式,否在TreeMap不能對用戶自定義的類型的鍵(key)進行正確的樹狀排序,也就不能對整個鍵值對起到有效的排序效果。
TreeMap的一些特殊方法: