容器的作用
首先我们开门见山,说一下什么是容器。日常生活中的容器,比如箱子、盒子等,是用来存放我们的日常用品的,Java中的容器与此类似,也是用来存放东西的,即程序中的对象。
你可能会问:在Java中为什么非要使用容器呢?Java中的数组也可以用来存放对象,而且使用数组还非常的方便。
如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构,使用数组就足够了。
然而,一般情况下,我们并不知道要创建多少对象,或者以何种方式创建对象。数组显然只能创建固定长度的对象,为了使程序变得更加灵活与高效,Java类库提供了一套完整的容器类,具备完善的方法来解决上述问题。
容器的类别
容器主要分为两种类型: Collection 和 Map 。Collection用以保存单一的元素,Map保存关联键值对。具体的层次结构如下图所示:

Collection下有两个子接口,分别是List和Set。List的特点是:元素有序、可重复。Set的特点是元素无序、不可重复。这个两个接口下又有很多的实现类,常见的几个如上图所示。
Map有很多实现类,常用的几个如上图所示。
Collection实现类用法总结
ArrayList
ArrayList 是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。
下面列出一些常用的方法:
方法 | 方法简介 |
---|---|
add(Object obj); |
插入一个对象 |
add(int i,Object obj); |
在指定位置插入对象 |
addAll(Conllection c); |
将容器c中的对象添加进来 |
addAll(int i,Collection c); |
将容器c中的对象添加到指定位置 |
set(int i,Object newObj); |
修改指定位置的对象 |
remove(int i); |
将指定位置的对象从容器中移除,但是该对象没有被删除 |
removeAll(Collection c); |
将容器c中的对象从容器中全部删除 |
remove(Object obj); |
将对象从容器中移除,但是该对象没有被删除 |
clear() |
将容器中的对象全部移除 |
get(int i) |
获取指定索引出的对象 |
contains(Object obj) |
查询列表中是否包含指定对象,包含返回true |
containsAll(Collection c) |
查询列表中是否包含指定的多个元素,全部包含返回true |
indexOf(Object obj) |
查询指定元素第一次出现的下标,返回下标索引,没有钙元素返回-1 |
lastIndexOf(Object obj) |
查询指定元素最后一次出现的下标,返回下标索引,没有钙元素返回-1 |
isEmpty() |
判断列表是否为空,为空返回true |
iterator() |
返回一个迭代器,可以用来遍历list,后面会讲到 |
LinkedListList
LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用。有以下特点:
- 与ArrayList对比,LinkedList插入和删除操作更加高效,随机访问速度慢;
- 可以作为栈、队列、双端队列数据结构使用;
- 非同步,线程不安全;
- 与ArrayList、Vector一样,LinkedList的内部迭代器存在“快速失败行为”;
- 支持null元素、有顺序、元素可以重复;
下面列出一些常用的方法:
方法 | 方法简介 |
---|---|
LinkedList() |
构造一个空链表 |
LinkedList(Collection col) |
复制一个容器 |
add(Object obj); |
插入一个对象 |
add(int i,Object obj); |
在指定位置插入对象 |
getFirst() |
获取第一个元素 |
getLast() |
获取最后一个元素 |
subList(int fromIndex, int toIndex) |
从链表中子表,返回的类型是List类型 |
addFirst() |
链表头部添加元素 |
addLast() |
链表尾部添加元素 |
removeFirst() |
移除链表的第一个元素 |
removeLast |
移除链表的最后一个元素 |
clear() |
清空链表中的元素 |
Vector
Vector 可实现自动增长的对象数组。
java.util.vector提供了向量类(Vector)以实现类似动态数组的功能。
创建了一个向量类的对象后,可以往其中随意插入不同类的对象,即不需顾及类型也不需预先选定向量的容量,并可以方便地进行查找。
对于预先不知或者不愿预先定义数组大小,并且需要频繁地进行查找,插入,删除工作的情况,可以考虑使用向量类。
因为Vector中的方法和前面的ArrayList、LinkedList类似,这里就不一一列举。
Collection容器的遍历
使用迭代器进行遍历
迭代器(iterator)有时又称为游标(cursor),提供一种方法遍历容器内的各个元素,而又不暴露容器中的内部细节。迭代器是为遍历容器而生,用以方便的实现对容器内元素的遍历操作。下面提供几个实例:
使用迭代器遍历ArrayList
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
public class TestArrayList {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Date());
list.add(1, "fengzhen");
list.add(666);
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
使用迭代器遍历LinkedList
import java.util.Iterator;
import java.util.LinkedList;
public class TestLinkedList {
public static void main(String[] args) {
LinkedList list01 = new LinkedList();
list01.add("fengzhen");
list01.add("Tom");
list01.addFirst("Jack");
list01.add("Jane");
list01.add("Kim");
Iterator iterator01 = list01.iterator();
while (iterator01.hasNext()) {
System.out.println(iterator01.next());
}
}
}
使用迭代器遍历Vector
import java.util.Iterator;
import java.util.Vector;
public class TestVector {
public static void main(String[] args) {
Vector v = new Vector();
v.add("fengzhen");
v.add(5555);
v.add(1, 6);
Iterator i = v.iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
}
}
使用增强for循环进行遍历
使用增强for循环进行遍历也可以对Collection容器进行遍历,实例如下:
for (Object item : list) {
System.out.println(item);
}
Map实现类用法总结
Map接口是java定义的一种键值对映射的数据结构接口,其实现类有四种:HashMap、LinkedHashMap、
Hashtable、TreeMap。
HashMap
Hashmap是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是 完全随机的 。
HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null(HashSet的实现就是在hashmap的值为空的情况下)。
HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
下面给出一些HashMap常用的方法:
方法 | 方法简介 |
---|---|
put(key, value) |
添加键值对元素 |
get(key) |
去的键对应的值 |
isEmpty() |
是否为空 |
containsKey() |
是否含有键 |
containsValue() |
是否含有值 |
remove(key) |
删除该键对应的元素 |
remove(key, value) |
删除该键值对对应的元素 |
keySet() |
输出所有的键 |
values() |
输出所有的值 |
LinkedHashMap
LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。
也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
LinkedHashMap的常用方法与HashMap的方法基本无异,这里就不一一列出,多看看源码进行学习。
Map容器的遍历
Map容器的遍历有很多方法,这里主要列出了使用迭代器进行遍历的方法:
import java.util.*;
public class TestHashMap {
public static void main(String[] args) {
HashMap myMap = new HashMap();
myMap.put("a", "fengzhen");
myMap.put("b", "Jack");
myMap.put("c", 666);
myMap.put("d", new Date());
/**
* 方法一:使用迭代器遍历
*/
Iterator mapIterator01 = myMap.entrySet().iterator();
while (mapIterator01.hasNext()) {
System.out.println(mapIterator01.next());
}
/**
* 方法二:使用的迭代器另一种方式遍历
*/
Iterator mapIterator02 = myMap.entrySet().iterator();
while (mapIterator02.hasNext()) {
Map.Entry entry = (Map.Entry) mapIterator02.next();
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
}
}
网友评论