一、为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式
二、数组和集合类同是容器,有何不同?
- 数组虽然可以存储对象,但长度是固定的
- 集合长度是可变的
- 数组中可以存储基本数据类型和对象
- 集合只能存储对象
三、集合类的特点
集合只用于存储对象,长度是可变的,可以存储不同类型的对象
四、集合框架的构成及分类
为什么会出现这么多的容器呢?
因为每一个容器对数据的存储方式都有不同,存储方式即数据结构
五、Collection类
/*
*java.util 接口 Collection<E>
*
*Collection 层次结构 中的根接口。
*Collection 表示一组对象,这些对象也称为 collection 的元素。
*一些 collection 允许有重复的元素,而另一些则不允许。
*一些 collection 是有序的,而另一些则是无序的。
*/
public interface Collection<E>extends Iterable<E>
{
//1,添加元素,添加成功返回true,如果此 collection 不允许有重复元素,并且已经包含了指定的元素,则返回 false
boolean add(E e);
//2,将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
boolean addAll(Collection<? extends E> c);
//3,移除此 collection 中的所有元素(可选操作)
void clear();
//4,从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
boolean remove(Object o);
//5,移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作),即去交集
boolean removeAll(Collection<?> c);
//6,仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。即求交集
boolean retainAll(Collection<?> c);
//7,如果此 collection 包含指定的元素,则返回 true
boolean contains(Object o);
//8,如果此 collection 包含指定 collection 中的所有元素,则返回 true
boolean containsAll(Collection<?> c);
//9,如果此 collection 不包含元素,则返回 true。
boolean isEmpty();
//10,比较此 collection 与指定对象是否相等。
boolean equals(Object o);
//11,返回此 collection 的哈希码值
int hashCode();
//12,返回此 collection 中的元素数
int size();
//13,返回在此 collection 的元素上进行迭代的迭代器。
Iterator<E> iterator();
//14,返回包含此 collection 中所有元素的数组。
Object[] toArray();
/*15,返回包含此 collection 中所有元素的数组;
返回数组的运行时类型与指定数组的运行时类型相同。
如果指定的数组能容纳该 collection,则返回包含此 collection 元素的数组。
否则,将分配一个具有指定数组的运行时类型和此 collection 大小的新数组。
如果指定的数组能容纳 collection,并有剩余空间(即数组的元素比 collection 的元素多),
那么会将数组中紧接 collection 尾部的元素设置为 null */
<T> T[] toArray(T[] a);
}
- add方法的参数类型是Object,以便于接收任意类型对象
- 集合中存储的都是对象的引用(地址)
- 每一个集合都有自己的数据结构,都有特定的取出自己内部元素的方式。
- 为了便于操作所有的容器,取出元素。
- 将容器内部的取出方式按照一个统一的规则向外提供,这个规则就是Iterator接口。
- 也就说,只要通过该接口就可以取出Collection集合中的元素,
- 至于每一个具体的容器依据自己的数据结构,如何实现的具体取出细节,这个不用关心,
- 这样就降低了取出元素和具体集合的耦合性。
/**
*java.util.Iterator接口
*对 collection 进行迭代的迭代器。
*迭代器取代了 Java Collections Framework 中的 Enumeration。
*/
public interface Iterator<E>
{
//如果仍有元素可以迭代,则返回 true。
boolean hasNext();
//返回迭代的下一个元素。
E next();
//从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
void remove();
}
package java.lang;
import java.util.Iterator;
/**
* 实现这个接口允许对象成为 "foreach" 语句的目标。
* 从JDK1.5开始才有的
*/
public interface Iterable<T> {
/**
* 返回一个在一组 T 类型的元素上进行迭代的迭代器。
*/
Iterator<T> iterator();
}
七、Collection体系
Collection
|--:List元素是有序的,元素可以重复,因为该集合体系有索引
|--:ArrayList:底层的数据结构使用的是数组结构,特点:查询速度很快,但是增删稍慢,线程不同步
|--:LinkedList:底层使用的是链表数据结构,特点:增删速度很快,查询稍慢
|--:Vector:底层是数组数据结构,线程同步,被ArrayList替代了
|--:Set 元素是无序的,元素不可以重复
八、
AbstractCollection
public abstract class AbstractCollection<E>extends Objectimplements Collection<E>{}
此类提供
Collection
接口的骨干实现,以最大限度地减少了实现此接口所需的工作。
实现代码,多数是利用Iterator来实现的
public abstract class AbstractList<E>extends AbstractCollection<E>implements List<E>{}
此类提供
List
接口的骨干实现,以最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作。
public abstract class AbstractSet<E>extends AbstractCollection<E>implements Set<E>
此类提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作
。。。。。。。。。。。。。