Java集合整理(List and Set and Map)
- 集合的由來
- 陣列長度是固定,當新增的元素超過了陣列的長度時需要對陣列重新定義,太麻煩,java內部給我們提供了集合類,能儲存任意物件,長度是可以改變的,隨著元素的增加而增加,隨著元素的減少而減少
- 陣列和集合的區別
- 區別1 :
- 陣列既可以儲存基本資料型別,又可以儲存引用資料型別,基本資料型別儲存的是值,引用資料型別儲存的是地址值
- 集合只能儲存引用資料型別(物件)集合中也可以儲存基本資料型別,但是在儲存的時候會自動裝箱變成物件
- 區別2:
- 陣列長度是固定的,不能自動增長
- 集合的長度的是可變的,可以根據元素的增加而增長
- 區別1 :
- C:陣列和集合什麼時候用
* 1,如果元素個數是固定的推薦用陣列
* 2,如果元素個數不是固定的推薦用集合 - A:迭代器原理
- 迭代器原理:迭代器是對集合進行遍歷,而每一個集合內部的儲存結構都是不同的,所以每一個集合存和取都是不一樣,那麼就需要在每一個類中定義hasNext()和next()方法,這樣做是可以的,但是會讓整個集合體系過於臃腫,迭代器是將這樣的方法向上抽取出介面,然後在每個類的內部,定義自己迭代方式,這樣做的好處有二,第一規定了整個集合體系的遍歷方式都是hasNext()和next()方法,第二,程式碼有底層內部實現,使用者不用管怎麼實現的,會用即可
- B:迭代器原始碼解析
- 查詢iterator()方法
- 檢視返回值型別是內部類new Itr(),說明Itr這個類實現Iterator介面
- 查詢Itr這個內部類,發現重寫了Iterator中的所有抽象方法
Iterator介面部分原始碼:
* @author Josh Bloch
* @see Collection
* @see ListIterator
* @see Iterable
* @since 1.2
*/
public interface Iterator<E> {
/**
* Returns {@code true} if the iteration has more elements.
* (In other words, returns {@code true} if {@link #next} would
* return an element rather than throwing an exception.)
*
* @return {@code true} if the iteration has more elements
*/
boolean hasNext();
/**
* Returns the next element in the iteration.
*
* @return the next element in the iteration
* @throws NoSuchElementException if the iteration has no more elements
*/
E next();
Arraylist內部類
/**
* Returns an iterator over the elements in this list in proper sequence.
*
* <p>The returned iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
*
* @return an iterator over the elements in this list in proper sequence
*/
public Iterator<E> iterator() {
return new Itr();
}
/**
* An optimized version of AbstractList.Itr
*/
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
內部類實現了iterator介面,重寫了next,hassNext方法,擴充套件性賊雞兒強,針對不同的集合,都有自己的實現。
- A:Vector類概述
B:Vector類特有功能
- public void addElement(E obj)
- public E elementAt(int index)
public Enumeration elements()
Vector的迭代
Vector v = new Vector(); //建立集合物件,List的子類
v.addElement("a");
v.addElement("b");
v.addElement("c");
v.addElement("d");
//Vector迭代
Enumeration en = v.elements(); //獲取列舉
while(en.hasMoreElements()) { //判斷集合中是否有元素
System.out.println(en.nextElement());//獲取集合中的元素
}
*去除ArrayList中重複自定義物件元素
* :案例演示
* 需求:ArrayList去除集合中自定義物件元素的重複值(物件的成員變數值相同)
* :注意事項
* 重寫equals()方法的
List總結:
* A:List的三個子類的特點
ArrayList:
底層資料結構是陣列,查詢快,增刪慢。
執行緒不安全,效率高。
Vector:
底層資料結構是陣列,查詢快,增刪慢。
執行緒安全,效率低。
Vector相對ArrayList查詢慢(執行緒安全的)
Vector相對LinkedList增刪慢(陣列結構)
LinkedList:
底層資料結構是連結串列,查詢慢,增刪快。
執行緒不安全,效率高。
Vector和ArrayList的區別
Vector是執行緒安全的,效率低
ArrayList是執行緒不安全的,效率高
共同點:都是陣列實現的
ArrayList和LinkedList的區別
ArrayList底層是陣列結果,查詢和修改快
LinkedList底層是連結串列結構的,增和刪比較快,查詢和修改比較慢
共同點:都是執行緒不安全的
* B:List有三個兒子,我們到底使用誰呢?
查詢多用ArrayList
增刪多用LinkedList
如果都多ArrayList
- A:Set集合概述及特點
*此類實現Set介面,由雜湊表(實際為HashMap例項)支援。 對集合的迭代次序不作任何保證; 特別是,它不能保證訂單在一段時間內保持不變。 這個類允許null元素。不存在索引
*17.04_集合框架(HashSet如何保證元素唯一性的原理)
* 1.HashSet原理
* 我們使用Set集合都是需要去掉重複元素的, 如果在儲存的時候逐個equals()比較, 效率較低,雜湊演算法提高了去重複的效率, 降低了使用equals()方法的次數
* 當HashSet呼叫add()方法儲存物件的時候, 先呼叫物件的hashCode()方法得到一個雜湊值, 然後在集合中查詢是否有雜湊值相同的物件
* 如果沒有雜湊值相同的物件就直接存入集合
* 如果有雜湊值相同的物件, 就和雜湊值相同的物件逐個進行equals()比較,比較結果為false就存入, true則不存
* 2.將自定義類的物件存入HashSet去重複
* 類中必須重寫hashCode()和equals()方法
* hashCode(): 屬性相同的物件返回值必須相同, 屬性不同的返回值儘量不同(提高效率)
* equals(): 屬性相同返回true, 屬性不同返回false,返回false的時候儲存
* A:LinkedHashSet的特點
* B:案例演示
* LinkedHashSet的特點
* 可以保證怎麼存就怎麼取
*TreeSet原理
* 1.特點
* TreeSet是用來排序的, 可以指定一個順序, 物件存入之後會按照指定的順序排列
* 2.使用方式
* a.自然順序(Comparable)
* TreeSet類的add()方法中會把存入的物件提升為Comparable型別
* 呼叫物件的compareTo()方法和集合中的物件比較
* 根據compareTo()方法返回的結果進行儲存
* b.比較器順序(Comparator)
* 建立TreeSet的時候可以制定 一個Comparator
* 如果傳入了Comparator的子類物件, 那麼TreeSet就會按照比較器中的順序排序
* add()方法內部會自動呼叫Comparator介面中compare()方法排序
* 呼叫的物件是compare方法的第一個引數,集合中的物件是compare方法的第二個引數
* c.兩種方式的區別
* TreeSet建構函式什麼都不傳, 預設按照類中Comparable的順序(沒有就報錯ClassCastException)
* TreeSet如果傳入Comparator, 就優先按照Comparator
- A:Map介面概述
- 檢視API可以知道:
- 將鍵對映到值的物件
- 一個對映不能包含重複的鍵
- 每個鍵最多隻能對映到一個值
- 檢視API可以知道:
- B:Map介面和Collection介面的不同
- Map是雙列的,Collection是單列的
- Map的鍵唯一,Collection的子體系Set是唯一的
- Map集合的資料結構值針對鍵有效,跟值無關;Collection集合的資料結構是針對元素有效
- HashMap和Hashtable的區別
- Hashtable是JDK1.0版本出現的,是執行緒安全的,效率低,HashMap是JDK1.2版本出現的,是執行緒不安全的,效率高
- Hashtable不可以儲存null鍵和null值,HashMap可以儲存null鍵和null值
- B:Collections成員方法 *
public static <T> void sort(List<T> list)
public static <T> int binarySearch(List<?> list,T key)
public static <T> T max(Collection<?> coll)
public static void reverse(List<?> list) //翻轉集合
public static void shuffle(List<?> list) //隨機置換
基本大致等同於Set Set底層實現依賴的是Map!