JAVA集合类Collection浅析

java.util.Collection是集合类的一个顶级接口,它提供了操作集合对象的通用接口方法,包含了集合的基本操作和属性,直接继承接口有ListSet

List

List接口及其实现类是容量可变的列表,可按索引访问集合中的元素。

特点:集合中的元素有序、可重复;

List接口一共有三个实现类,分别是ArrayList、LinkedListVector

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的实现类有HastSetTreeSet。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。

猜你喜欢

转载自blog.csdn.net/j1231230/article/details/77894357