java.util.AbstractCollection<E> 源码分析(JDK1.7)

---------------------------------------------------------------------------------

java.util.AbstractCollection<E>是一个抽象类,它的定义如下:

 public abstract class AbstractCollection<E> implements Collection<E> {
//construct //Query Operations // Modification Operations // Bulk Operations // String conversion
}

(1)java.util.AbstractCollection<E>提供了对java.util.Collection<E>接口的骨干实现,以最大限度地减少了实现Collection接口所需要的工作。

(2)按照Collection接口规范中的建议,通常应提供一个void(无参数)和Collection构造方法。

---------------------------------------------------------------------------------

下面来看看java.util.AbstractCollection<E>中具体有哪些方法

从下面的表格中可以看出java.util.AbstractCollection<E>接口中一共有14个方法,其中查询操作6个;修改操作2个;批量操作5个;字符串描述1个。

查询操作 public abstract Iterator<E> iterator() 返回在此collection中的元素上进行迭代的迭代器
public abstract int size() 返回此collection中的元素数,如果此collection包含的元素大于Integer.MAX_VALUE,则返回Integer.MAX_VALUE
public boolean isEmpty() 如果此collection不包含元素,则返回true
public boolean contains(Object o) 如果此collection包含指定的元素,则返回true
public Object[] toArray() 返回包含此collection中所有元素的数组
public <T> T[] toArray(T[] a) 返回包含此collection中所有元素的数组
修改操作 public boolean add(E e) 确保此collection包含指定的元素
public boolean remove(Object o) 从此collection中移除指定元素的单个实例
批量操作 public boolean containsAll(Collection<?> c) 如果此collection包含指定collection中的所有元素,则返回true
public boolean addAll(Collection<? extends E> c) 将指定collection中的所有元素都添加到此collection中
public boolean removeAll(Collection<?> c) 移除此collection中那些也包含在指定collection中的所有元素
public boolean retainAll(Collection<?> c) 仅保留此collection中那些也包含在指定collection的元素
public void clear() 移除此collection中的所有元素
字符串描述 public String toString() 返回此collection的字符串表示形式

java.util.AbstractCollection<E>从java.util.Collection<E>继承的方法如下:

  1. boolean equals(Object o);
  2. int hashCode();

再看下面的图示:

java.util.Collection<E>接口中一共定义了15个方法,java.util.AbstractCollection<E>对其中的11个方法提供了实现,其中iterator()、size()、equals()、hashCode()4个方法没有提供实现,需要由java.util.AbstractCollection<E>的扩展类来提供具体的实现。

---------------------------------------------------------------------------------

下面来看看java.util.AbstractCollection<E>中源码部分:

一、构造函数

     protected AbstractCollection() {
}

二、具体方法

查询操作

(1) public abstract Iterator<E> iterator()

源代码如下:(抽象方法,由具体的子类提供实现)

 public abstract Iterator<E> iterator();

(2) public abstract int size()

源代码如下:(抽象方法,由具体的子类提供实现)

 public abstract int size();

(3) public boolean isEmpty()

源代码如下:

     public boolean isEmpty() {
return size() == 0;
}

(4) public boolean contains(Object o)

源代码如下:

     public boolean contains(Object o) {
//返回此集合的Iterator对象
Iterator<E> it = iterator(); if (o==null) {
//比较对象o为null,则循环Iterator查找是否有对象为null
while (it.hasNext())
if (it.next()==null)
return true;
} else {
//比较对象o不为null,则循环Iterator查找是否有对象与o相等
while (it.hasNext())
if (o.equals(it.next()))
return true;
}
return false;
}

(5) public Object[] toArray()

源代码如下:

     public Object[] toArray() {
//创建一个Object类型的数组,数组大小为Collection中元素的个数
Object[] r = new Object[size()];
//返回此collection的Iterator对象
Iterator<E> it = iterator();
//利用循环将Iterator中的对象赋值给Object数组
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;
}

(6) public <T> T[] toArray(T[] a)

源代码如下:

     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)
return Arrays.copyOf(r, i);
r[i] = null; // null-terminate
return r;
}
r[i] = (T)it.next();
}
return it.hasNext() ? finishToArray(r, it) : r;
}

修改操作

(1) public boolean add(E e)

源代码如下:(没有提供具体的实现,调用此方法会抛出异常)

     public boolean add(E e) {
throw new UnsupportedOperationException();
}

(2) public boolean remove(Object o)

源代码如下:

     public boolean remove(Object o) {
//返回Collection的Iterator对象
Iterator<E> it = iterator(); if (o==null) {
//要删除的对象为null,则循环Iterator查找对象为null,并且删除掉
while (it.hasNext()) {
if (it.next()==null) {
it.remove();
return true;
}
}
} else {
//要删除的对象不为null,则循环Iterator查找对象,并且删除掉
while (it.hasNext()) {
if (o.equals(it.next())) {
it.remove();
return true;
}
}
}
return false;
}

批量操作

(1) public boolean containsAll(Collection<?> c)

源代码如下:

     public boolean containsAll(Collection<?> c) {
//循环取出collection中的每个对象,然后去调用contains()方法
for (Object e : c)
if (!contains(e))
return false;
return true;
}

(2) public boolean addAll(Collection<? extends E> c)

源代码如下:

     public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
//循环取出要添加的子collection中的元素,然后去调用add()方法
for (E e : c)
if (add(e))
modified = true;
return modified;
}

(3) public boolean removeAll(Collection<?> c)

源代码如下:

     public boolean removeAll(Collection<?> c) {
boolean modified = false;
//返回collection的Iterator对象
Iterator<?> it = iterator();
//依次循环取出Iterator中的对象,然后调用contains()方法查看该对象是否在collectoin中,如果存在的话,则调用remove()方法删除掉
while (it.hasNext()) {
if (c.contains(it.next())) {
it.remove();
modified = true;
}
}
return modified;
}

(4) public boolean retainAll(Collection<?> c)

源代码如下:

     public boolean retainAll(Collection<?> c) {
boolean modified = false;
//返回Collection的Iterator对象
Iterator<E> it = iterator();
//依次循环取出Iterator中的对象,然后调用cotains()方法查看该对象是否在collection中,如果不存在的话则调用,则调用remove()方法删除掉
while (it.hasNext()) {
if (!c.contains(it.next())) {
it.remove();
modified = true;
}
}
return modified;
}

(5) public void clear()

源代码如下:

     public void clear() {
//返回collection集合的Iterator对象
Iterator<E> it = iterator();
//依次循环Iterator取出每一个对象,然后调用remove()方法删除掉
while (it.hasNext()) {
it.next();
it.remove();
}
}

字符串描述

(1) public String 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(' ');
}
}

---------------------------------------------------------------------------------

---------------------------------------------------------------------------------

JDK源码(1.7) -- java.util.AbstractCollection<E>的更多相关文章

  1. JDK源码(1.7) -- java.util.AbstractList<E>

    java.util.AbstractList<E> 源码分析(JDK1.7) ------------------------------------------------------- ...

  2. JDK源码(1.7) -- java.util.Collection<E>

     java.util.Collection<E> 源码分析(JDK1.7) -------------------------------------------------------- ...

  3. JDK源码学习之 java.util.concurrent.automic包

    一.概述 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CP ...

  4. JDK源码(1.7) -- java.util.Deque<E>

    java.util.Deque<E> 源码分析(JDK1.7) -------------------------------------------------------------- ...

  5. JDK源码(1.7) -- java.util.Queue<E>

    java.util.Queue<E> 源码分析(JDK1.7) -------------------------------------------------------------- ...

  6. JDK源码(1.7) -- java.util.Arrays

    java.util.Arrays 源码分析 ------------------------------------------------------------------------------ ...

  7. JDK源码(1.7) -- java.util.ListIterator<E>

    java.util.ListIterator<E> 源码分析(JDK1.7) ------------------------------------------------------- ...

  8. JDK源码(1.7) -- java.util.Iterator<E>

    java.util.Iterator<E> 源码分析(JDK1.7) ----------------------------------------------------------- ...

  9. JDK源码(1.7) -- java.util.List<E>

    java.util.List<E> 源码分析(JDK1.7) --------------------------------------------------------------- ...

随机推荐

  1. discuz 积分按日重新计算,(摒弃以前24小时计算)

    修改\source\module\forum\forum_misc.php将 foreach(C::t('forum_ratelog')->fetch_all_sum_score($_G['ui ...

  2. mac下 mysql / nginx 问题总汇

    "ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)&q ...

  3. 122.Best Time to Buy and Sell Stock II---dp

    题目链接:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/description/ 题目大意:基本定义与121类似,不 ...

  4. 2017 NEERC

    2017 NEERC Problem A. Archery Tournament 题目描述:在二维平面上,会陆续出现一些圆,以及一些询问,询问点是否在圆内,如果是,则输出那个圆,并把那个圆删掉,否则输 ...

  5. [转载]FFmpeg完美入门[2] - FFmpeg参数说明

     1 通用选项 -L license -h 帮助 -fromats 显示可用的格式,编解码的,协议的. -f fmt 强迫采用格式fmt -i filename 输入文件 -y 覆盖输出文件 -t d ...

  6. [SVN技巧]代码提交中遇到的两个问题及其解决方案

    前言 SVN在使用的过程中会遇到各种各样的问题,小黑在最近的使用中,遇到如下的两个问题,这里贴出来供大家参考 问题记录 SVN在源码仓库中不存在,导致无法删除和上传 问题提示: Working cop ...

  7. vue数据传递--我有特殊的实现技巧

    最近碰到了比较多的关于vue的eventBus的问题,之前定技术选型的时候也被问到了,vuex和eventBus的使用范围.所以简单的写一下.同时有一种特殊的实现方案. 有这么几种数据传递方式,vue ...

  8. 观察者模式和java委托

    观察者模式与java委托 所谓观察者模式,指的某个状态信息的改变,会影响其他一系列的操作,这时就可以将这些操作抽象化,同时创建一个类统一的管理和执行这些操作.把这些抽象出来的操作称为观察者类,而管理这 ...

  9. 爬虫基础库之beautifulsoup的简单使用

    beautifulsoup的简单使用 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: ''' Beautiful Soup提供一些简单的.p ...

  10. jquery 修改样式

    //显示待办数字 function showdb(url,ID) {   jQuery.get(url,function(data,status){ if(!isNaN(data)) {  if(da ...