SimpleArrayList
为用数组存储数据元素的方式实现的表,它是在SimpleList
的基础上改进的。SimpleLinkedList
采取的是双链表的实现方式。
SimpleArrayList
数组实现的表的特性:
可以非常快的随机访问表中第x个元素的值,所以当我们需要比较频繁的对数据进行随机访问存取的时候,这不失为一个很好的选择。
但是它的缺点也很明显,就是对于元素的插入和删除的花销都是线性增长的。因为无论是插入还是删除都需要涉及到元素的移位操作。其最坏的结果就是要在表的头部插入或删除元素,这需要把所有的元素都进行移位操作。
因为使用数组存储的方式,如果要实现可动态扩展数组大小的话,就需要一些额外的花销。当插入元素的时候发现数组大小不够用了的时候就要对数组进行扩展,同时还要拷贝旧数组中的元素到新的数组中。
在这个SimpleArrayList
中将实现Iterabel
接口,但是没有实现当元素被修改时迭代器也失效的效果,这个留到SimpeLinkedList
中实现。
属性
- private int[] elements : 数组元素
- private int size : 表中元素个数
- private final static int DEFAULT_CAPACITY : 默认表大小
构造器
有两个构造器,一个是无参的构造器,将构造一个默认大小的表;另一个则是可以初始化表容量大小的构造器。
|
|
方法
SimpleArrayList
中大部分方法实现和SimpleList
很类似,就不赘述了。
ensureCapacity()
: 扩展数组的大小,并且拷贝原数组中的元素。在这个函数中只有当新设置的容器大小至少等于当前容器大小的时候才有效,否则将忽略这个请求。
|
|
trimToSize()
:本函数可以释放数组中多余的空间,将数组的大小设置为当前表中元素个数。当我们已经确定了表的大小几乎不用发生改变了的时候可以进行该操作释放空间资源。
|
|
add()
:为插入元素的函数。 当数组大小不够用时会扩展数组。
append()
:为在尾部追加元素的操作,这个操作不涉及元素的移位。
|
|
remove()
:移除元素。
|
|
实现了Iterable
接口的方法,返回一个Iterator
对象。我自己实现了一个SimpleArrayListIterator
类来实现迭代器。
|
|
内部类(SimpleArrayListIterator)
|
|
SimpleLinkedList
链式实现的表的结构:
链表不能进行元素的随机访问,每次需要访问某个特定元素的时候都要从表头会表尾巴开始查找(双链表可以在表尾开始查找元素)。所以这些操作的花销都是线性增长的,并不鼓励对链表进行频繁的get, set操作。
链表最大的优点就是对于已知位置的插入和删除操作是非常快的,只需要常数时间就可以完成,而不需要对任何元素进行移位操作。链表适合于要对表频繁的进行插入和删除操作的情况。
链表采用的链式结构,节点都是非连续的存储在内存中的,只要内存空间充足,表的大小就可以看作是无限的。所以不需要额外的调整表大小的花销。
SimpleLinkedList
采用了双链表的实现方式,并且在SimpleArrayList
的基础上,不但实现了Iterable
接口,还通过新增一个modCount
变量来实现迭代器失效的效果。
成员变量
- private int size:表元素个数;
- private int modCount:修改记录数,迭代器用来判断迭代期间是否发生修改;
- private Node
<T>
head:指向头节点的引用; - private Node
<T>
tail:指向尾结点的引用。
构造器
|
|
函数
clear()
:重置链表为空表。
|
|
获取表中元素个数和判断是否是空表。
getNode()
:在链表中定位指定位置的元素,这里先判断要定位的元素处于元素前半部分还是后半部分,然后根据元素所在位置选择在头部还是尾部开始定位元素。
|
|
append()
:尾部追加元素。
add()
:插入元素。
addBefore()
:私有方法,在节点p的前面插入元素。
|
|
removeFirst()
:删除第一个节点。
removeLast()
:删除最后一个节点。
remove()
:删除指定位置的节点。
|
|
get()
:获取指定位置节点的元素值。
set()
:给指定位置的节点设置新的元素值。
|
|
实现了Iterable接口的方法,返回一个Iterator对象。我自己实现了一个SimpleLinkedListIterator类来实现迭代器。
|
|
内部类
|
|
SimpleLinkedListIterator
|
|
源代码
SimpleArrayList.java
|
|
SimpleLinkedList.java
|
|