您好,登錄后才能下訂單哦!
小編給大家分享一下Java源碼解析之接口Collection的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
我們先想一想,公司如果要我們自己去封裝一些操作數組或者鏈表的工具類,我么需要封裝哪些功能呢?不妨就是統計其 大小,增刪改查、清空或者是查看否含有某條數據等等。而collection接口就是把這些通常操作提取出來,使其更全面、更通用,那現在我們就來看看其源碼都有哪些方法。
//返回集合的長度,如果長度大于Integer.MAX_VALUE,返回Integer.MAX_VALUE int size(); //如果集合元素總數為0,返回true boolean isEmpty(); //判斷集合中是否包含指定的元素,其依據是equals()方法 boolean contains(Object o); //返回一個包含集合中所有元素的數組 Object[] toArray(); //與上個類似,只是增加了類型的轉換 <T> T[] toArray(T[] a); //向集合中加入一個元素,如果成功加入則返回true,如果加入失敗,或者因集合本身已經包含同個元素而不再加入時,返回false boolean add(E e); //從集合中刪除指定元素的單個實例 boolean remove(Object o); //如果集合包含指定集合中的所有元素,返回true boolean containsAll(Collection<?> c); //把指定集合中的所有元素添加到集合中,但在此期間,如果指定的集合發生了改變,可能出現意想不到的事情 boolean addAll(Collection<? extends E> c); //從集合中刪除所有包含在指定集合中的元素 boolean removeAll(Collection<?> c); //僅保留集合中包含在指定集合中的元素 boolean retainAll(Collection<?> c); //清空集合 void clear(); //將此方法抽象,是保證所有子類都覆寫此方法,以保證equals的正確行為 boolean equals(Object o); //同上 int hashCode(); //這個方法在JDK1.8中提供了默認的實現,會使用Iterator的形式刪除符合條件的元素 default boolean removeIf(Predicate<? super E> filter){ Objects.requireNonNull(filter); boolean removed = false; final Iterator<E> each = iterator(); while (each.hasNext()) { if (filter.test(each.next())) { each.remove(); removed = true; } } return removed; }
通過以上的學習,我們可以知道在collection接口中,有很多通用的方法,根據現有的定義以及繼承的Iterable接口,都可以在抽象方法中實現,這樣就可以減少具體實現類需要實現的方法,所以就有了這么一個類–AbstractCollection。
首先我們來看看api文檔對這個類的大概描述:
如果要實現一個不可修改的集合,只需要重寫Iterator和size接口就可以了,并且返回的Iterator需要實現hasNext和Next。而要實現一個可以修改的集合,還必須重寫add方法,返回的Iterator還要實現remove接口。
接下里我們來看看其方法定義
//這個毫無疑問,是可以直接獲取的 public boolean isEmpty() { return size() == 0; } //這個方法因為Iterator的存在,可以進行一致性封裝,這里需要注意的是對象的比較是通過equals方法,因為調用到了it.next()與it.hasNext(),這也是為什么文檔注釋會寫實現集合類需要重寫Iterator的這兩個方法。 public boolean contains(Object o) { Iterator<E> it = iterator(); if (o==null) { while (it.hasNext()) if (it.next()==null) return true; } else { while (it.hasNext()) if (o.equals(it.next())) return true; } return false; } //和contains類似,也是通過Iterator實現的,但其會調用it.remove()方法,這也是為什么文檔注釋會寫實現可以修改的集合類時需要重寫Iterator的remove方法。 public boolean remove(Object o) { //...省略,這里調用了it.remove()方法 }
還有很多方法也用到了iterator的特性,例如containAll、addAll等等,這里就不一 一說明了。
除此之外,還有一個toArray方法,方法實現還有一些略微不同:
//這個實現相對復雜一些,可以看到擴容最主要的手段是Arrays.copyOf()方法, //也就是需要將原數組通過復制到新的數組中來實現的。 //注意這里返回的順序和Iterator順序一致 //在這里實現是為了方便不同具體實現類互相轉換,我們在后續會多次見到此方法 public Object[] toArray() { //先根據當前集合大小聲明一個數組 Object[] r = new Object[size()]; Iterator<E> it = iterator(); for (int i = 0; i < r.length; i++) { //集合元素沒那么多,說明不需要那么大的數組 if (! it.hasNext()) return Arrays.copyOf(r, i); //僅返回賦完值的部分 r[i] = it.next(); } //元素比從size()中獲取的更多,就需要進一步調整數組大小 return it.hasNext() ? finishToArray(r, it) : r; } private static <T> T[] finishToArray(T[] r, Iterator<?> it) { //記錄當前大小 int i = r.length; while (it.hasNext()) { int cap = r.length; //r的長度不夠,繼續分配 if (i == cap) { //擴充方式為cap+cap/2+1,也就是1.5倍擴容 int newCap = cap + (cap >> 1) + 1; // 超過了最大容量,MAX_ARRAY_SIZE=Integer.MAX_VALUE-8 if (newCap - MAX_ARRAY_SIZE > 0) //重新設置cap的值 newCap = hugeCapacity(cap + 1); //對r進行擴容 r = Arrays.copyOf(r, newCap); } //賦值,進入下一輪循環 r[i++] = (T)it.next(); } // 由于之前擴容是1.5倍進行的,最后再將其設置到和r實際需要的相同 return (i == r.length) ? r : Arrays.copyOf(r, i); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // 超過了最大正整數,也就是負數 throw new OutOfMemoryError ("Required array size too large"); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } //和toArray()方法類似,就不再贅述,具體可以查看源碼 public <T> T[] toArray(T[] a) { //... }
除了這些,我們再來看看AbstractCollection是怎么實現toString方法的吧+
其是通過StringBuilder拼接了每個元素的toString完成的,不是很復雜。
我們來看看源碼吧
public String toString() { Iterator<E> it = iterator(); if (! it.hasNext()) return "[]"; StringBuilder sb = new StringBuilder(); sb.append('['); for (;;) { E e = it.next(); sb.append(e == this ? "(this Collection)" : e); if (! it.hasNext()) return sb.append(']').toString(); sb.append(',').append(' '); } }
Java的基本數據類型分為:1、整數類型,用來表示整數的數據類型。2、浮點類型,用來表示小數的數據類型。3、字符類型,字符類型的關鍵字是“char”。4、布爾類型,是表示邏輯值的基本數據類型。
以上是“Java源碼解析之接口Collection的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。