Java集合框架
目录
一.集合的应用
1. 无法预测存储的数据的数量
2. 同时存储具有一对一关系的数据
3. 需要进行数据的增删
4. 数据重复问题
二.集合框架的体系结构
集合框架的体系结构主要分为Collection和Map。Collection由三部分构成,分别是List(序列)、Set(集)、Queue(队列)。从Collection到它的子类List、Set、Queue,都是接口,而再往下则是其实现类。List下的实现类有ArrayList、Vector、LinkedList。Set下的实现类有HashSet、TreeSet、LinkedHashSet。而Map下则以HashMap为主。
三.Collection的子类——List的实现类及其方法
Collection中三个主要部分是 List(序列)、Set(集)、Queue(队列)。在List中有三个常用实现类,分别是ArrayList、Vector、以及LinkedList。ArrayList的数据结构是数组,查询快,增删慢。线程不安全,效率高,Vector的数据结构是数组,查询快,增删慢线程安全,效率低。LinkedList 数据结构是链表,查询慢,增删快,线程不安全,效率高。
List的实现类 | 数据结构 | 查询速度 | 增删速度 | 线程安全性 |
---|---|---|---|---|
Vector | 数组 | 快 | 慢 | 线程安全 |
ArrayList | 数组 | 快 | 慢 | 线程不安全 |
LinkList | 链表 | 慢 | 快 | 线程不安全 |
而在Collection中写了许多方法,这些方法是实现类中通用的,以下是一些常用方法:
元素的添加方法,添加成功则返回true:public boolean add(E e)
元素移除方法,若有传入的元素则返回true: public boolean remove(Object o)
如果此集合包含指定集合中的所有元素,则返回true:
public boolean containsAll(Collection<?>
将指定集合中的所有元素添加到此集合,成功则返回true: public boolean addAll(Collection<? extends E>
删除指定集合中包含的所有此集合的元素。此调用返回后,此集合将不包含与指定集合相同的元素。:
public boolean removeAll(Collection<?> c)
从该集合中删除所有不包含在指定集合中的元素。: public boolean retainAll(Collection<?> c)
清空集合:public void clear()
返回此集合的字符串表示形式: public String toString()
返回包含在该集合中的元素的迭代器: public abstract Iterator<E> iterator()
返回集合大小: public abstract int size()
集合为空则返回true: public boolean isEmpty()
如果此集合包含指定的元素,则返回true:
public boolean contains(Object o)
返回一个包含此集合中所有元素的数组:public Object[] toArray()
除此之外,在Collection的子类List中有一些特有的方法,可以通过索引,对于数据元素进行操作。
将指定元素放在指定的索引处:void add(int index, E element)
删除指定下标的元素,返回被删除的元素:E remove(int index)
返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。:int indexOf(Object o)
返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1:int lastIndexOf(Object o)
返回列表中的列表迭代器(按适当的顺序):ListIterator<E> listIterator()
从列表中的指定位置开始,返回列表中的元素(按正确顺序)的列表迭代器:ListIterator<E> listIterator(int index)
根据指定的Comparator
引发的顺序排列此列表:default void sort(Comparator<? super E> c)
返回此列表中指定位置的元素。:E get(int index)
用指定的元素替换此列表中指定位置的元素,并将被替换的元素返回E set(int index,E element)。
除过Collection和List接口中的方法之外,每个实现类中也具有各自特有的方法,在此不再赘述。
四.迭代器以及并发修改异常
迭代器Iterator是提供一种方法对一个集合对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。
迭代器的创建主要是通过集合的具体实现中的.iterator();方法来实现,该方法会返回一个迭代器对象,再通过迭代器中的.hasNext();和.next();方法来实现集合遍历,List中具有一个独特的迭代器:listiterator。它是List中独有的迭代器,支持对集合进行倒序迭代,但是在倒序迭代前需要对集合进行正序迭代,否则无法正常输出想要的倒序集合。
迭代器通过集合的具体实现进行创建,在创建时会将集合数据放入迭代器之中,在迭代器循环时对集合进行修改(添加或删除),导致集合改变会出现并发修改异常(ConcurrentModificationException)。
因为再迭代之前,迭代器已经被通过.itertor()创建出来了,如果在迭代的过程中,又对list进行了改变其容器大小的操作,那么Java就会给出异常。因为此时Iterator对象已经无法主动同步集合做出的改变,Java会认为你做出这样的操作是线程不安全的,就会给出善意的提醒(抛出ConcurrentModificationException异常)。
并发修改异常避免的最好方法是在集合进行遍历的时候,若想要操作集合(添加或删除),使用迭代器自身所有的添加和删除方法,对集合进行操作,这样就可以很好的避免并发修改异常。