Collection总体概述
在书写程序的时候,我们常常需要对大量的对象引用进行管理。为了实现有效的归类管理,我们常常将同类的引用放置在同一数据容器中由于数据容器中存放了我们随时可能需要使用到的对象引用,所以一般的数据容器要都要能能提供方便的查询、遍历、修改等基本接口功能。
之所以需要容器:早期的OOP语言都通过数组的方式来实现对引用集的集中管理和维护。但是数组方式下,数组大小需要提前被确定,并不允许修改大小,导致其作为一种灵活的数据容器的能力的功能大为下降。为了方便的利用数据容器进行引用的管理,Java中提供了丰富的数据容器以满足程序员多样化的需求。
容器与数组的区别与联系:
- 容器不是数组,不能通过下标的方式访问容器中的元素
- 数组的所有功能通过Arraylist容器都可以实现,只是实现的方式不同
- 如果非要将容器当做一个数组来使用,通过toArraylist方法返回的就是一个数组
而在java中的容器有如下的结构:
通过上图我们可以了解,Collection接口的两个子接口Set,List:
- Set中的数据无序不可重复
- List中的数据有序可重复
而collection中定义的常用方法如下所示:
public class{
boolean add(Object obj); //向容器中添加指定的元素
Iterator iterator(); //返回能够遍历当前集合中所有元素的迭代器
Object[] toArray(); //返回包含此容器中所有元素的数组。
Object get(int index); //获取下标为index的那个元素
Object remove(int index); //删除下标为index的那个元素
Object set(int index,Object element); //将下标为index的那个元素置为element
Object add(int index,Object element); //在下标为index的位置添加一个对象element
boolean containsAll(Collection c); //集合是否包含另一集合C中所有对象
boolean addAll(Collection c); //另一集合C所有对象放到集合中
boolean removeAll(Collection c); //把集合中所有在另一集合C中也存在的对象移除
boolean retainAll(Collection c); //交集
int size(); //返回容器中的元素数
}
List接口一般使用为ArrayList、LinkedList和Vector,它们之间的关系如下:
ArrayList:底层用数组实现的List,线程不安全,效率高,查询效率高,增删效率低,不安全。
LinkedList:底层是双向链表实现的List,线程不安全,效率高,查询效率低,增删效率高,线程不安全。
- Vector:底层用数组实现的List,线程安全,效率低。
Set接口实现类HashSet:采用哈希算法实现的Set。HashSet的底层是用HashMap实现的,因此查询效率较高,由于采用hashCode算法直接确定元素的内存地址,增删效率也挺高的