在介绍List集合接口之前,我们需要了解List接口的继承关系。
public interface List<E> extends Collection<E>
可以看出List接口继承于Collection接口,在JDK1.2以后,java.util包提供了Collection接口,Collection接
口的操作形式与链表有点类似,每一次进行数据操作的时候都只能对单个对象进行处理。
Collection接口是单个集合保存的最大父接口,不过在JDK1.2版本的时候Collection还无法区分数据类型,
直到JDK1.5以后,泛型的引入解决了其类型转换的问题。其实我们很少会使用Collection接口,Collection接口有
两个比较实用的子接口。List接口与Set接口。List接口允许数据的重复,Set接口则不允许。我们先来看一下
Collection接口本身具有的方法。
注意最后的一个方法iterator(),只要是Collection接口的子类对象就有此方法,用来获取Iterator对象。
这篇博客主要介绍List接口,List接口在实际开发中的使用频率能达到80%。List接口继承了Collextion接口并
在此基础上加入了两个很有实用性的方法。
这是List接口的最大特点:可以根据索引取得或者更改数据。不过,List还是个接口,我主要介绍List的三个实现子类:ArrayList,LinkedList,Vector。
1:ArrayList(推荐)
ArrayList和Vector的底层实现都是数组,不过ArrayList是JDK1.2出现的,Vector是JDK1.0本来就有的,除此之外,ArrayList和Vector还有几个不同的地方。
1:ArrayList为异步处理,性能高,Vector为同步处理,性能较低
2:ArrayList非线程安全操作(异步),Vector为线程安全操作(同步)
3:输出形式的不同:ArrayList支持Iterator,ListIterator与foreach,Vactor除了以上三种还支持Enumeration
下面我先演示一下ArrayList类的基本操作
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("D");
list.add("E");
System.out.println(list);
for(int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
因为List接口提供了get(index i)方法,所以我们可以使用get()方法结合索引获取数据
除此之外我们也可以发现List接口实现子类的对象是可以保存重复数据的。除此之外我们要注意的是ArrayList实例化对象的时候,要使用List接口,因为get()和set()方法是List所具有的,如果使用Collection接口实例化,那么此时去除的数据只能进行对象的处理操作了
2:LinkedList
LinkedList的底层实现结构与ArrayList不同,它采用链表的形式生成,除了实现 List 接口外,LinkedList类还为在列表的开头及结尾get和insert元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列 (deque)
此类实现了Queue接口,为add(),poll()等提供先进先出队列操作。其他堆栈和双端队列操作可以根据标准列表操作方便地进行再次强制转换。虽然它们可能比等效列表操作运行稍快,但是将其包括在这里主要是出于方便考虑。所以LinkedList类主要用来实现栈与队列方面的结构,在使用上,如果向List接口转型,那么使用起来和原来没有什么区别
LinkedList实现List接口
List<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
System.out.println(list);
LinkedList实现Queue接口(队列)
Queue<String> queue = new LinkedList<>();
queue.offer("Q");
queue.offer("U");
queue.offer("E");
queue.offer("U");
queue.offer("E");
System.out.println(queue.poll());
System.out.println(queue);
现在我们来总结一下LinkedList与ArrayList的区别
1:ArrayList封装的是数组,在实例化此类对象时,如果有传入数组的大小,那么ArrayList就会开辟一个定长的数组,如果在进行数据插入的时候发现数组大小不够了会自动进行扩充。而LinkedList封装的是一个纯粹的链表,只不过性能比较高罢了。
2:如果频繁的对数据做修改建议使用ArrayList,它的时间复杂度为O(1),如果频繁的对数据进行插入删除就使用LinkedList。当然在实现栈与队列等数据结构的时候还是建议使用LinkedList类。
3:Vector
JDK1.0的时候就存在,所以这个子类已经逐渐被ArrayList所取代,不过在集合输出方面,只有Vector类才可以使用Enumeration(枚举输出),我来演示一下Vector类的使用方法,和前面的使用方法基本上是一样的。
List<String> list1 = new Vector<>();
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("D");
list1.add("E");
list1.remove("C");
System.out.println(list1);
在以后的使用与开发中,尽量使用ArrayList,因为它的性能比其他两种都高,如果要考虑使其同步的话,concurrent包中有提供工具将其转变成线程安全的集合。
有关List接口以及三个实现子类就总结到这里,希望能对大家有所帮助。