java基礎之集合

1. Collectiton:單列存儲集合
|--- List 元素是有序的,元素可以重複。因爲該集合體繫有索引  
|--- ArrayList: 底層的數據結構使用的是數組結構       特點:數組元素查詢很快,但是增刪很慢,因爲增刪一個元素,數組後面的其他元素都需要變動,線程不同步
|--- LinkList: 底層的數據結構使用的是鏈表數據結構 特點:鏈表查詢比較慢,反正與 數據結構 相反
|--- Vector: 底層是數組數據結構 特點:其他與 ArrayList 相同,但是 線程同步,被前者替代了
|--- Set 元素是無序的(存入和取出的順序不一定一致),元素不可以重複
|--- TreeSet:  可以對 Set 集合中的元素排序,底層數據結構是二叉樹。  保證元素的唯一性的一句 compareTo 方法 return 0

TreeSet 排序的第一種方式:讓元素自身具備比較性,元素需要實現 Comparable 接口實現 compareTo 方法。這種方式也成爲元素的順序。也即是默認順

TreeSet 排序的第二種方式:當元素不具備比較性時,或者具備的比較性不符合要求。這就要求集合自身具備比較性
在集合初始化時,就讓其擁有比較方式
當兩種排序都存在時,以比較器爲主

|--- HashSet: 底層數據結構是哈希表,線程不同步          
HashSet 是如何保證元素的唯一性:
是通過元素的兩個方法,HashCode 和 equals 來完成的
如果元素 HashCode 相同,纔會判斷 equals 是否爲 true
如果元素 HashCode 不相同,就不會調用 equals 方法

注意: 對於判斷元素是否存在,以及刪除等操作,依賴的方法是元素的 hashCsode() 和 equals() 方法

List 集合判斷元素是否相同,依據的是元素的 equals() 方法    ArrayList; 注意它們的區別

 Map 集合:該集合存儲鍵值對,而且要保證鍵值的唯一性 雙列存儲集合
|--- HashMap: 底層是哈希表數據結構,允許使用 null 鍵 null 值。該集合是不同步的 JDK 1.2 效率高
|--- TreeMap: 底層是二叉樹數據結構,線程不同步。可以用於給 Map 集合中的鍵進行排序。 和 Set 很像,Set 底層就是使用 Map集合 
|--- Hashtable: 底層是哈希表數據結構,不可以存入 null 鍵 null 值。該集合是線程同步的; JDK 1.0 效率低
 
1.添加
put( key , value)
2.刪除
clear() remove( Object key)
3.判斷
containsKey( Object Key) containsValue( Object Value) isEmpty()
4.獲取
get( Object key) size() Values()

KeySet():將 Map 中所有的鍵存入 Set 集合,在利用迭代器方法取出鍵值,最後根據 get() 方法取出每一個鍵值對應的值

entrySet():

2. 集合框架   Collection   List    Set   ArrayList   LinkList   Vector   TreeSet   HashSet

ArrayList:
1.add()的參數類型是 Object。以便於接收任意對象    2.集合中存儲的都是對象的引用

當我們使用數組時候,長度是固定的。這樣讓我們有時候使用感覺很麻煩,所以後面就定義了集合;集合可以隨着存儲元素的增加而增加,也可以隨着元素的減少而減少。

數組和集合的區別:

數組:數組既可以存儲基本數據類型,也可以存儲引用數據類型;存儲基本數據類型的時候存儲的是值,存儲引用基本數據類型的時候存儲的地址;數組的長度是固定的,不可變的。

集合:集合只能存儲引用數據類型,不過也可以存儲基本數據類型(因爲JDK新特性,會進行自動裝箱;把存儲的基本數據類型包裝成對象)。集合的長度是可變的,可以隨着元素自
動增加。

集合遍歷:數組遍歷;迭代器遍歷

3. 迭代器接口   iterator:

Iterator it = array.iterator();   獲取迭代器,用於取出集合元素

就把取出方式定義在集合的內部,這樣取出方式就可以直接訪問集合內部的元素。

那麼取出方式就被定義成了內部類。而每個容器的數據結構不同,所以取出的動作細節也不一樣。但是都有共性內容判斷和取出。那麼可以將共性抽取。

那麼這個內部類都符合一個規則,這個規則就是 Iterator 

如何獲取集合取出對象? 通過一個對外提供的方法 iterator()

for( Iterator it = vec.iterator() ; it.hasNext() ; )
{
show( it.next());
}

迭代器是對集合進行遍歷,而每個集合內部的存儲結構都是不同的;所以每一個集合存和取都是不同的,這樣就可能會要在每一個類中都定義 hasNext() 和 next() 方法。這樣就會
讓整個集合體系變得非常的臃腫。迭代器就是將這些方法向上抽出爲接口,然後各個類實現接口的方法。

好處:規範了集合的遍歷方式,整個集合體系都是使用 hasNext() 和 next() 方法來進行遍歷;代碼實現了底層封裝實現,這樣使用者不用知道怎麼實現的,只要知道使用即可。

4. List:元素是有序的,元素可以重複。因爲該集合體繫有索引   

   Set:元素是無序的,元素不可以重複

List:凡是可以操作角標的方法都是該體系特有的方法

List 特有的迭代器 ListIterator: 列表迭代器(是 Iterator 的子接口)

5. List集合:

包括 ArrayList , LinkedList , Vector ;

List 集合的特有功能:
void add(int index,E element)
E remove(int index)
E get(int index)
E set(int index,E element)

Vector 特有功能:
public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()

數組和鏈表的區別:數組查找快但是增刪慢;鏈表查找慢,但是增刪快;

ArrayList:底層數據結構是數組,查找快增刪慢;線程不安全,但是效率高。

Vector: 底層數據結構是數組,查找快增刪慢;線程安全,但是效率不高;

LinkedList: 底層數據結構是鏈表,查找慢增刪快;線程不安全,效率高;

ArrayList 和 Vector 的區別:底層數據結構都是數組;但是前者線程不安全,效率高;後者線程安全的,效率低。

ArrayList 和 LinkedList 的區別:前者底層數據結構是數組,後者底層數據結構是鏈表;前者數據查找快,增刪慢;後者數據查找慢,增刪快。但是都是線程不安全。

使用規則:如果查詢數據多使用 ArrayList;如果數據修改多使用LinkedList;如果都多使用ArrayList。

6.枚舉就是 Vector 特有的取出方式。其實枚舉和迭代器很像,簡單說就是一樣的。

只是因爲枚舉的名字以及方法的名稱太長了,所以逐漸被迭代器所取代

for( Enumeration en = vec.elements(); en.hasMoreElements() ; )
{
show( en.nextElement());
}

7. List 集合判斷元素是否相同,依據的是元素的 equals() 方法    ArrayList

8. Set 集合的功能和 Collection集合功能是一致 

9. 當排序的時候,主要條件相同時,一定要判斷一下次要條件

10. Collections 集合(是一個集合框架工具類):所有方法都是靜態的,對集合進行操作的工具類。  

Collections.sort();    Collections.max();   Collections.binarySearch();   Collections.fill();    Collections.reverse()

Collections.reverseOrder();   Collections.reverseOrder( 也可以傳一個比較器當參數);

11.把數組轉換成集合有什麼好處: 可以使用集合的思想和方法來操作數組中的元素    注意:將數組轉換成集合,不可以使用集合的增刪方法操作。因爲數組的長度是固定的

爲什麼要把集合轉換成數組:  爲了限定對元素的操作,此時元素不需要進行增刪

12.高級 for 循環:      for( String s : array)
{
System.out.println( s);
}
對集合進行遍歷的時候,只能獲取元素。但是不能對集合進行操作

迭代器除了遍歷外,還可以進行 remove() 集合中元素的操作

ListIterator 可以遍歷,還可以進行增刪集合元素的操作

13.JDK 1.5版本出現的新特性: 可變參數,其實就是傳遞數組參數的簡寫形式,不用每次都去新建一個數組,而可以直接傳遞數據元素

注意:可變參數 一定要定義在參數列表的最後面

StaticImport 靜態導入。   當類名相同時,需要指定具體的包名;
當方法名相同時,需要指定所屬的對象或者類 

14.System:類中的方法和屬性都是靜態的

獲取系統屬性信息:   Properties getProperties();

15.Math.ceil(); 返回大於指定數據的最小整數    Math.floor();返回小於指定數據的最大整數  Math.round();四捨五入    Math.pow( 2,3);輸出8   二的三次方


Math.random();隨機數  返回大於等於0且小於1的隨機數













發佈了39 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章