Java-Collection源码分析(一)——Collection接口和AbstractCollection类
2017-09-25 10:26
411 查看
一、Collection整体架构
二、Collection源码分析
Collection提供了高度抽象的处理集合的基本方法:int size(); boolean isEmpty(); boolean contains(Object 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 retainAll(Collection<?> c); void clear(); boolean equals(Object o); int hashCode();以下为JDK1.8 新增内容:
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; }该方法使用了Predicate接口,可以使用lambda表达式,主要是用于移除集合中满足给定条件的所有元素,错误或者运行时异常发生在迭代时或者把条件传递给调用者的时候。
default Spliterator<E> spliterator() { return Spliterators.spliterator(this, 0); } default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); } default Stream<E> parallelStream() { return StreamSupport.stream(spliterator(), true); } }用于并行遍历数据源
三、AbstractCollection类
它实现了Collection中除了iterator()和 size()之外的所有方法。要实现可修改的集合,程序员必须另外覆盖此类的add方法(否则将抛出UnsupportedOperationException),迭代器方法返回的迭代器必须另外实现其remove方法。public abstract class AbstractCollection<E> implements Collection<E> protected AbstractCollection() { } public abstract Iterator<E> iterator(); public abstract int size(); //判断是否为空 public boolean isEmpty() { return size() == 0; } //判断是否包含对象o,包含为true,不包含返回false 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; } //返回一个包含此集合中所有元素的数组。 public Object[] toArray() { Object[] r = new Object[size()]; Iterator<E> it = iterator(); for (int i = 0; i < r.length; i++) { if (! it.hasNext()) // fewer elements than expected return Arrays.copyOf(r, i); r[i] = it.next(); } return it.hasNext() ? finishToArray(r, it) : r; } //返回一个包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。 public <T> T[] toArray(T[] a) { int size = size(); T[] r = a.length >= size ? a : (T[])java.lang.reflect.Array .newInstance(a.getClass().getComponentType(), size); Iterator<E> it = iterator(); for (int i = 0; i < r.length; i++) { if (! it.hasNext()) { // fewer elements than expected if (a == r) { r[i] = null; // null-terminate } else if (a.length < i) { return Arrays.copyOf(r, i); } else { System.arraycopy(r, 0, a, 0, i); if (a.length > i) { a[i] = null; } } return a; } r[i] = (T)it.next(); } return it.hasNext() ? finishToArray(r, it) : r; } private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; private static <T> T[] finishToArray(T[] r, Iterator<?> it) { int i = r.length; while (it.hasNext()) { int cap = r.length; if (i == cap) { int newCap = cap + (cap >> 1) + 1; // overflow-conscious code if (newCap - MAX_ARRAY_SIZE > 0) newCap = hugeCapacity(cap + 1); r = Arrays.copyOf(r, newCap); } r[i++] = (T)it.next(); } // trim if overallocated return (i == r.length) ? r : Arrays.copyOf(r, i); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError ("Required array size too large"); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } //没有实现add方法 public boolean add(E e) { throw new UnsupportedOperationException(); } //删除某个元素 public boolean remove(Object o) { Iterator<E> it = iterator(); if (o==null) { while (it.hasNext()) { if (it.next()==null) { it.remove(); return true; } } } else { while (it.hasNext()) { if (o.equals(it.next())) { it.remove(); return true; } } } return false; } //判断是否包含集合c中所有元素 public boolean containsAll(Collection<?> c) { for (Object e : c) if (!contains(e)) return false; return true; } //添加集合c中的所有元素 public boolean addAll(Collection<? extends E> c) { boolean modified = false; for (E e : c) if (add(e)) modified = true; return modified; } //删除集合c中的所有元素 public boolean removeAll(Collection<?> c) { Objects.requireNonNull(c); boolean modified = false; Iterator<?> it = iterator(); while (it.hasNext()) { if (c.contains(it.next())) { it.remove(); modified = true; } } return modified; } //仅保留此集合中包含在指定集合c中的元素(可选操作)。 public boolean retainAll(Collection<?> c) { Objects.requireNonNull(c); boolean modified = false; Iterator<E> it = iterator(); while (it.hasNext()) { if (!c.contains(it.next())) { it.remove(); modified = true; } } return modified; } //将当前集合清空 public void clear() { Iterator<E> it = iterator(); while (it.hasNext()) { it.next(); it.remove(); } } //将集合元素显示成[String] 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-Collection源码分析(十二)——SortedMap和NavigableMap
- Java-Collection源码分析(十)——hashTable
- Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现
- Java-Collection源码分析(九)——WeakHashMap
- 源码分析-java-collection接口
- Java-Collection源码分析(十一)—— IdentityHashMap
- Java-Collection源码分析(六)——Map接口
- Java-Collection源码分析(三)——List和AbstractList
- Java 集合框架02---Collection的源码分析
- Java-Collection源码分析(四)——ArrayList
- JAVA Collection 源码分析(二)之SubList
- JAVA源码分析Collection之Map
- java源码分析之集合架构 Collection 02
- Java中集合类源码分析(2)-----Collection和AbstractCollection源码分析
- Java-Collection源码分析(七)——HashMap
- Java-Collection源码分析(十二)——Set、AbstractSet、HashSet和LinkedHashSet
- Java-Collection源码分析(五)——AbstractSequentiaList和LinkedList
- JAVA源码分析Collection之ArrayList
- Java-Collection源码分析(二)——Iterator和ListIterator
- Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现