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

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

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

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

  1. 源码(09) -- java.util.Arrays

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

  2. 源码(06) -- java.util.AbstractList<E>

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

  3. 源码(03) -- java.util.Collection<E>

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

  4. JDK1.8源码(五)——java.util.Vector类

    JDK1.8源码(五)--java.lang. https://www.cnblogs.com/IT-CPC/p/10897559.html

  5. Java源码之 java.util.concurrent 学习笔记01

    准备花点时间看看 java.util.concurrent这个包的源代码,来提高自己对Java的认识,努力~~~ 参阅了@梧留柒的博客!边看源码,边通过前辈的博客学习! 包下的代码结构分类: 1.ja ...

  6. 源码(04) -- java.util.List<E>

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

  7. 源码(07) -- java.util.Iterator<E>

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

  8. 源码(08) -- java.util.ListIterator<E>

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

  9. JDK1.8源码(四)——java.util.Arrays 类

    java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 1.asList public static ...

随机推荐

  1. ckeditor_3.6.6.2+CKFinder2.0.2配置

    一.首先工具的下载,找到相应的版本进行下载     ckeditor_3.6.6.2+CKFinder2.0.2 http://ckeditor.com/download      打开war文件,然 ...

  2. 负载均衡 LVS+Keepalived

    系统  CentOS 5.6 X64 物理机 IP 10.10.10.104 Xen : 三台 CentOS 5.8 ip为: 10.10.10.106        10.10.10.107     ...

  3. 函数之DisString

    DocStringsPython有一个很奇妙的特性,称为 文档字符串 ,它通常被简称为 docstrings .DocStrings是一个重要的工具,由于它帮助你的程序文档更加简单易懂,你应该尽量使用 ...

  4. (中等) POJ 2948 Martian Mining,DP。

    Description The NASA Space Center, Houston, is less than 200 miles from San Antonio, Texas (the site ...

  5. Sping--IOC概念

    1. 新建项目, 引入spring包(sping, common-annotation, common-logging包), 还有junit包. user.java: package com.bjsx ...

  6. MongoDB 3.0 WiredTiger Compression and Performance

    MongoDB3.0中的压缩选项 在MongoDB 3.0中,WiredTiger为集合提供三个压缩选项: 无压缩 Snappy(默认启用) – 很不错的压缩,有效利用资源 zlib(类似gzip) ...

  7. 关于安装Windows Live Writer后,内存被占满情况解决

    为了方便写博客,昨天安装了Windows Live Writer2012,但是出现了在安装好后还是正常的,第二天一开机就出现了内存被占满的情况,在资源监视器里看了下也没发现有什么问题.想还是重启一下, ...

  8. python 开发者 精品

    当 Python 和 R 遇上北京二手房 http://mp.weixin.qq.com/s?timestamp=1473262097&src=3&ver=1&signatur ...

  9. Java的三种代理模式

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  10. java中集合框架

    java平台提供了一个全新的集合框架."集合框架"主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型. 在很大程度上,一旦您理解了接口,您就理解了框架.虽然您总要创建接 ...