集合类:Collection--List, Set, Map(二)
urn e;
}
对于Linkedlist, 如果要查找指定位置的元素,它没有ArrayList快,必须从头或从尾一个一个地遍历。时间花费较大O(n).但是对于修改操作,如插入删除,同样花费O(n)先去找到这个index对应的元素,然后花费常量时间去修改链接。迭代器的使用会使LinkedList快捷很多。
结构特点:链表。元素有序可重复。
查找操作:查找速度不如ArrayList, 每次查找都得从头或从尾遍历。
修改操作:速度快于ArrayList,不必移动其它元素。
线程安全:非线程同步。
适用情况:适用于有平凡增删的情况。
2.3 Vector( Stack)
Vector 非常类似于Arraylist. 但是最重要的区别是:Vector是线程同步的,也就是说Vector适合多线程操作。Stack继承自Vector,提供了一些pop,push, peek等用于Stack操作的方法。Stack也是线程安全的。
结构特点:ArrayList。元素有序可重复。
查找操作:查找速度快。
修改操作:不如linkedList
线程安全:线程同步。
适用情况:适用于一些需要stack的情况。
3.Set
HashSet将元素存储在哈希表(hash table)中,它是最高效的Set实现,但是它无法确定迭代顺序。TreeSet将元素存储在红黑树中,元素按照值进行排序,它比HashSet稍慢。LinkedHashSet是HashSet的链表实现,它保持元素插入的顺序,但是访问性能比HashSet和TreeSet差。
这里有一个简单但是有用的Set使用场景。假设你有一个Collection c,你想创建另外一个Collection,但必须去除重复元素(只保留一个)。下面一行代码就实现了你的要求:
Collection noDups = new HashSet(c);
这里有另外一个变种实现,能保证原始集合中元素的顺序:
Collection noDups = new LinkedHashSet(c);
3.1 set集合的批量操作(bulk operation)
批量操作尤其适用于Set。当执行批量批量操作相当于执行集合代数意义上的运算。假设s1和s2都是Set。下面是各种批量操作:
s1.containsAll(s2) — 如果s2是s1的子集,返回true,否则返回false
s1.addAll(s2) — 得到的是s1和s2的并集
s1.retainAll(s2) — 得到的是s1和s2的交集
s1.removeAll(s2) — 得到的是s1和s2的差集(s1-s2,即所有s1中有但是s2中没有的元素的集合)
为了计算两个集合的并、交、差集而不修改这两个集合,调用者必须先拷贝一份,然后再调用bulk opertaion,比如下面:
Set union = new HashSet(s1);
union.addAll(s2);
Set intersection = new HashSet(s1);
intersection.retainAll(s2);
Set difference = new HashSet(s1);
difference.removeAll(s2);
3.2 HashSet
hashSet的底层是一个map, 是最高效的set,但是无法保证集合中元素的顺序。
[java]
package set;
import java.util.*;
public class TestHashSet {
/**
* 创建一个散列集存储字符串,实现部分方法
* @author Sun1956
*/
public static void main(String[] args) {
//创建一个HashSet
Set set1 = new HashSet();
//添加字符串到set1中
set1.add("London");
set1.add("Paris");
set1.add("New York");
set1.add("San Francisco");
set1.add("BeiJing");
//使用迭代器遍历set1
Iterator iterator = set1.iterator();
System.out.println("Display the elements in set1:");
while(iterator.hasNext()) {
System.out.printf(iterator.next() + " ");
}
System.out.println("\nset1 is " + set1);
System.out.println(set1.size() + " elements in set1");
//remove方法:删除一个字符串
set1.remove("London");
System.out.println("\nset1 is " + set1);
System.out.println(set1.size() + " elements in set1");
//创建set2
Set set2 = new HashSet();
//add method
set2.add("London");
set2.add("ShangHai");
set2.add("Paris");
System.out.println("\nset2 is " + set2);
System.out.println(set2.size() + " elements in set2");
//contains方法:检查是否包含一个字符串
System.out.println("\nIs Taipei in set2 "
+ set2.contains("Taipei"));
//addAll方法 :将另一个set的所有元素添加进来(Union 操作)
set1.addAll(set2);
System.out.println("\nAfter adding set2 to set1, set1 is " + set1);
//removeAll方法 : 删除另一个集合中的元素全部删除(Difference