Java 集合——Collection类
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。
语法
public interface Collection<E> extends Iterable<E> {}
它是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等。
方法
- boolean add(E e) :确保此 collection 包含指定的元素(可选操作)。
- boolean addAll(Collection c) :将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
- void clear() :移除此 collection 中的所有元素(可选操作)。
- boolean contains(Object o) : 如果此 collection 包含指定的元素,则返回 true。
- boolean containsAll(Collection c) :如果此 collection 包含指定collection 中的所有元素,则返回 true。
- boolean equals(Object o) : 比较此 collection 与指定对象是否相等。
- int hashCode() : 返回此 collection 的哈希码值。
- boolean isEmpty()
:如果此 collection 不包含元素,则返回 true。 - Iteratoriterator()
:返回在此 collection 的元素上进行迭代的迭代器。 - boolean remove(Object o) : 从此 collection中移除指定元素的单个实例,如果存在的话(可选操作)。
- boolean removeAll(Collection c) : 移除此 collection 中那些也包含在指定collection 中的所有元素(可选操作)。
- boolean retainAll(Collection c) : 仅保留此 collection 中那些也包含在指定collection 的元素(可选操作)。
- int size() : 返回此 collection 中的元素数。
- Object[] toArray() : 返回包含此 collection 中所有元素的数组。
- T[] toArray(T[] a) : 返回包含此 collection中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
iterator接口
不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。iterator方法如下:
- boolean hasNext() 如果仍有元素可以迭代,则返回 true。
- E next() 返回迭代的下一个元素。
- void remove() 从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。
Iterator实例
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}
继承体系
Collection
- |-----List 有序(存储顺序和取出顺序一致),可重复
- |----ArrayList ,线程不安全,底层使用数组实现,查询快,增删慢,效率高
- |----LinkedList , 线程不安全,底层使用链表实现,查询慢,增删快,效率高。
- |----Vector , 线程安全,底层使用数组实现,查询快,增删慢,效率低。
- |-----Set 元素唯一一个不包含重复元素的 collection。并且最多包含一个 null 元素。
- |–HashSet 底层是由HashMap实现的,通过对象的hashCode方法与equals方法来保证插入元素的唯一性,无序(存储顺序和取出顺序不一致),。
- |–LinkedHashSet 底层数据结构由哈希表和链表组成。哈希表保证元素的唯一性,链表保证元素有序。(存储和取出是一致)
- |–TreeSet 基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set时提供的 Comparator 进行排序,具体取决于使用的构造方法。 元素唯一。
Collection包含了List和Set两大分支:
1)、List是一个有序的队列,每一个元素都有它的索引,第一个元素的索引值是0。List的实现类有LinkedList、ArrayList、Vector和Stack。
(1)、LinkedList实现了List接口,允许元素为空,LinkedList提供了额外的get,remove,insert方法,这些操作可以使LinkedList被用作堆栈、队列或双向队列。
LinkedList并不是线程安全的,如果多个线程同时访问LinkedList,则必须自己实现访问同步,或者另外一种解决方法是在创建List时构造一个同步的List。
(2)、ArrayList 实现了可变大小的数组,允许所有元素包括null,同时ArrayList也不是线程安全的。
(3)、Vector类似于ArrayList,但Vector是线程安全的。
(4)、Stack继承自Vector,实现一个后进先出的堆栈。
2)、set是一个不允许有重复元素的集合。set的实现类有Hashset和Treeset。HashSet依赖于HashMap,实际上是通过HashMap实现的;TreeSet依赖于TreeMap,通过TreeMap来实现的。
总结
- (1)如果涉及到堆栈,队列等操作,应该考虑用List;对于需要快速插入,删除元素,应该使用LinkedList;如果需要快速随机访问元素,应该使用ArrayList。
- (2)如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高;如果多个线程可能同时操作一个类,应该使用同步的类。
- (3)要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
- (4)尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
例子
public class CollectionReview {
public static void main(String[] args) {
test1();
}
private static void test1() {
Collection<String> collection = new Vector<>();
collection.add("gogogo");
collection.add("pap");
collection.add("niko");
collection.add("kitty");
Collection<String> coll = new ArrayList<>();
coll.add("niko");
coll.add("kitty");
coll.add("pecuyu");
// collection.clear(); // 清空集合
//System.out.println(collection.isEmpty()); // 集合是否为空
// int size = collection.size(); // 获取集合大小
// System.out.println(size);
// boolean contains = collection.contains("niko"); // 是否包含另一个元素
// System.out.println(contains);
//boolean containsAll = collection.containsAll(coll); //是否完全包含另一个集合
//System.out.println(containsAll);
// collection.remove("kitty"); // 删除第一个匹配项,删除了匹配项则返回true
// boolean removeAll = collection.removeAll(coll); // 删除与指定集合有交集的部分,原集合有改变就返回true
// System.out.println(removeAll);
//boolean retainAll = collection.retainAll(coll);// 保留与指定集合有交集的部分,原集合有改变就返回true
//System.out.println(retainAll);
// iterator 迭代器, 方式1
Iterator<String> iterator = collection.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
System.out.println("\n"+"-------------------");
// 方式2 ,for循环完iterator1就会被销毁,节约内存提高效率
for (Iterator<String> iterator1 = collection.iterator(); iterator1.hasNext(); ) {
System.out.print(iterator1.next()+" ");
}
System.out.println("\n"+"-------------------");
Object[] array = collection.toArray(); // 转化为object数组
for (Object string : array) {
System.out.print(string+" ");
}
System.out.println("\n"+"-------------------");
String[] arr=new String[collection.size()];
String[] array2 = collection.toArray(arr); // 指定要转化的数组类型
for (String string : array2) {
System.out.print(string+" ");
}
}
Java Collection遍历
该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}