package java.util;
//Collection接口的抽象实现类
public abstract class AbstractCollection<e> implements Collection<e> {</e></e>
protected AbstractCollection(){
}
// Query Operations
public abstract Iterator<E> iterator();
public abstract int size();
public boolean isEmpty(){
return size() == 0;
}
//利用一个迭代器遍历,判断是否包含对象o***********************************//
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(){
// Estimate size of array; be prepared to see more or fewer elements
Object[] r = new Object[size()];
Iterator<E> it = iterator();
for(int i = 0; i < r.length; i++){
if(!it.hasNext()) // 迭代器数量少于size()
return Arrays.copyOf(r, i);
r[i] = it.next();
}
return it.hasNext() ? finishToArray(r, it) : r;
}
// 转化为指定类型的数组
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a){
// Estimate size of array; be prepared to see more or fewer elements
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();
}
// more elements than expected
return it.hasNext() ? finishToArray(r, it) : r;
}
//分配数组的最大容量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
// 数组扩容,当数组索引指向最后一个元素+1时,
// 对数组进行扩容:即创建一个大小为(cap + cap/2 +1)的数组,然后将原数组的内容复制到新数组中
@SuppressWarnings("unchecked")
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;
}
// Modification Operations
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;
}
// Bulk Operations
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;
}
//** 求差集,迭代器遍历集合this,用contains判断是否存在于c,所以复杂度为o(n^2)
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;
}
//** 求交集,迭代器遍历集合this,contain判断是存在于c,不存在,则从移除该元素,存在则保留,复杂度o(n^2)
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;
}
// 利用迭代器移除this中的所有元素
public void clear(){
Iterator<E> it = iterator();
while (it.hasNext()) {
it.next();
it.remove();
}
}
// String conversion
//将容器转换为string类型,[元素1,元素2,------]
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(' ');
}
}}

京公网安备 11010502036488号