集合
1、java集合框架概述
1.集合、數組都是多個數據存儲操作的結構,簡稱java容器
說明:主要指的存儲是內存層面的存儲,不涉及到持久化的存儲
可以分為Collection和Map兩種:
Collection接口:單列數據,定義了存取一組對象的方法的集合。
List:存儲有序、可重複的集合(ArrayList、LinkedList、Vector)
Set:存儲無序、不可重複的集合(HashSet、LinkedHashSet、TreeSet)
Map接口:雙列數據,保存具有映射關係“key-value對”的集合
HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
2、Collection接口方法
增、刪、改、查、插、長度、遍歷
添加:add(Object o)、addAll(Collection coll)
獲取有效元素的個數:int size()
清空集合:void clear()
是否空集合:boolean isEmpty()
是否包含某個元素:boolean contains(Object o)、boolean containAll(Collection c)(通過調用equals方法來挨個判斷比較)
刪除:boolean remove(Object o)、boolean removeAll(Collection coll)
取兩個集合的交際:boolean retainAll(Collection coll)
集合是否相等:boolean equals(Object o)
轉成對象數組:Object[] toArray()
獲取集合對象的哈希值:hashCode()
遍歷:iterator()(返回迭代器對象)
3、Iterator迭代器接口
3.1 概述
Iterator对象称为迭代器(设计模式的一种),主要用于遍歷 Collection 集合中的元素。GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 迭代器模式,就是为容器而生。集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
3.2 使用原理
調用.next()方法之前必須調用.hasNext()進行檢測。若不調用,且下一條記錄無效,直接調用.next()會拋出NoSuchElementException異常。
實例:
Iterator iterator = coll.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
3.3 Iterato接口中的remove()
注意:如果還未調用next()或在上一次調用 next 方法之后已經調用了 remove 方法,再調用remove都會报IllegalStateException。
實例:
Iterator iter = coll.iterator();
while(iter.hasNext()){
Object obj = iter.next();
if(obj.equals("Tom")){
iter.remove();
}
}
4、Collection子接口一:List
4.1 概述
通常用List代替數組。元素有序、可重複,集合中的每個元素都有對應的順序索引。其List接口的實現類常用有:ArrayList、LinkedList、Vector。
List接口:
ArrayLis:作為List接口的主要實現類,線程不安全,效率高;底層使用Object[] elementData存儲
LinkedList:對於頻繁的插入、刪除操作,使用此類效率比ArrayList高;底層使用雙向鏈錶存儲
Vector:作為List接口的古老實現類,線程安全,效率低;底層使用Object[]存儲
4.2 List接口方法
除了從Collection集合繼承的方法外,還新增了以下的方法:
void add(int index,Object ele):在index位置插入ele元素
boolean addAll(int index, Collection eles):從index位置開始將eles中的所有元素添加進來
Object get(int index):獲取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次出現的位置
int lastIndexOf(Object obj):返回obj在當前集合中末次出現的位置
Object remove(inr index):移除指定index位置的元素,並返回此元素
Object set(int index, Object ele):設置指定index位置的元素為ele
List subList(int fromIndex, int toIndex):返回fromIndex到toIndex位置的子集合
4.3 List的實現類
4.3.1 ArrayList
概述:作為List接口的主要實現類,線程不安全,效率高;底層使用Object[] elementData存儲
jdk7源碼分析:
ArrayList list = new ArrayList();//底層創建了長度為10的Object[]數組elementData
list.add(123);//elementData[0] = new Integer(123);
…
list.add(11);//如果此次的添加導致底層elementData數組容量不夠,則擴容。默認情況下,擴容為原來的容量的1.5倍,同時需要將原有的數組中的數據複製到新的數組中
結論:建議使用帶參的構造器:ArrayList list = new ArrayList(int capacity)
jdk8源碼分析:
ArrayList list = new ArrayList();//底層Object[] elementData初始化為{}。並沒有創建長度為10的數組
list.add(123);//第一次調用add()時,底層才創建長度10的數組,並將數據123添加到elementData* …
後續跟jdk7一致
ArrayList帶參構造器:initialCapacity傳入列表的初始容量,當初始容量為0時,this.element = EMPTY_ELEMENTDATA; 其中jdk8中定義EMPTY_ELEMENTDATA為Ob