持续更新中😬 加个关注,后续上新不错过~
数组在使用之前必须定义其元素的个数,即数组的大小,且不能轻易改变数组的大小
当需要动态地减少或增加数据项时,可以使用链表这种数据结构。
链表是由若干个称作结点的对象组成的一种数据结构,每个结点含有一个数据和下一个结点的引用(单链表,见图1),或含有一个数据并含有上一个结点的引用和下一个结点的引用(双链表,见图2)
1. LinkedList泛型类
java.util 包中的 LinkedList泛型类创建的对象以链表结构存储数据,习惯上称LinkedList类创建的对象为链表对象。例如:
LinkedList<String> mylist=new LinkedList<String>();
创建一个空双链表。
使用LinkedList泛型类声明创建链表时,必须要指定E的具体类型,然后链表就可以使用add(E obj)方法向链表依次增加结点。例如,上述链表mylist使用add方法添加结点,结点中的数据必须是String对象,如下列代码所示:
mylist.add("How");
mylist.add("Are");
mylist.add("You");
mylist.add("Java");
这时,链表mylist就有了4个结点,结点是自动链接在一起的,不需要我们做链接。
2. 常用方法
LinkedList是实现了泛型接口List的泛型类,而泛型接口list又是Collection泛型接口的子接口。
LinkedList泛型类中的绝大部分方法都是泛型接口方法的实现。编程时,可以使用接口回调技术,即把 LinkedList对象的引用赋值给Collection接口变量或List接口变量,接口就可以调用类实现的接口方法。
以下是LinkedList泛型类实现List泛型接口中的一些常用方法。
public boolean add(E element)
向链表末尾添加一个新的结点,该结点中的数据是参数element指定的数据。public void add(int index,E element)
向链表的指定位置添加一个新的结点,该结点中的数据是参数element指定的数据。public void clear()
删除链表的所有结点,使当前链表称为空链表。public E remove(int index)
删除指定位置上的结点。public boolean remove(E element)
删除首次出现含有数据element的结点。public E get(int index)
得到链表中指定位置处结点中的数据。public int indexOf(E element)
返回含有数据element的结点在链表中首次出现的位置,如果链表中无此结点则返回-1。public int lastIndexOf(E element)
返回含有数据element的结点在链表中最后出现的位置,如果链表中无此结点则返回-1。public E set(int index,E element)
将当前链表index位置结点中的数据替换为参数element指定的数据,并返回被替换的数据。public int size()
返回链表的长度,即结点的个数。public boolean contains(Object element)
判断链表中是否有结点含有数据element。
以下是LinkedList泛型类本身新增加的一些常用方法。
public void addFirst(E element)
向链表的头添加新结点,该结点中的数据是参数element指定的数据。public void addLast(E element)
向链表的末尾添加新结点,该结点中的数据是参数element指定的数据。public E getFirst()
得到链表中第一个结点中的数据。public E getLast()
得到链表中最后一个结点中的数据。public E removeFirst()
删除第一个结点,并返回这个结点中的数据。public E removeLast()
删除最后一个结点,并返回这个结点中的数据。public Object clone()
得到当前链表的一个克隆链表,该克隆链表中结点数据的改变不会影响到当前链表中结点的数据,反之亦然。
3. 遍历链表
无论何种集合,应当允许用户以某种方式遍历集合中的对象,而不需要知道这些对象在集合中是如何表示及存储的,Java集合框架为各种数据的集合,如链表、散列表等不同存储结构的集合都提供了迭代器。
某些集合根据其数据存储结构和所具有的操作也会提供返回数据的方法,例如LinkedList类中的get(int index)方法将返回当前链表中第index个结点中的对象。
LinkedList的存储结构不是顺序结构,因此,链表调用get(int index)方法的速度比顺序存储结构的集合调用get(int index)方法的速度慢。因此当用户需要遍历集合中的对象时,应当使用该集合提供的迭代器,而不是让集合本身来遍历其中的对象。
由于迭代器遍历集合的方法在找到集合中的一个对象的同时,也得到了待遍历的后继对象的引用,因此迭代器可以快速地遍历集合。
下面的例子比较了使用迭代器遍历链表和get(in t index)方法遍历链表所用的时间:
import java.util.*;
public class Example{
public static void main(String args[]){
List<String> list=new LinkedList<String>();
for(int i=0;i<=60096;i++){
list.add("speed"+i);
}
Iterator<String> iter=list.iterator();
long starttime=System. currentTimeMillis () ;
while (iter. hasNext ()) {
String te=iter.next();
}
long endTime=Sys tem. currentTimeMillis (