集合框架源码分析——抽象类
生活随笔
收集整理的這篇文章主要介紹了
集合框架源码分析——抽象类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
public abstract class AbstractCollection<E> implements Collection<E> {
? ? /**
? ? ?* 唯一構造方法
? ? ?*/
? ? protected AbstractCollection() {
? ? }
? ? // Query Operations
? ? /**
? ? ?*
? ? ?* 返回集合中元素的迭代器
? ? ?*/
? ? public abstract Iterator<E> iterator();
? ? public abstract int size();
? ? public boolean isEmpty() {
return size() == 0; ? //size=0則此方法返回true
? ? }
? ? public boolean contains(Object o) {
Iterator<E> e = iterator(); ? //獲取此集合的迭代器
if (o==null) { ? ? ? ? ? ? ??
? ?while (e.hasNext()) ? ? ?
if (e.next()==null) ? //如果此集合允許null元素,找到則返回true
? ?return true;
} else {
? ?while (e.hasNext())
if (o.equals(e.next()))
? ?return true;
}
return false;
? ? }
? ? /**
? ? ?* 此方法是同步的,即使在遍歷集合的過程中發現集合已經改變,任然可以返回
? ? ?* 正確的結果
? ? ?*
? ? ?* 此方法等同于:
? ? ?*
? ? ?* List<E> list = new ArrayList<E>(size());
? ? ?* for (E e : this)
? ? ?* ? ? list.add(e);
? ? ?* return list.toArray();
? ? ?*/
? ? 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); ?//則僅返回長度為i的數組,i=當前集合長度
? ?r[i] = it.next();
}
? ? ? ? //如果遍歷完后發現集合還有更多的元素,即在遍歷時有元素被添加進集合,調用
? ? ? ? //finishToArray方法添加剩余的元素
return it.hasNext() ? finishToArray(r, it) : r;
? ? }
? ?
? ? public <T> T[] toArray(T[] a) {
? ? ? ? int size = size(); ? ? ?//當前集合長度
? ? ? ? T[] r = a.length >= size ? a : ?//如果a的長度大于等于size,把a賦給r,否則新建一個元素類型為a元素類型,size長度的數組
? ? ? ? ? ? ? ? ? (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()) { 遍歷過程中,集合中有元素被移除,長度減少.或遍歷集合結束
if (a != r) ? //表明是新建的數組
? ?return Arrays.copyOf(r, i);
r[i] = null; // 表明是a,則多加一個null結束符
return r;
? ?}
? ?r[i] = (T)it.next();
}
return it.hasNext() ? finishToArray(r, it) : r;
? ? }
? ? /**
? ? ?* 當it還有更多的元素,重新分配數組。并把剩余元素添加進數組
? ? ?*/
? ? private static <T> T[] finishToArray(T[] r, Iterator<?> it) {
int i = r.length; ? ? ? ? //原來數組長度存入i中
while (it.hasNext()) {
int cap = r.length; ??
if (i == cap) { ? //表明未重新分配數組長度
int newCap = ((cap / 2) + 1) * 3; ? //新數組長度的計算公式,大約擴充1.5倍
if (newCap <= cap) { // 如果分配后發生了整型溢出
if (cap == Integer.MAX_VALUE)
throw new OutOfMemoryError("Required array size too large");
newCap = Integer.MAX_VALUE; ? ?
}
r = Arrays.copyOf(r, newCap); //新建一個長度為newCap的數組,并把r中數據存入
}
r[i++] = (T) it.next(); ? //添加集合剩余元素到新數組
}
// 修剪多余的長度
return (i == r.length) ? r : Arrays.copyOf(r, i);
}
? ? // Modification Operations
? ? /**
? ? ?* 調用此方法總是拋出一個異常,需要子類去重寫此方法
? ? ?*/
? ? public boolean add(E e) {
throw new UnsupportedOperationException();
? ? }
? ? /**
? ? ?* 此方法會首先在集合中查找指定元素o,如果找到就移除它
? ? ?* 移除的是第一個找到的匹配的值
? ? ?*/
? ? public boolean remove(Object o) {
Iterator<E> e = iterator();
if (o==null) { ? ? ? //集合支持null元素
? ?while (e.hasNext()) {
if (e.next()==null) {
? ?e.remove(); ? ??
? ?return true;
}
? ?}
} else {
? ?while (e.hasNext()) {
if (o.equals(e.next())) {
? ?e.remove();
? ?return true;
}
? ?}
}
return false;
? ? }
? ? // Bulk Operations
? ?
? ? public boolean containsAll(Collection<?> c) {
Iterator<?> e = c.iterator();
while (e.hasNext())
? ?if (!contains(e.next())) ?//如果c中有一個元素不在本集合中則返回false
return false;
return true;
? ? }
? ? /**
? ? ?* 此方法將拋出一個UnsupportedOperationException,除非子類重寫了add方法
? ? ?*/
? ? public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
Iterator<? extends E> e = c.iterator();
while (e.hasNext()) {
if (add(e.next())) ? //如果有一個元素添加失敗就返回false
modified = true;
}
return modified;
? ? }
? ? public boolean removeAll(Collection<?> c) {
boolean modified = false;
Iterator<?> e = iterator();
while (e.hasNext()) {
if (c.contains(e.next())) { //如果c中元素也保含在本集合中則移除它
e.remove();
modified = true;
}
}
return modified;
}
? ?public boolean retainAll(Collection<?> c) {
boolean modified = false;
Iterator<E> e = iterator();
while (e.hasNext()) {
if (!c.contains(e.next())) { ?//遍歷集合元素,如果元素不包含在c中,則移除此元素
e.remove(); ? ? ? ? ? ? ? //取的是交集
modified = true;
}
}
return modified;
}
? ? public void clear() {
Iterator<E> e = iterator();
while (e.hasNext()) { ? ?//依次調用next和remove方法
? ?e.next();
? ?e.remove();
}
? ? }
? ? // ?String conversion
? ?/**
* 重寫toString方法,返回格式:[e.toString, e2.toString, ...]
* */
public String toString() {
Iterator<E> i = iterator();
if (!i.hasNext()) ? //如果集合為空返回[]
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (!i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
}
? ? /**
? ? ?* 唯一構造方法
? ? ?*/
? ? protected AbstractCollection() {
? ? }
? ? // Query Operations
? ? /**
? ? ?*
? ? ?* 返回集合中元素的迭代器
? ? ?*/
? ? public abstract Iterator<E> iterator();
? ? public abstract int size();
? ? public boolean isEmpty() {
return size() == 0; ? //size=0則此方法返回true
? ? }
? ? public boolean contains(Object o) {
Iterator<E> e = iterator(); ? //獲取此集合的迭代器
if (o==null) { ? ? ? ? ? ? ??
? ?while (e.hasNext()) ? ? ?
if (e.next()==null) ? //如果此集合允許null元素,找到則返回true
? ?return true;
} else {
? ?while (e.hasNext())
if (o.equals(e.next()))
? ?return true;
}
return false;
? ? }
? ? /**
? ? ?* 此方法是同步的,即使在遍歷集合的過程中發現集合已經改變,任然可以返回
? ? ?* 正確的結果
? ? ?*
? ? ?* 此方法等同于:
? ? ?*
? ? ?* List<E> list = new ArrayList<E>(size());
? ? ?* for (E e : this)
? ? ?* ? ? list.add(e);
? ? ?* return list.toArray();
? ? ?*/
? ? 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); ?//則僅返回長度為i的數組,i=當前集合長度
? ?r[i] = it.next();
}
? ? ? ? //如果遍歷完后發現集合還有更多的元素,即在遍歷時有元素被添加進集合,調用
? ? ? ? //finishToArray方法添加剩余的元素
return it.hasNext() ? finishToArray(r, it) : r;
? ? }
? ?
? ? public <T> T[] toArray(T[] a) {
? ? ? ? int size = size(); ? ? ?//當前集合長度
? ? ? ? T[] r = a.length >= size ? a : ?//如果a的長度大于等于size,把a賦給r,否則新建一個元素類型為a元素類型,size長度的數組
? ? ? ? ? ? ? ? ? (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()) { 遍歷過程中,集合中有元素被移除,長度減少.或遍歷集合結束
if (a != r) ? //表明是新建的數組
? ?return Arrays.copyOf(r, i);
r[i] = null; // 表明是a,則多加一個null結束符
return r;
? ?}
? ?r[i] = (T)it.next();
}
return it.hasNext() ? finishToArray(r, it) : r;
? ? }
? ? /**
? ? ?* 當it還有更多的元素,重新分配數組。并把剩余元素添加進數組
? ? ?*/
? ? private static <T> T[] finishToArray(T[] r, Iterator<?> it) {
int i = r.length; ? ? ? ? //原來數組長度存入i中
while (it.hasNext()) {
int cap = r.length; ??
if (i == cap) { ? //表明未重新分配數組長度
int newCap = ((cap / 2) + 1) * 3; ? //新數組長度的計算公式,大約擴充1.5倍
if (newCap <= cap) { // 如果分配后發生了整型溢出
if (cap == Integer.MAX_VALUE)
throw new OutOfMemoryError("Required array size too large");
newCap = Integer.MAX_VALUE; ? ?
}
r = Arrays.copyOf(r, newCap); //新建一個長度為newCap的數組,并把r中數據存入
}
r[i++] = (T) it.next(); ? //添加集合剩余元素到新數組
}
// 修剪多余的長度
return (i == r.length) ? r : Arrays.copyOf(r, i);
}
? ? // Modification Operations
? ? /**
? ? ?* 調用此方法總是拋出一個異常,需要子類去重寫此方法
? ? ?*/
? ? public boolean add(E e) {
throw new UnsupportedOperationException();
? ? }
? ? /**
? ? ?* 此方法會首先在集合中查找指定元素o,如果找到就移除它
? ? ?* 移除的是第一個找到的匹配的值
? ? ?*/
? ? public boolean remove(Object o) {
Iterator<E> e = iterator();
if (o==null) { ? ? ? //集合支持null元素
? ?while (e.hasNext()) {
if (e.next()==null) {
? ?e.remove(); ? ??
? ?return true;
}
? ?}
} else {
? ?while (e.hasNext()) {
if (o.equals(e.next())) {
? ?e.remove();
? ?return true;
}
? ?}
}
return false;
? ? }
? ? // Bulk Operations
? ?
? ? public boolean containsAll(Collection<?> c) {
Iterator<?> e = c.iterator();
while (e.hasNext())
? ?if (!contains(e.next())) ?//如果c中有一個元素不在本集合中則返回false
return false;
return true;
? ? }
? ? /**
? ? ?* 此方法將拋出一個UnsupportedOperationException,除非子類重寫了add方法
? ? ?*/
? ? public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
Iterator<? extends E> e = c.iterator();
while (e.hasNext()) {
if (add(e.next())) ? //如果有一個元素添加失敗就返回false
modified = true;
}
return modified;
? ? }
? ? public boolean removeAll(Collection<?> c) {
boolean modified = false;
Iterator<?> e = iterator();
while (e.hasNext()) {
if (c.contains(e.next())) { //如果c中元素也保含在本集合中則移除它
e.remove();
modified = true;
}
}
return modified;
}
? ?public boolean retainAll(Collection<?> c) {
boolean modified = false;
Iterator<E> e = iterator();
while (e.hasNext()) {
if (!c.contains(e.next())) { ?//遍歷集合元素,如果元素不包含在c中,則移除此元素
e.remove(); ? ? ? ? ? ? ? //取的是交集
modified = true;
}
}
return modified;
}
? ? public void clear() {
Iterator<E> e = iterator();
while (e.hasNext()) { ? ?//依次調用next和remove方法
? ?e.next();
? ?e.remove();
}
? ? }
? ? // ?String conversion
? ?/**
* 重寫toString方法,返回格式:[e.toString, e2.toString, ...]
* */
public String toString() {
Iterator<E> i = iterator();
if (!i.hasNext()) ? //如果集合為空返回[]
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (!i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
}
總結
以上是生活随笔為你收集整理的集合框架源码分析——抽象类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集合框架源码分析一(接口篇)
- 下一篇: 集合框架源码分析三(实现类篇ArrayL