集合概述
集合有時又稱為容器,簡單地說,它是一個對象,能将具有相同性質的多個元素彙聚成一個整體。集合被用于存儲、擷取、操縱和傳輸聚合的資料。
使用集合的技巧
看到Array就是數組結構,有角标,查詢速度很快。
看到link就是連結清單結構:增删速度快,而且有特有方法。addFirst; addLast;removeFirst(); removeLast(); getFirst();getLast();
看到hash就是哈希表,就要想到哈希值,就要想到唯一性,就要想到存入到該結構的中的元素必須覆寫hashCode,equals方法。
看到tree就是二叉樹,就要想到排序,就要想到用到比較。
比較的兩種方式
一個是Comparable:覆寫compareTo方法; 一個是Comparator:覆寫compare方法。
LinkedHashSet,LinkedHashMap:這兩個集合可以保證哈希表有存入順序和取出順序一緻,保證哈希表有序。
集合什麼時候用
當存儲的是一個元素時,就用Collection。
當存儲對象之間存在着映射關系時,就使用Map集合。
保證唯一,就用Set。不保證唯一,就用List。
集合按照其存儲結構可以分為兩大類,即單列集合Collection和雙列集合Map
Collection:單列集合類的根接口,用于存儲一系列符合某種規則的元素,它有兩個重要的子接口,分别是List和Set。其中,List的特點是元素有序、元素可重複。Set的特點是元素無序并且不可重複。List接口的主要實作類有ArrayList和LinkedList,Set接口的主要實作類有HashSet和TreeSet。
Map:雙列集合類的根接口,用于存儲具有鍵(Key)、值(Value)映射關系的元素,每個元素都包含一對鍵值,在使用Map集合時可以通過指定的Key找到對應的Value,例如根據一個學生的學号就可以找到對應的學生。Map接口的主要實作類有HashMap和TreeMap。
Collection接口
Collection是所有單列集合的父接口,是以在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可用于操作所有的單列集合。
public interface Collection<E> extends Iterable<E>
E可以為任何類
常用方法
boolean add(E obj) 将指定對象obj新增至集合内,增加成功傳回true,否則傳回false
boolean addAll(Collection c) 将指定集合c内所有元素新增至集合内,增加成功傳回true,否則傳回false
viod clear() 将集合内所有元素清空
boolean isEmpty() 檢查集合内是否沒有任何元素,如果是傳回true,否則傳回false
Iterator iterator() 将集合内的元素資訊轉存成Iterator對象
boolean remove(Object obj) 将指定元素obj從集合内移除,成功移除傳回true,否則傳回false
int size() 将集合内的元素總數傳回
Object[] toArray() 将集合内的元素轉存到數組後傳回該數組
Collection實作類
AbstractCollection 實作大多數Collection接口
AbstractList 擴充AbstractCollection并實作大多數List接口
AbstractSequentialList 為了被類集使用而擴充AbstractList,該類集是連續而不是用随機方式通路其元素
LinkedList 通過擴充AbstractSequentialList來實作連接配接表
ArrayList 通過擴充AbstractList來實作動态數組
AbstractSet 擴充AbstractCollection并實作大多數AbstractSet
HashSet 為了使用散清單而擴充AbstractSet
TreeSet 實作存儲在樹中的一個集合,擴充擴充AbstractSet
Collections工具類
它的出現給集合操作提供了更多的功能。這個類不需要建立對象,内部提供的都是靜态方法。
靜态方法
Collections.sort(list); list集合進行元素的自然順序排序。
Collections.sort(list,new ComparatorByLen()); 按指定的比較器方法排序。
class ComparatorByLen implements Comparator<String> {
public int compare(String s1,String s2) {
int temp = s1.length()-s2.length();
return temp==0
s1.compareTo(s2):temp;
}
}
Collections.binarySearch(); 折半查找
Collections.max(list); 傳回list中字典順序最大的元素。
int index = Collections.binarySearch(list,"zz"); 二分查找,傳回角标。必須是有序的
Collections.fill(); 可以将list集合中的所有元素替換成指定元素。
Collections.repalceAll(list,"要被替換的","替換的值"); 可以将list集合中的指定元素替換成指定元素。
Collections.reverse(); 反轉
Collections.reverseOrder(參數是比較器); 逆向反轉排序。倒序。
Collections.shuffle(list); 随機對list中的元素進行位置的置換。
Collection 和 Collections的差別
Collections是個java.util下的類,是針對集合類的一個工具類,提供一系列靜态方法,實作對集合的查找、排序、替換、線程安全化(将非同步的集合轉換成同步的)等操作。
Collection是個java.util下的接口,它是各種集合結構的父接口,繼承于它的接口主要有Set和List,提供了關于集合的一些操作,如插入、删除、判斷一個元素是否其成員、周遊等。
Arrays工具類
用于操作數組對象的工具類,裡面都是靜态方法。
1、使用Arrays的sort()方法排序
2、使用Arrays的binarySearch(Object[] a, Object key)方法查找元素
3、使用Arrays的copyOfRange(int[] original, int from, int to)方法拷貝元素
将數組中指定範圍的元素複制到一個新的數組中,該方法中參數original表示被複制的數組,from表示被複制元素的初始索引(包括),to表示被複制元素的最後索引(不包括)
4.使用Arrays的fill(Object[] a, Object val)方法填充元素
該方法可以将指定的值賦給數組中的每一個元素
5.使用Arrays的toString(int[] arr)方法把數組轉換為字元串
該方法并不是對Object類toString()方法的重寫,隻是用于傳回指定數組的字元串形式
數組轉換成list集合
String[] arr = {"abc","kk","qq"};
List<String> list = Arrays.asList(arr); //将arr數組轉成list集合。
好處:可以通過list集合中的方法來操作數組中的元素:isEmpty()、contains、indexOf、set;
注意(局限性):數組是固定長度,不可以使用集合對象增加或者删除等,會改變數組長度的功能方法。比如add、remove、clear。(會報不支援操作異常UnsupportedOperationException);
如果數組中存儲的是引用資料類型,直接作為集合的元素可以直接用集合方法操作。
如果數組中存儲的是基本資料類型,asList會将數組實體作為集合元素存在。
集合變數組
用的是Collection接口中的方法:toArray();
如果給toArray傳遞的指定類型的資料長度小于了集合的size,那麼toArray方法,會自定再建立一個該類型的資料,長度為集合的size。
如果傳遞的指定的類型的數組的長度大于了集合的size,那麼toArray方法,就不會建立新數組,直接使用該數組即可,并将集合中的元素存儲到數組中,其他為存儲元素的位置預設值null。
是以,在傳遞指定類型數組時,最好的方式就是指定的長度和size相等的數組。