“嗨,阿米戈!”

“嗨,艾莉!”

“今天我们要彻底了解集合的结构。”

“我已经等了很久了。”

“你已经知道什么是集合,也知道如何使用它们。是时候将你的知识组织成一个严格的系统了。然后许多‘为什么’和‘如何’的问题就会消失,大多数事情都会变得显而易见。”

集合接口。集合接口的继承结构是这样的:”

采集接口 - 1

注意两件事。

首先,您在这里看到的一切都是一个界面。

其次,箭头表示“继承”。

“也就是说,List、Set、Queue继承了Collection,而Map却没有?”

“是的。然后抽象类继承这些接口,反过来,你所知道的实现继承这些抽象类:  ArrayList、Hashtable、TreeSet……

“你是对的。”

“现在让我们看看这些接口的方法是干什么用的:”

Iterable<E>:接口的方法:

方法 描述
Iterator<T> iterator(); 返回一个迭代器对象。

“这似乎还不够。”

“好吧,这就是数量。迭代器就是这些。我们现在不会介绍它们,但我们很快就会详细介绍它们。”

Collection<E>:接口的方法:

方法 描述
boolean add(E e); 向集合中添加一个元素
boolean addAll(Collection<? extends E> c); 向集合中添加元素
void clear(); 从集合中移除所有元素
boolean contains(Object o); 检查集合是否包含该元素。
boolean containsAll(Collection<?> c); 检查集合是否包含元素。
boolean equals(Object o); 检查集合是否等价
int hashCode(); 返回哈希码
boolean isEmpty(); 检查集合是否为空。
Iterator<E> iterator(); 返回一个迭代器对象
boolean remove(Object o); 从集合中移除一个元素
boolean removeAll(Collection<?> c); 从集合中移除元素
boolean retainAll(Collection<?> c); 删除所有不在 c 中的元素
int size(); 返回集合的大小
Object[] toArray(); 将集合转换为数组
<T> T[] toArray(T[] a); 将集合转换为数组

“这里的一切我都已经很扎实了,这些手段我用过一半,另外一半我也遇到过。”

“很好,那我们继续吧。”

 List<E>:接口的方法:

方法 描述
void add(int index, E element); 将元素添加到集合的中间
boolean addAll(int index, Collection<? extends E> c); 向集合中添加元素
E get(int index); 按索引返回元素
int indexOf(Object o); 返回元素的索引(数字)
int lastIndexOf(Object o); 返回最后一个元素的索引。
ListIterator<E> listIterator(); 返回列表的迭代器
ListIterator<E> listIterator(int index); 返回列表的迭代器
E remove(int index); 按索引删除元素
E set(int index, E element); 按索引设置新值
List<E> subList(int fromIndex, int toIndex); 返回一个子集合

“这里也没有什么新鲜事。我已经了解了几乎所有关于收藏的知识,对此我情不自禁地感到高兴。”

“好吧,我想我能找到让你吃惊的东西。但是让我们继续检查接口:”

Set<E>:接口的方法:

方法 描述
没有方法

“Set 接口没有任何新方法——只有它继承的方法。”

“是啊,我看到Interable界面也什么都没有。

“另一方面,方法越少,记忆越少!”

“你对生活肯定的乐观让我很开心。”

“Set 接口由两个具有方法的接口继承:SortedSet 和 NavigableSet。但我不会讨论它们,否则我们永远不会完成。”

“相反,让我给你一个描述 Java 中集合的类和接口的概况。”

“来吧。”

“那就抱紧:”

采集接口 - 2

“哇,好大啊!”

“嗯,没那么大。另外,请记住抽象类完全是可选的。但最好记住哪个类实现了哪些接口。这可以经常派上用场。”

“哦,我还想说明一下,有些收藏品已经过时了。”

“那些是什么?”

“我说的是 Vector、Stack、Dictionary 和 Hashtable 类。这些是普通集合的同步(线程安全)版本。”

“但是Java添加了一个特殊的并发库,里面有很多集合,不仅可以从其他线程访问,而且实现效率也高很多。ConcurrentHashMap Hashtable效率高很多。”

“您可以使用 Vector、Stack、Dictionary 和 Hashtable 集合,但不推荐这样做。”

“知道了,我会记住的。”

“谢谢,艾莉!”