一个集合(Collection)就是一个存储一组对象的容器,我们将这些对象称之为元素。Java支持三种类型的集合:规则集(Set)、线性表(List)和图(Map)。Set的实例存储一组互不相同的元素,List的实例存储一组顺序排列的元素,Map实例存储一组对象。Java集合框架的结构如下图所示:
Java集合的设计使用了接口、抽象类和具体类。接口定义了架构,抽象类提供了接口一部分功能的实现,具体类通过具体的数据结构实现了整个接口。
1.根接口Collection
Collection接口定义了如下方法:
public class MyCollection implements Collection {
// 返回该集合中元素的个数
@Override
public int size() {
return 0;
}
// 判断集合是否没有元素
@Override
public boolean isEmpty() {
return false;
}
// 集合包含元素o,则返回true
@Override
public boolean contains(Object o) {
return false;
}
// 返回集合的迭代探子
@Override
public Iterator iterator() {
return null;
}
// 返回集合元素的对象数组
@Override
public Object[] toArray() {
return null;
}
// 返回集合元素的对象数组
@Override
public Object[] toArray(Object[] a) {
return null;
}
// 将元素e添加进集合
@Override
public boolean add(Object e) {
return false;
}
// 删除集合中的元素o
@Override
public boolean remove(Object o) {
return false;
}
// 判断集合c中的元素是否都在该集合中
@Override
public boolean containsAll(Collection c) {
return false;
}
// 将集合c中的所有元素添加进该集合
@Override
public boolean addAll(Collection c) {
return false;
}
// 移除集合c中的所有元素
@Override
public boolean removeAll(Collection c) {
return false;
}
// 返回该集合与c的交集
@Override
public boolean retainAll(Collection c) {
return false;
}
// 删除集合中的所有元素
@Override
public void clear() {
}
}
2.规则集Set
Set接口扩展Collection接口。
它没有引进新的方法和常量,只是规定其中不能包含相同的元素。HashSet与LinkedHashSet,在hashSet中元素是没有顺序的,而在LinkedHashSet中,可以按照插入的顺序进行提取。
3.线性表List
规则集内只能存储不重复的元素。为了允许在一个集合中存储重复的元素,可以使用线性表。线性表不仅支持重复元素的存储,而且支持用户指定它们的存储位置,用户可以用下标来访问元素。 List 接口扩展 Collection 接口,定义了一个支持元素重复的有序集合。相比Collection接口,List接口中新增了以下方法:
public abstract class MyList implements List {
// 返回该线性表中指定下标处的元素
@Override
public Object get(int index) {
return null;
}
// 设置指定下标的元素
@Override
public Object set(int index, Object element) {
return null;
}
// 向指定下标位置添加一个元素
@Override
public void add(int index, Object element) {
}
// 在指定下标位置将集合c中的所有元素添加到该线性表
@Override
public boolean addAll(int index, Collection c) {
return false;
}
// 删除指定下标的元素
@Override
public Object remove(int index) {
return null;
}
// 返回与指定元素匹配的第一个元素的下标
@Override
public int indexOf(Object o) {
return 0;
}
// 返回与指定元素匹配的最后一个元素的下标
@Override
public int lastIndexOf(Object o) {
return 0;
}
// 返回该线性表所有元素的迭代探子
@Override
public ListIterator listIterator() {
return null;
}
// 返回该线性表中下标从index开始的元素的迭代探子
@Override
public ListIterator listIterator(int index) {
return null;
}
// 返回下标从fromIndex到toIndex的元素构成的子线性表
@Override
public List subList(int fromIndex, int toIndex) {
return null;
}
}
3.1ArrayList与LinkedList
- ArrayList将元素存储在一个数组中,该数组是动态创建的。超过数组的容量时,则会创建一个更大的数组并将当前数组中的所有元素复制到新的数组中。
- LinkedList将元素存放在链表中。
- 如果只是简单的查询操作,ArrayList效率较高,如果要在线性表的任意位置上插入或者删除数据,应该使用LinkedList。
4.向量类Vector
Vector是在Java 2中引入的,除了包含访问和修改向量的同步方法之外,它与ArrayList是相同的。同步方法用于防止多线程同时访问向量时引起数据冲突。Vector实现了List接口。但是还包含Java 2中Vector类的方法。
public class MyVector {
public static void main(String[] args) {
Vector<Object> vector = new Vector<Object>();
vector.capacity(); // 返回vector的容量
vector.addElement("1"); // 向vector中添加元素
Object o = vector.elementAt(0); // 返回指定下标的元素
Enumeration<Object> enumer = vector.elements(); // 返回该向量的枚举值
vector.ensureCapacity(10); // 增加向量的容量
vector.firstElement(); // 返回向量的第一个元素
vector.lastElement(); // 返回向量的最后一个元素
vector.insertElementAt("ok", 2); // 向指定位置插入元素
vector.removeAllElements(); // 删除所有元素
vector.trimToSize(); // 将向量的容量缩减为向量的大小
// 省略......
}
}
5.栈类Stack
在Java集合框架中,Stack是作为Vector类的扩展类实现的。
public class MyStack extends Vector<Object> {
public static void main(String[] args) {
Stack<Object> stack = new Stack<Object>();
stack.empty(); // 判断是否为空栈
stack.peek(); // 返回栈顶元素
stack.pop(); // 返回并删除栈顶元素
stack.push(1); // 向栈顶压入新元素
stack.search(1); // 返回指定元素在栈中的位置
}
}
6.图Map
Map接口建立元素与键值得一个映射关系。
Map中不能存在重复的键,每一个键对应一个值。
public class MyMap implements Map<Object, Object> {
// 返回该图中映像的个数
@Override
public int size() {
return 0;
}
// 如果该图没有映像,返回true
@Override
public boolean isEmpty() {
return false;
}
// map中是否包含该建
@Override
public boolean containsKey(Object key) {
return false;
}
// map中是否包含该值
@Override
public boolean containsValue(Object value) {
return false;
}
// 返回该图中指定键对应的值
@Override
public Object get(Object key) {
return null;
}
// 给该图添加一个映像
@Override
public Object put(Object key, Object value) {
return null;
}
// 删除指定键的映像
@Override
public Object remove(Object key) {
return null;
}
// 将图m中的映像全部添加到该图中
@Override
public void putAll(Map<? extends Object, ? extends Object> m) {
}
// 从该图中删除所有的映像
@Override
public void clear() {
}
// 返回该图中键构成的规则集
@Override
public Set<Object> keySet() {
return null;
}
// 返回由该图中的值构成的集合
@Override
public Collection<Object> values() {
return null;
}
// 返回该图中实体构成的规则集
@Override
public Set<java.util.Map.Entry<Object, Object>> entrySet() {
return null;
}
}
散列图 HashMap 、链式散列图 LinkedHashMap 和树形图 TreeMap 三种图是实现Map接口的具体类。对于定位查找一个值、插入一个映像或删除一个映像, HashMap 类的效率是很高的。在HashMap中元素是没有顺序的,但是在LinkedHashMap中,元素既可以按照它们插入的顺序访问,也可以按照他们最后一次访问的顺序从早到晚排列。TreeMap可以很好的按照键来顺序遍历图。
7.迭代器Iterator
public class MyIterator {
public static void main(String[] args) {
List list = new ArrayList<Object>();
Iterator<Object> it = list.iterator(); //遍历ArrayList
while(it.hasNext()){
it.next();
}
}
}