Java util 工具包 包含集合框架、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈stack类、向量Vector 类等)。
一、Collection 和Collections
Collection是最基本的集合接口。JDK 不提供此接口的任何直接 实现。
由Collection接口派生的两个接口是List和Set。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
├HashSet
├LinkedHashSet
├TreeSet
Map
├Hashtable
├HashMap
└WeakHashMap
List接口
List 是有序的collection,类似于数组,可以通过索引访问list的元素。List除了有iterator()方法外,
还有一个listIterator() 方法,ListIterator多了一些add()之类的方法,还能向前或向后遍历。List允许有相同的元素。
List<String> list = new ArrayList<String>(); list.add("A"); list.add("B"); list.add("C"); ListIterator<String> listIterator = list.listIterator(); while (listIterator.hasNext()) { System.out.println(" 从前往后: " + listIterator.next()); } while (listIterator.hasPrevious()) { System.out.println(" 从后往前: :" +listIterator.previous()); }
注意:由后向前输出时必须先由前向后输出。因为 hasPrevious()方法实现中有一个游标 cursor会判断是否有元素。
在使用 ListIterator接口进行双向输出时,如果想完成从后往前的输出,则一定要先进行从前往后的输出。
实现List 接口的常用类有LinkedList, ArrayList, Vector和 Stack。
LinkedList类
LinkedList允许null元素,意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。
一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(...));
ArrayList类
ArrayList类实现了可变大小的数组,它继承了AbstractList 并且实现了List 接口。在我们能确定它的容量的时候,
初始化时我们需要给出一个初始值,这样当容量不够时它不用重新在分配容量。可以提高性能。
和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
Vector类
Vector 类似于ArrayList ,但是Vector是同步的。当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态
(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕 获该异常。
Stack类
Stack 继承了Vector,所有它也是同步的,它其实是一个后进先出的堆栈,有基本的push、peek和pop方法。
小结:
(1)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
(2)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
(3)Vector是基于Synchronized实现的线程安全的ArrayList。即Vector是线程安全的。
ArrayList适用于单线程,Vector适用于多线程。
List<String> list = new LinkedList<String>(); List<String> arrList = new ArrayList<String>(); long startTime = new Date().getTime(); for (int i = 0; i < 200000; i++) { list.add("AAA"+i); } long endTime = new Date().getTime(); System.out.println("LinkedList 花费:" + (endTime - startTime)); long startTimearr = new Date().getTime(); for (int i = 0; i < 200000; i++) { arrList.add("AAA"+i); } long endTimearr = new Date().getTime(); System.out.println("ArrayList 花费:" + (endTimearr - startTimearr)); LinkedList 花费: 195 ArrayList 花费: 249