List、Set、Map有什么区别和联系
- list和set有共同的父类,用法相同,不同的是set中不能有相同的元素,list中可以
- list和set的用途非常广泛,list可以完全代替数组来使用
- map是独立的合集,它使用键值对的方式来存储数据,键不能重复,但是值可以
- map不想上边两种集合用的广泛,不过在servlet和jsp中,map担任着页面之间传值的作用
collection体系逻辑图
Map
├Hashtable
├HashMap
└WeakHashMap
- Map没有继承Collection接口,Map提供key到value的映射
List
LinkedList类
- LinkedList实现了List接口,允许null元素,此外LinkedList提供额外的get,remove,insert方法,在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)
- 注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。
特点:寻址困难,插入和删除容易。
ArrayList
- ArrayList实现了可变大小的数组。它允许所有元素,包括null,ArrayList没有同步
- 每个ArrayList实例都有一个容量(Capacity),即用于存储元素的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
- 和LinkedList一样,ArrayList也是非同步的。
- 特点:
寻址容易,插入和删除困难。
Vector
- Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如 添加或删除了一些元素),这是调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获此异常。
Stack类
- Stack类继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
Set
HashSet类
- 不允许出现重复元素
- 不保证集合中元素的顺序
- 允许包含值为null的元素,但最多只能有一个null元素
- HashSet的实现是不同步的
TreeSet类
- TreeSet类实现Set接口,该接口由TreeMap实例支持。此类保证排序后的set按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序进行排序,或按照在创建set时所提供的比较器进行排序。
- TreeSet描述的是Set的一种变体——可以实现排序等功能的集合,它在讲对象元素添加到集合时会自动按照某种比较规则将其插入到有序的对象序列中。
- HashSet是基于Hash算法实现的,其性能通常优于TreeSet,我们通常使用HashSet,在我们需要排序功能的时候,才会使用TreeSet。
Map接口
HahTable类
- Hashtable集成Map接口,实现一个key-value映射的哈希表。非空(non-null)的对象都可作为key或者value。任何添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。
- 作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。
- Hashtable是同步的。
HashMap类
- Hash Map和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。
- hashmap遍历的两种方式
使用keyset及entryset来进行遍历
一:效率高
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
二:
Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object val = map.get(key);
}