Java集合(一)—容器了解
一:集合框架
Java集合框架图
Java集合简化图
二:添加一组元素
在Java集合中的工具包中(Arrays,Collections)如上图所示,添加一组元素可以采用:
- Arrays.asList(args) args:数组或逗号分隔的列表 将结果转换为一个list对象(不能直接对其操作底层返回的仍是数组)
- Collection.addAll(args) args:只能是collection集合 (不灵活 )
- Collections.addAll(arg0 , arg1) arg0:添加到的collection集合 arg1:数组或逗号分隔的列表 (速度很快)
三:容器的打印
默认打印使用容器的toString方法。Collection打印结果为[ , , , , , ];Map打印结果为{ key1=value,key2=value, }
四:List
ArraList 、vectory和 LinkedList都继承List与Collection接口。
ArrayList:擅长随机访问,但是在List的中间插入和移除元素比较慢。
LinkedList:擅长顺序访问,在List中间进行插入和删除操作代价较低。但在随机访问方面相对较慢。
五:Set
Set保存不重复的元素。查找时Set中最重要的操作。HashSet对快速查找做了优化。
- HashSet: 用来快速查找,使用的是散列函数,提供最快的查询速度。存入hashset的元素必须定义hashCode()
- TreeSet: 将元素储存在红—黑树中,保持元素处于排序状态。元素必须实现Comparable接口。
- LinkedHshSet: 具有HashSet的查询速度,内部使用了链表来维护元素的插入顺序,以插入顺序保存元素。也必须定义HashCode方法。
六:Map
Map中的keySet()方法用于返回map中的所有键组成的Set。(通常用于遍历map集合)
- HashMap: 设计用来快速访问,基于散列表来实现的。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量和负载因子,以调整容器的性能。
- LinkedHashMap: 速度只比HashMap慢一点;但是在迭代访问时速度要更快一些,因为使用链表维护了内部次序。迭代遍历它时,其顺序是插入顺序或最近最少使用的顺序(LRU)的次序。
- TreeMap: 基于红黑树的实现。查看键或键值对时,它们会被排序(根据Comparable或Comparator决定)。它的特点在于所有结果都是经过排序了的。它也是唯一一个返回衣蛾子树的map。
- WeakHashMap: 弱键映射,允许释放映射所指向的对象。
- ConcurrentHashMap: 一种线程安全的Map,不涉及同步加速。
- IdentityHashMap: 使用 == 代替 equals对“键”进行比较的散列映射。
七:其它
Queue
队列是一个先进先出的容器。LinkedList提供了方法支持队列的行为,并且它实现了Queue接口。
Queue<Integer> queue = new LinkedList<Integer>();
queue.offer() //讲一个元素插入队尾,或则返回false
//在不移除的情况下返回队头
queue.peek(); //队列为空时返回null
queue.element(); //队列为空时抛出NoSuchElementException异常
//将元素移除并返回队头
queue.poll(); //队列为空时返回null
queue.remove(); //队列为空时抛出NoSuchElementException异常
PriorityQueue
优先级队列声明下一个弹出元素是最需要的元素(优先级最高)
PriortyQueue<Integer> pq = new PriortyQueue<Integer>();
在PriortyQueue队列上使用offer()方法来插入对象时,这个对象会在队列中被排序。默认的排序将使用对象在队列中的自然顺序,但可以通过Comparator来修该这个顺序。PriortyQueue还可以保证当你调用peek()、poll()、和remove()方法时,获取的元素是队列中优先级最高的。
Stack
栈:指后进先出的容器。LinkedList具有能够实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用。
八:迭代器(Iterator)
迭代器是一个对象,它的工作是遍历并选择序列中的对象。创建它的代价小,适用于Set及List集合(foreach语法也适用collection)。Java中的迭代器(Iterator)只能单向移动,且只能用来:
- 使用Iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
- 使用next()获得容器的下一个元素
- 使用hasNext()检查序列中是否还有元素
- 使用remove()将迭代器新近返回的元素删除(在调用remove()方法前必须先调用next()方法)
List<String> list = new ArrayList<String>();
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s =it.next();
System.out.println("s :"+s);
}
ListIterator
ListIterator是Iterator的子类型,只能用于各种List类的访问。
特点:
- 可以双向移动
- 还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引
- 并且可以使用set()方法替换它访问过的最后一个元素
List<String> list = new ArrayList<String>();
Iterator<String> it = list.ListIterator();
while(it.hasNext()){
String s =it.next();
System.out.println("s :"+s);
it.set("用于替换");
}