1、Iterator接口
Iterator(迭代器)是一种设计模式,开发人员无需了解序列的底层结构就可以遍历该序列。迭代器创建代价小,是轻量级的对象,在Java中,Iterator的功能比较简单,只能单向移动。
在Java中,实现了Collection接口或者直接实现Iterator接口的数据类型都可以使用迭代器遍历查找。Iterator接口含有三个重要的方法:hasNext()、next()、remove()方法。首先使用hasNext()判断迭代器是否有后续对象,若果有,用nest()方法接收,同时还可以用remove方法删除该元素。
2、Collection
在所有的Java集合框架中,Collection是其顶层的接口。集合中有丰富的抽象数据类型,这些数据类型也封装了对应的算法以实现数据低耗高效的特点。Collection的继承结构图如下:
Java的集合操作类的基本接口是Collection,该接口用于表示任何元素或对象组,支持添加、删除、和迭代等功能。Collection的通用方法如下:
方法名称 | 功能描述 |
boolean add(Object element) | 添加一个元素到集合中 |
boolean addALL(Collection from) | 讲from集合中的所有元素添加到集合中 |
void clear() | 清空集合 |
boolean contains(Object obj) | 判断集合中是否含该元素 |
boolean containsALL(Collection c) | 判断集合中是否包含了集合c中所有的元素 |
boolean equals(Object obj) | 判断集合是否相等 |
boolean isEmpty() | 判断集合是否为空 |
Iterartor iterator() | 返回一个实现了Iterator接口的对象 |
boolean remove(Object element) | 删除集合中的该元素 |
boolean removeALL(Collection c) | 删除集合中所有与c集合中相同的元素 |
boolean retainALL(Collection c) | 删除集合中不在c中的元素 |
int size() | 返回集合中元素的数目 |
add()方法用于将对象添加给集合,如果添加对象后集合确实发生了变化则返回true,否则返回false。如果集合中已经有了这个对象,则直接返回false, remove()方法执行的操作与add()相反。iterator()方法返回一一个实现了Ierator接口的对象,用于对集合内元素的遍历。在遍历的时候会用到两个Iterator定义的遍历方法: hasNext())和next(), next()方法返回集合中的下一 个元素,如果不存在下一个元素则会抛出NoSuchElementException异常,所以般在使用next()方法的时候都会使用hasNext()方法来判断是否还有可供访问的对象。
3、List接口
List接口有两个实现类,ArayL ist和LinkedListo ArrayList是用数组实现的List,能进行快速的随机访问,但是随机插人和删除操作比较慢。LinkedI ist对顺序访问进行了优化,在插入和删除元素的操作上代价也不高,但是随机访问的速度相比就会很慢。在实际应用中,LinkedList可以当成栈( Statck )队列( Queue )或双向队列(Deque )来使用。
List是常用且简单的数据结构,又称为线性表。在线性表中(非空且有限),有且仅有一一个元素被称为第一个元素和最后一个元素,同时,除去第一个元素,每个元素都有一个前驱元素,除去最后一个, 每个元素都有一个后继元素。在线性表中,所有的相邻数据元素之间存在这样的先后顺序。
(1)ArrayList(顺序表)
顺序表的特点是用元素在计算机内物理位置的相邻来表示线性表中数据元素之间的逻辑关系,这种模式时的顺序表的随机读取速度非常快。
方法说明 | 功能描述 |
boolean add(E e) | 尾插 e |
void add(int index, E element) | 将 e 插入到 index 位置 |
boolean addAll(Collection<? extends E> c) | 尾插 c 中的元素 |
E remove(int index) | 删除 index 位置元素 |
boolean remove(Object o) | 删除遇到的第一个 o |
E get(int index) | 获取下标 index 位置元素 |
E set(int index, E element) | 将下标 index 位置元素设置为 element |
void clear() | 清空 |
boolean contains(Object o) | 判断 o 是否在线性表中 |
int indexOf(Object o) | 返回第一个 o 所在下标 |
int lastIndexOf(Object o) | 返回最后一个 o 的下标 |
List<E> subList(int fromIndex, int toIndex) | 截取部分 list |
(2)LinkedList(链表)
链表就像长城上的烽火台,它们遥相呼应但不在一起,但是信息能准确地点一 点地向下传递,直到传递到最后一个烽火台。 链表就是这样,可以存在于计算机的互不相邻的物理内存中, 但是根据每个元素的前驱地址就可以找到.上个元素或者根据后继地址找到下一个元素。链表分为单向链表和双向链表,单向链表只能从链表的第一个元素依次向下查找,双向链表则可以从任意位置向前或者向后查找。
单向链表中的元素可以是不连续的存储空间,这种连续是指逻辑上的连续。元素在存储的时候需要多存储后继数据的信息,单向链表查找后继很方便,但是找到前驱就很困难了,双向链表则克服了这个问题,不过相比单向链表,它要多存储-份前驱的数据。LinkedList 实现的就是双向链表。与顺序表的插入、删除不同, 链表只需要修改对应节点的前驱结点存储的后继节点信息和后继节点存储的前驱结点信息即可。
LinkedList常用方法:
方法名称 | 功能描述 |
Void addFirst(E e) | 将给定的元素放到链表的最前面 |
Void addLast(E e) | 将给定的元素放到链表的最后面 |
E element() | 获取链表的第一个元素 |
E get(int index) | 获取指定位置的元素 |
E getFirst() | 获取第一个元素 |
E getLast() | 获取最后一个元素 |
Int indexOf(Object obj) | 获取obj在链表中第一次出现的位置,-1表示未找到 |
Int lastIndex(Object obj) | 获取obj在链表中最后一次出现的位置,-1表示未找到 |
ListIterator<E>listIterator(int index) | 获取从index开始的迭代器 |
Boolean offer(E e) | 将元素e加入链表的尾部 |
E peek() | 获取第一个元素 |
E poll | 获取并删除第一个元素 |
E remove() | 获取并删除第一个元素 |
E remove(int index) | 获取并删除指定位置的元素 |
E removeFirst() | 获取并删除第一个元素 |
E removeLast() | 获取并删除组后一个元素 |
E set(int index,Element) | 将指定位置的值用e代替 |
Object[] toArray() | 将所有元素组织成一个数组 |
链表继承了Collection的所有方法,但是它本身也有lsterator(int index)方法,该方法可以指定的下标开始迭代。如果知道了需要开始迭代的下标,链表的遍历速度也会有很大的提升,同时也省去了将链表转换成顺序表的步骤。读者在此处一定要注意,该方法是链表独有的,List 接口没有该方法,想要使用该方法定要用链表的实现类LinkedList去定义该链表对象。