JAVA容器
JAVA容器
一、容器体系结构
java.util
二、迭代器Iterator<E>
迭代器是一种设计模式,可以遍历并选择序列中的对象,而开发人员并不需要了解该序列的底层结构。迭代器通常被称为”轻量级”对象,因为创建它的代价小。
JAVA的Iterator<E>功能比较简单,并且只能单向移动。
相对Iterator而言,for()循环遍历的速度较快点。而Iterator则比较通用,且序列的内部状态都由Iterator维护。
函数 |
功能 |
hasNext() |
检查序列下一个元素是否存在。 |
next() |
获取序列下一个元素。 |
remove() |
将迭代器新返回的元素删除。 |
|
|
实例:
public class ArrayToList {
static void printList(List<String> list){
for(String e : list)
System.out.print(" " + e);
System.out.println();
}
public static void main(String[] args) {
String[] strs = {"xue", "ma", "xiong", "feng", };
//方法一
List<String> strList = Arrays.asList(strs);
ArrayToList.printList(strList);
//方法二
List strList1 = new ArrayList<String>(strs.length);
for(String e : strs)
strList1.add(e);
ArrayToList.printList(strList1);
//方法三
List strList2 = new ArrayList();
Collections.addAll(strList2, strs);
ArrayToList.printList(strList2);
}
}
运行结果:
元素:xue
数组:[ma, xiong, feng]
元素:ma
数组:[xiong, feng]
元素:xiong
数组:[feng]
元素:feng
数组:[]
三、类集Collection<E>
与C++STL类似。Collection所有容器类都必须实现的接口。
所有通用的Collection实现类都应该提供两个“标准”构造方法:一个是void(无参)构造方法,用于创建空的Collection;另一个是带有Collection类型单参数的构造方法,用于创建一个具有与参数相同元素的新的collection。
函数 |
参数 |
功能 |
add |
(E e) |
确保此 collection 包含指定的元素(末尾)。 |
addAll |
(Collection<? extends E> c) |
将指定 collection 中的所有元素都添加到此 collection 中(末尾)。 |
clear |
|
移除此 collection 中的所有元素(可选操作)。 |
contains |
(Object o) |
如果此 collection 包含指定的元素,则返回 true。 |
containsAll |
(Collection<?> c) |
如果此 collection 包含指定 collection 中的所有元素,则返回 true。 |
equals |
(Object o) |
比较此 collection 与指定对象是否相等。 |
hashCode |
|
返回此 collection 的哈希码值。 |
isEmpty |
|
如果此 collection 不包含元素,则返回 true。 |
iterator |
|
返回在此 collection 的元素上进行迭代的迭代器。 |
remove |
(Object o) |
从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 |
removeAll |
(Collection<?> c) |
移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 |
retainAll |
(Collection<?> c) |
仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 |
size |
(Collection<?> c) |
返回此 collection 中的元素数。 |
toArray |
|
返回包含此 collection 中所有元素的数组。 |
toArray |
(T[] a) |
返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 |
|
|
|
应用实例:
public class TestCollection {
public static void main(String[] args) {
Collection collection = new ArrayList();
Collection<String> collection1 = new ArrayList<String>();
//向容器中加入对象
collection.add( "Hello");
collection1.add( "Hello");
collection.add(new Integer(1));
//collection1.add(new Integer(1));
Object obj = new Object();
collection.add(obj);
//collection1.add(obj);
//size返回collection中的元素数
System.out.println("容器的长度:"+collection.size());
System.out.println("容器:"+collection.toString());
System.out.println("容器1:"+collection1.toString());
//转换为数组
Object[] object = collection.toArray();
//未进行类型转换
System.out.println("第一个元素是:"+object[0]);
//移除容器中制定的对象
collection.remove(obj);
System.out.println("容器:"+collection.toString());
//清空容器中的对象
collection.clear();
System.out.println("容器的长度:"+collection.size());
System.out.println("容器:"+collection.toString());
}
}
运行结果:
容器的长度:3
容器:[Hello, 1, java.lang.Object@2de41d]
容器1:[Hello]
第一个元素是:Hello
容器:[Hello, 1]
容器的长度:0
容器:[]
注:在本例中也体系了泛型的好处。第一个容器没有使用泛型,可以向其添加不同类型的数据。第二个容器使用了泛型,只能向其添加String类型数据。
四、序列List<E>
是有序的Collection。程序员可以对列表中每个元素的插入位置进行精确地控制,也可以根据元素的整数索引访问元素,并搜索列表中的元素。
列表允许存在重复的元素。List 提供了 4 种对列表元素进行定位(索引)访问方法。List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。
List除了继承Collection的方法外,扩展了如下方法:
函数 |
参数 |
功能 |
add |
(int index, E element) |
在列表的指定位置插入指定元素 |
addAll |
(int index, Collection<? extends E> c) |
将指定 collection 中的所有元素都插入到列表中的指定位置 |
get |
(int index) |
返回列表中指定位置的元素。 |
indexOf |
(Object o) |
返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。 boolean isEmpty() |
lastIndexOf |
(Object o) |
返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。 |
listIterator |
|
返回此列表元素的列表迭代器(按适当顺序)。 |
listIterator |
(int index) |
返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。 |
remove |
(int index) |
移除列表中指定位置的元素 |
set |
(int index, E element) |
用指定元素替换列表中指定位置的元素 |
subList |
(int fromIndex, int toIndex) |
返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图 |
|
|
|
五、动态数组ArrayList<E>
ArrayList是Array的复杂版本。提供:动态地增加和减少数组的元素;灵活设置数组的大小。
每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。
在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。
ArrayList继承了List的方法外,其扩展了如下方法:
函数 |
参数 |
功能 |
ArrayList |
|
构造一个初始容量为 10 的空列表。 |
ArrayList |
(Collection<? extends E> c) |
构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。 |
ArrayList |
(int initialCapacity |
构造一个具有指定初始容量的空列表。 |
clone |
|
返回此 ArrayList 实例的浅表副本。 |
ensureCapacity |
(int minCapacity) |
如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。 |
removeRange |
(int fromIndex, int toIndex) |
移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。 |
trimTosize |
|
将此 ArrayList 实例的容量调整为列表的当前大小。 |
|
|
|
六、链表LinkedList<E>
LinkedList<E>是一种双向的链式结构。相对ArrayList而言,LinkedList<E>的插入和删除元素相对方便,但速度较慢。
除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
LinkedList继承了List的方法外,其扩展了如下方法:
函数 |
方法 |
功能 |
LinkedList |
|
构造一个空列表。 |
LinkedList |
(Collection<? extends E> c) |
构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列。 |
addFirst |
(E e) |
将指定元素插入此列表的开头。 |
addLast |
(E e) |
将指定元素插入此列表的结尾。 |
clone |
|
返回此 LinkedList 的浅表副本。 |
descendingIterator |
|
返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。 |
element |
|
获取但不移除此列表的头(第一个元素)。 |
getFirst |
|
返回此列表的第一个元素。 |
getLast |
|
返回此列表的最后一个元素。 |
lastIndexOf |
|
返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。 |
listIterator |
(int index) |
返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。 |
offer |
(E e) |
将指定元素添加到此列表的末尾 |
offerFirst |
(E e) |
在此列表的开头插入指定的元素。 |
offerLast |
(E e) |
在此列表末尾插入指定的元素。 |
peek |
|
获取但不移除此列表的头 |
peekFirst |
|
获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。 |
peekLast |
|
获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。 |
poll |
|
获取并移除此列表的头(第一个元素) |
pollFirst |
|
获取并移除此列表的第一个元素;如果此列表为空,则返回 null。 |
pollLast |
|
获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。 |
pop |
|
将元素推入此列表所表示的堆栈。 |
push |
(E e) |
将元素推入此列表所表示的堆栈。 |
removeFirst |
|
移除并返回此列表的第一个元素。 |
removeFirstOccurrence |
(Object o) |
从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)。 |
|
|
|
七、集合Set<E>
Set和数学中的集合是同一个概念,就是没有重复元素的集合,是一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。
Set继承Collection的所有方法,没有扩展了其他方法。
八、映射Map<K , V>
Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。
所有通用的映射实现类应该提供两个“标准的”构造方法:一个 void(无参数)构造方法,用于创建空映射;一个是带有单个 Map 类型参数的构造方法,用于创建一个与其参数具有相同键-值映射关系的新映射。实际上,后一个构造方法允许用户复制任意映射,生成所需类的一个等价映射。
Map继承Collection的所有方法,并扩展了其他方法:
函数 |
参数 |
功能 |
containsKey |
(Object key) |
如果此映射包含指定键的映射关系,则返回 true。 |
containsValue |
(Object key) |
如果此映射将一个或多个键映射到指定值,则返回 true。 |
entrySet |
|
返回此映射中包含的映射关系的 Set 视图。 |
keySet |
|
返回此映射中包含的键的 Set 视图。 |
put |
(K key, V value) |
将指定的值与此映射中的指定键关联。 |
putAll |
(Map<? extends K,? extends V> m) |
从指定映射中将所有映射关系复制到此映射中. |
values |
|
返回此映射中包含的值的 Collection 视图。 |
|
|
|
九、队列Queue<E>
Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素。
Queue继承Collection的所有方法,并扩展了其他方法:
函数 |
参数 |
方法 |
element |
|
获取,但是不移除此队列的头。 |
offer |
(E e) |
将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。 |
peek |
|
获取但不移除此队列的头;如果此队列为空,则返回 null。 |
poll |
|
获取并移除此队列的头,如果此队列为空,则返回 null。 |
remove |
|
获取并移除此队列的头。 |
|
|
|
|
|
|