java.util.Collection是集合类的一个顶级接口,它提供了操作集合对象的通用接口方法,包含了集合的基本操作和属性,直接继承接口有List与Set。
List
List接口及其实现类是容量可变的列表,可按索引访问集合中的元素。
特点:集合中的元素有序、可重复;
List接口一共有三个实现类,分别是ArrayList、LinkedList和Vector。
1.ArrayList
ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。它和Vector本质上都可以看做是一个可以自动增长容量的数组,即当数组长度不够的时候,会定义一个更大的数组,并把之前的数组拷贝到新的数组里面,但是ArrayList和Vector的扩展数组的大小不同。
当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动,代价较高。因此,它适合随机查找和遍历,不适合插入和删除。
它提供的功能类似Vector类但是它不支持线程的同步。
ArrayList操作
添加:
List list = new ArrayList();
// 在列表的尾部追加元素
list.add("咩");
// 在列表的头部追加元素
list.add(0, "咩");
// 追加指定 collection 中的所有元素到列表结尾
list.addAll(new ArrayList());
查询:
// 返回列表中指定位置的元素
list.get(0);
// 返回列表中的元素数
list.size();
// 返回列表中索引为0到2的元素
list.subList(0,2);
// 将list直接转为Object[] 数组后返回
list.toArray();
// 将list转化为需要类型的数组
list.toArray(T[] a);
// 返回列表的哈希值,hascode实际上是返回的对象存储的物理地址
list.hashCode();
// 返回列表中首次出现指定元素的索引(不包含此元素,则返回-1)
list.indexOf("咩");
// 返回列表中最后出现指定元素的索引(不包含此元素,则返回-1)
list.lastIndexOf("咩");
// 如果列表包含指定的元素,则返回true
list.contains("咩");
// 如果列表包含指定collection的所有元素,则返回true
list.containsAll(new ArrayList());
// 比较指定的对象与列表是否相等
list.equals(new ArrayList());
// 如果列表不包含元素,则返回 true
list.isEmpty();
更新:
// 移除列表中的所有元素
list.clear();
// 移除列表中指定索引的元素
list.remove(0);
// 移除列表中出现的首个指定元素
list.remove("咩");
// 从列表中移除指定 collection 中包含的所有元素
list.removeAll(new ArrayList());
// 用指定元素替换列表中指定位置的元素
list.set(0, "咩");
遍历:
List list = new ArrayList();
list.add("咩");
list.add("喵");
//对列表进行遍历操作
Iterator<String> item = list.iterator();
while (item.hasNext()) {
String str = item.next();
System.out.println(str);
}
2.LinkedList
LinkedList是用链表结构存储数据的,适合数据元素的动态插入和删除,随机访问和遍历速度比较慢。它提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
LinkedList操作
List linkList = new LinkedList();
list.add("咩");
list.add("喵");
//对列表进行遍历操作
ListIterator linkItem = linkList.listIterator();
// 判断迭代器中是否有下一个元素
while (linkItem.hasNext()) {
String str = linkItem.next();
System.out.println(str);
}
3.Vector
Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性。
Vector在内存不够时默认是扩展1倍,ArrayList默认是扩展50% + 1个。
Vector提供indexOf(obj, start)接口,ArrayList没有。
Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。
Set
Set是一个不允许有重复元素的集合。
Set的实现类有HastSet和TreeSet。HashSet依赖于HashMap,实际上通过HashMap实现,是无序的;TreeSet依赖于TreeMap,实际上通过TreeMap实现,是有序的。
特点:集合中的元素不按特定方式排序,只是简单的把对象加入集合中。对Set中成员的访问和操作是通过Set中对象的引用进行的,所以集合中不能有重复对象。
1.HastSet
Set集合中元素都必须是唯一的,HashSet作为其子类也需保证元素的唯一性。
元素唯一性是通过元素的hashCode和equals方法来判断的:
1) 如果对象的hashCode值不同,那么不用调用equals方法就会将对象直接存储到集合中;
2) 如果对象的hashCode值相同,那么需调用equals方法判断返回值是否为true。若为true, 则视为相同元素,不会存储。若为false, 则视为不同元素,会直接存储。
如果要使用HashSet存储元素,该元素的类必须覆盖hashCode方法和equals方法。
HashSet主要方法
add(Object) //添加元素
addAll(Collection) //添加collection中的所有元素
remove(object) //移除元素
removeAll(Collection) //移除collection中的所有元素
size() //返回所有元素的个数
iterator() //遍历
toArray() //转换为数组
clear() //清空
isEmpty() //判断是否为空
contain(object) //判断是否包含元素
containAll(Collection) //判断是否包含collection中的所有元素
2.TreeSet
TreeSet是一个有序集合,可以按照任何顺序将元素插入该集合,当对该集合进行迭代时,各个值将自动以排序后的顺序出现。TreeSet中的元素按照升序排列,缺省是按照自然顺序进行排序,意味着TreeSet中的元素要实现Comparable接口,或者有一个自定义的比较器Comparator。
TreeSet与HashSet的区别在于,TreeSet会自动按自然排序法给元素排序,即1排在2前,a排在b前,但是HashSet是根据元素的hashCode自动给元素排序的.如果我们不需要使用排序功能,应该使用HashSet,因为其性能优于TreeSet。