二者最明显的差别是List支持放入重复的对象,而Set不支持。
List
常用的实现类有ArrayList、LinkedList、Vector及Stack
1.ArrayList
●ArrayList是基于数组方式实现的,没有容量的限制。
●ArrayList在执行插入元素时可能要扩容,在删除元素时并不会减小数组的容量(如希望相应
的缩小数组容量,可以
调用ArrayList的trimToSize()方法),在查找元素时要遍历数组,对于非null的元素采取
equals的方式寻找;
●ArrayList是非线程安全的
2.LinkedList
●LinkedList是基于双向链表机制实现的
●LinkedList在插入元素时,须创建一个Entry对象,并切换相应元素的前后元素的引用;在查
找元素时,
须遍历链表;在删除元素时,须遍历链表,找到要删除的元素,然后从链表上将此元素删除即
可。
●LinkedList是非线程安全的
●相较ArrayList,LinkedList在插入和删除时效率较高,但查找效率较低。
3.Vector
对于Vector而言,要注意的只有一点:
Vector是基于synchronized实现的线程安全的ArrayList,但在插入时容量扩充的机制和
ArrayList有所不同,并可通过capacityIncrement来控制容量的扩充。
4.Stack
Stack继承自Vector,在其基础上实现了Stack所要求的后进先出(LIFO)的弹出及压入操作,其
提供了push、pop、peek三个主要方法。
●push
push操作是通过调用Vector的addElement来完成的。
●pop
pop操作通过调用peek来获取元素,并同时删除数组的最后一个元素
●peek
peek操作通过获取当前Object数组的大小,并获取数组上的最后一个元素。
Set
1.HashSet
HashSet是Set接口的实现,Set和List最明显的区别在于Set不允许元素重复,而List允许。
Set为了做到不允许元素重复,采用提基于HashMap来实现。
在HashSet的构造方法中创建了一个HashMap对象。
add(E)
调用HashMap的put(Object,Object)方法来完成此操作,将需要增加的元素作为Map中的key,
value则传入一个之前
已创建的Object对象。
remove(E)
调用HashMap的remove(E)方法来完成此操作
contains()
调用HashMap的containsKey(E)方法来完成此操作
iterator()
通过Hash的KeySet的iterator方法来完成此操作
HashSet不支持通过get(int)获取指定位置的元素,只能自行通过iterator方法来获取
注意要点:
对HashSet而言,最注意的有以下几点
●HashSet基于HashMap实现,无容量限制
●HashSet是非线程安全的
2.TreeSet
TreeSet与HashSet的主要不同在于对于排序的支持,TreeSet基于TreeMap实现。
TreeSet和HashSet一样,也是完全基于Map来完成的,并且同样不支持get(int)来获取指定位
置的元素,只是TreeSet基于的是TreeMap,除了这些基本的Set实现外,TreeSet还提供了一些
排序方面的支持,例如传入Comparator实现、
descendingSet及descendingIterator等。
对于TreeSet而言,最要注意的有以下几点:
●TreeSet是基于TreeMap实现,支持排序
●TreeSet是非线程安全的