Collection:集合介紹

Collection是所有集合的超類,它有好多子類,有必要回顧一下Collection裏面的內容。學完超類,學子類,就比較快了。

Collection裏面常見的子類有:List、Set。List又包含了ArrayList、LinkedList、Vector……Set包含了HashSet、TreeSet、LinkedHashSet……

結構體系圖:


Controller裏面的方法:

int size();返回集合的大小

boolean isEmpty(); 返回是否爲空

boolean contains(Object o); 是否包含o

Iterator<E> iterator(); 返回一個迭代器

Object[] toArray(); 集合轉數組

<T> T[] toArray(T[] a); 集合轉數組,轉換爲特點類型的數組

boolean add(E e); 往集合中添加元素

boolean remove(Object o); 把元素從集合中移除

boolean containsAll(Collection<?> c); 是否包含一個集合(多個元素)

boolean addAll(Collection<? extends E> c); 添加一個集合(多個元素)

boolean removeAll(Collection<?> c); 移除集合中的一個集合(多個元素)

boolean equals(Object o); 比較

void clear(); 清空集合

boolean retainAll(Collection<?> c); 兩個集合作交際,返回true或者false。

上面基本是它的所有方法,其中有一些比較簡單,看方法名,就知道怎麼使用,主要複習一下一部分細節知識。

問題一:contains(Object o) 是返回是否包含一個元素o,boolean containsAll(Collection<?> c);是是否包含一個集合,那麼這個集合中是所有數據都包含才包含還是隻包含一個就算包含呢?寫一個代碼測試一下:

public class CollectionTest {
	public static void main(String[] args) {
		Collection<String> c = new ArrayList<String>();
		c.add("a");
		c.add("b");
		c.add("c");
		c.add("d");
		
		Collection<String> c1 = new ArrayList<String>();
		c1.add("a");
		c1.add("b");
		c1.add("e");
		
		System.out.println(c.containsAll(c1));
	}
}
輸出
結果是false。如果將c1.add("e")註釋掉,輸出結果是true。所以得到的結論是,當前c集合如果包含了所有c1中的元素,則返回true,否則返回false。順便看看源碼:

    public boolean containsAll(Collection<?> c) {
        for (Object e : c)
            if (!contains(e))
                return false;
        return true;
    }
是將集合c遍歷一遍,然後依次去判斷是否存在,只要有一個不存在,立即停止循環,返回false。

add(Object o)方法,就是普普通通的添加,但是,這兒有一個細節問題,就是前幾天去搜狐面試時問我的一個問題,因爲沒注意源碼,對這個問題不太留意,所以現在回顧的時候,特意把這個問題解決了。

問題是:ArrayList默認長度是多少?如果要加10條數據,100條數據,1000條數據,它是如何去加的呢?

這個問題,答案是默認長度是10條,如果超出範圍,會自動增加10條,具體實現先不說了,在ArrayList中把源碼分享一下然後再分析說明一下。

boolean retainAll(Collection<?> c); 兩個集合的交集,返回true或者false,但是問題是,交集的數據去哪裏了呢??

先看看源碼:

    public boolean retainAll(Collection<?> c) {
        Objects.requireNonNull(c);<span style="white-space:pre">	</span>//返回對象c
        boolean modified = false;<span style="white-space:pre">	</span>//定義modified初始值爲false<span style="white-space:pre">	
</span>        Iterator<E> it = iterator();<span style="white-space:pre">	</span>
        while (it.hasNext()) {
            if (!c.contains(it.next())) {<span style="white-space:pre">	</span>//如果c中不包含當前集合元素
                it.remove();<span style="white-space:pre">			</span>//將這個元素從當前集合中移除
                modified = true;
            }
        }
        return modified;<span style="white-space:pre">			</span>//返回結果
    }
從上面的代碼中分析,只要當前集合與另一個集合有交集,就返回true,否則返回false。而交集後的元素,保存在當前集合。it.remove()就是移除另一個集合中沒有的元素,所以最後剩餘的,只有兩個集合中都有的元素。下面用一個例子去驗證一下。

public class CollectionTest {
	public static void main(String[] args) {
		Collection<String> c = new ArrayList<String>();
		c.add("a");
		c.add("b");
		c.add("c");
		c.add("d");
		
		Collection<String> c1 = new ArrayList<String>();
		c1.add("a");
		c1.add("b");
		c1.add("e");
		c1.add("f");
		
		System.out.println(c.retainAll(c1));
		
		System.out.println("--------------");
		
		Iterator<String> iterator = c.iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
		
	}
}
輸出結果:

true
--------------
a
b
沒有問題。上面的例子用到了迭代器Iterator,迭代器,就是用來遍歷集合的,hasNext()返回的是是否存在下一個元素,如果存在就返回true,next()是得到下一個元素。這兒有個問題就是,迭代器只能遍歷集合,不對集合進行操作。如果要在迭代器中添加元素,將會提示一個併發操作異常:ConcurrentModificationException。這個異常主要原因是,迭代器正在遍歷當前集合,而當前集合又改變了數據,迭代器不知道,所以就會出現併發操作這個異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章