0
点赞
收藏
分享

微信扫一扫

Java源码解析 AbstractCollection<E>


位置:  java.util.AbstractCollection<E>

类型:abstract class


用途:


    此类提供了Collection接口最基础的实现,最大限度地减少了实现此接口所需的工作。


    如果实现一个不可修改的collection,程序员只需继承此class并且实现iterator 和size 方法即可。(iterator方法返回的迭代器必须实现hasNext 和next方法)


UnsupportedOperationException ),而且通过iterator方法返回的迭代器必须另外实现它的remove 方法。




    文档详细的描述了此类中每一个非抽象方法的具体实现。集合实现中,如果有更有效率的实现,那么这些实现的方法都是可以被重写的


    此类是Java Collection Framework中的一员



参数:


父类:Object


子类:AbstractList,AbstractQueue,AbstractSet,ArrayDeque,ConcurrentLinkedDeque


接口:Iterable<E>,Collection<E>


public abstract classAbstractCollection<E> implements Collection<E> {  
 
 
    
  /**
 
 
     * 唯一构造函数(供子类构造调用)
 
 
     */
 
 
protected
 
     } 
    
 /**
 
     * 返回一个迭代器包含此集合中的元素
 
     */
 
public abstract
 
 

 
/**
 
     * 返回长度
 
     */
 
public abstract int 
    
  /**
 
 
     * 返回true 当size()==0
 
 
     */
 
 
public boolean
 
 
return
 
     }  
 
 
 
   
  /**
  
 
 
     * 这个实现是遍历了此集合中的所有的元素,check 每个元素与制定元素的相等性
 
 
     */
 
 
public boolean
 
 
        Iterator<E> it = iterator();
 
 
if (o==null) {
 
 
while
 
 
if (it.next()==null)
 
 
return true;
 
 
else
 
 
while
 
 
if
 
 
return true;
 
 
        }
 
 
return false;
 
     }
   
    
 /**
 
{@inheritDoc}
 
     *
 
  
 
     *这个实现返回一个包含所有元素的数组由此Collection的迭代器返回,相同的顺序,连续存储在数组中,起始于0.
 
     *返回数组的长度和迭代器返回的元素的数量相等,即使此Collection的长度在迭代过程中发生变化,因为可能会发生,如果
     
        
 collection允许迭代期间并发发生。
 
     *size()方法的调用只是一个优化的提示;即使迭代器返回不同数量的元素也会返回正确的结果
 
<p>这个方法等效于:
 
     *
 
<pre>
 
<E> list = new ArrayList<E>(size());
 
     * for (E e : this)
 
     *     list.add(e);
 
     * return list.toArray();
 
</pre>
 
     */
 
public
 
// Estimate size of array; be prepared to see more or fewer elements
 
new
 
        Iterator<E> it = iterator();
 
for (int i = 0; i < r.length; i++) {
 
if (! it.hasNext()) // fewer elements than expected
 
return Arrays.copyOf(r, i);//如果迭代器中的元素比size声明的数组小,就设置数组的长度为当前长度
 
            r[i] = it.next();
 
        }
 
return it.hasNext() ? finishToArray(r, it) : r;
 
    }
 
 

 
/**
 
{@inheritDoc}
 
     *
 
     *这个实现返回一个包含所有元素的数组由此Collection的迭代器返回,相同的顺序,连续存储在数组中,起始于0.
 
     *如果迭代器中的元素数量大于指定数组长度,会新分配一个数组来存储这些元素,即使此Collection的长度在迭代过程中发生变化,因为可能会发生,如果collection允许迭代期间并发发生。
 
     *size()方法的调用只是一个优化的提示;即使迭代器返回不同数量的元素也会返回正确的结果
 
     *
 
     *
 
     *
 
     *
 
<p>这个方法等效于:
 
     *
 
<pre>
 
<E> list = new ArrayList<E>(size());
 
     * for (E e : this)
 
     *     list.add(e);
 
     * return list.toArray(a);
 
</pre>
 
     *
 
@throws ArrayStoreException  {@inheritDoc}
 
@throws NullPointerException {@inheritDoc}
 
     */
 
public
 
// Estimate size of array; be prepared to see more or fewer elements
 
int
 
length
 
(T[])java.lang.reflect.Array
 
newInstance(a.getClass().getComponentType(), size);//判断此集合的size 和指定的a数组长度,如果a不适合就重新实例化一个数组
 
        Iterator<E> it = iterator();
 
 

 
for (int i = 0; i < r.length; i++) {
 
if (! it.hasNext()) { // fewer elements than expected
 
if
 
null; // null-terminate
 
else if (a.length
 
return Arrays.copyOf(r, i);
 
else
 
arraycopy(r, 0, a, 0, i);
 
if (a.length
 
null;
 
                    }
 
                }
 
return
 
            }
 
(T)it.next();
 
        }
 
// more elements than expected 有更多元素比size更多
 
return it.hasNext() ? finishToArray(r, it) : r;
 
    }
 
 

 
/**
 
     
 
     * 数组可以分配的最大值。
 
     * 一些虚拟机在数组中保留一些头文字
 
     * 企图声明更大的数组会返回OutofMemoryError:请求的数组长度超过了VM的限制
 
     */
 
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE
 
 

 
/**
 
     *toArray 方法迭代器返回的元素个数超过了size(),此方法用来重新分配数组来完成这些元素的添加
 
     *
 
@param
 
@param
 
@return
 
     */
 
private static
 
int i = r.length;
 
while
 
int cap = r.length;
 
if
 
int
 
// overflow-conscious code
 
if (newCap - MAX_ARRAY_SIZE
 
hugeCapacity(cap + 1);//判断分配的数组空间是否超越临界值
 
copyOf(r, newCap);
 
            }
 
(T)it.next();
 
        }
 
// trim if overallocated
 
return (i == r.length) ? r : Arrays.copyOf(r, i);//当前数组长度和元素个数是否相同,不同的话,就调整下数组
 
    }
 
 

 
private static int hugeCapacity(int
 
if (minCapacity < 0) // overflow
 
throw new
 
"Required array size too large");
 
return (minCapacity > MAX_ARRAY_SIZE) ?
 
MAX_VALUE
 
MAX_ARRAY_SIZE;
 
    }
 
 

 
// Modification Operations
 
 

 
/**
 
{@inheritDoc}
 
     *
 
<p>这个实现没有具体实现只是会抛不支持操作的异常
 
<tt>UnsupportedOperationException</tt>.
 
     *
 
@throws UnsupportedOperationException {@inheritDoc}
 
@throws ClassCastException            {@inheritDoc}
 
@throws NullPointerException          {@inheritDoc}
 
@throws IllegalArgumentException      {@inheritDoc}
 
@throws IllegalStateException         {@inheritDoc}
 
     */
 
public boolean
 
throw new
 
    }
 
 

 
/**
 
{@inheritDoc}
 
     *
 
     *这个实现迭代此collection找寻指定元素,如果找到了这个元素,就从此collection中移除这个元素,使用迭代器的remove方法,并返回true
 
     *
 
     *
 
     *此实现会抛出不支持的操作异常,如果此集合中的迭代器没有实现remove方法,但是此collection中包含指定的对象
 
     *
 
@throws UnsupportedOperationException {@inheritDoc}
 
@throws ClassCastException            {@inheritDoc}
 
@throws NullPointerException          {@inheritDoc}
 
     */
 
public boolean
 
        Iterator<E> it = iterator();
 
if (o==null) {//o==null 并且迭代器中可以有null 那么 return true
 
while
 
if (it.next()==null) {
 
                    it.remove();
 
return true;
 
                }
 
            }
 
else
 
while
 
if (o.equals(it.next())) { //equals()
 
                    it.remove();
 
return true;
 
                }
 
            }
 
        }
 
return false;
 
    }
 
 

 
 

 
// 批量操作
 
 

 
/**
 
{@inheritDoc}
 
     *
 
     *此实现迭代所有指定collection,检查所有的元素释放包含在此collection中,如果所有的元素都包含在内就返回true,否则返回false
 
     *
 
@throws ClassCastException            {@inheritDoc}
 
@throws NullPointerException          {@inheritDoc}
 
@see
 
     */
 
public boolean
 
for
 
if
 
return false;
 
return true;
 
    }
 
 

 
/**
 
{@inheritDoc}
 
     *
 
     *此实现迭代所有指定的collection,循环迭代器中的每一个object并添加
 
     *
 
     *需要注意的是此实现会排出不支持操作异常,除非add被重写(假设指定的collection是非空)
 
     *
 
@throws UnsupportedOperationException {@inheritDoc}
 
@throws ClassCastException            {@inheritDoc}
 
@throws NullPointerException          {@inheritDoc}
 
@throws IllegalArgumentException      {@inheritDoc}
 
@throws IllegalStateException         {@inheritDoc}
 
     *
 
@see
 
     */
 
public boolean addAll(Collection<? extends
 
boolean modified = false;
 
for
 
if
 
true;
 
return
 
    }
 
 

 
/**
 
{@inheritDoc}
 
     * 此实现迭代此collection,迭代器中返回的每一个元素都轮流检查是否包含在指定的collection中,如果包含其中,那就调用此collection中迭代器的remove方法移除掉
 
     * 
 
     * 需要注意的是,此实现会抛不支持操作的异常。如果此集合返回的迭代器没有实现remove方法而此collection中包含一个或多个元素在指定的collection中
 
     *
 
@throws UnsupportedOperationException {@inheritDoc}
 
@throws ClassCastException            {@inheritDoc}
 
@throws NullPointerException          {@inheritDoc}
 
     *
 
@see
 
@see
 
     */
 
public boolean
 
boolean modified = false;
 
        Iterator<?> it = iterator();
 
while
 
if
 
                it.remove();
 
true;
 
            }
 
        }
 
return
 
    }
 
 

 
/**
 
{@inheritDoc}
 
     *
 
     * 此实现迭代此collection,迭代器中返回的每一个元素都轮流检查是否包含在指定的collection中,如果不包含其中,就调用此collection的迭代器的remove方法移除掉
 
     *
 
     * 需要注意的是,此实现会抛不支持操作的异常。如果此collection返回的迭代器没有实现remove方法而此collection中一个或多个元素不在在指定的collection中
 
     *
 
@throws UnsupportedOperationException {@inheritDoc}
 
@throws ClassCastException            {@inheritDoc}
 
@throws NullPointerException          {@inheritDoc}
 
     *
 
@see
 
@see
 
     */
 
public boolean
 
boolean modified = false;
 
        Iterator<E> it = iterator();
 
while
 
if
 
                it.remove();
 
true;
 
            }
 
        }
 
return
 
    }
 
 

 
/**
 
{@inheritDoc}
 
     *
 
     * 此实现迭代此collection,移除每一个元素使用迭代器的remove操作。大多数实现会选择重写这个方式为了效率
 
     * 
 
     * 需要注意的是此实现会抛出不支持操作的异常,如果此collection的返回的迭代器没有实现remove方法,但是此collection非空
 
     * 
 
@throws UnsupportedOperationException {@inheritDoc}
 
     */
 
public void
 
        Iterator<E> it = iterator();
 
while
 
            it.next();
 
            it.remove();
 
        }
 
    }
 
 

 
 

 
//  字符串转换
 
 

 
/**
 
     * 此collection用字符串形态展示。字符串展现由此collection返回的迭代器中的按照顺序的list,方括号括起来,“[]”.相邻的元素使用“, ”分割(一个逗号和一个空格),元素按照String。valueOf(Object)转换成字符串
 
@return
 
     */
 
public
 
        Iterator<E> it = iterator();
 
if
 
return "[]";
 
 

 
new StringBuilder();//使用的是StringBuilder
 
'[');
 
for
 
            E e = it.next();
 
this ? "(this Collection)"
 
if
 
return sb.append(']').toString();
 
',').append(' ');
 
        }
 
    } 
}

举报

相关推荐

0 条评论