集合的概述
Java中的集合像是一个容器,用来存储 Java 对象(实际上是对象的引用),这些对象可以是任意的数据类型,并且长度是可变的。集合都位于 java.util 包中。集合按照存储结构可以分为两大类,Collection集合与Map集合。
Collection 集合有两个重要的子接口,分别是 List 和 Set。List 集合的特点是元素有序,可重复;Set 集合的特点是元素无序,不可重复。这两个子接口下面是他们的实现类。
Collection 父接口
Collection 是所有单列集合的根接口,在 Collection 中定义了一些方法。
方法声明 | 功能描述 |
---|---|
boolean add(Object obj) | 向集合中添加一个元素 |
boolean addAll(Collection c) | 将一个集合中的所有元素添加到此集合中 |
void clear() | 清空此集合中的所有元素 |
boolean contains(Object o) | 检查此集合中是否包含某个元素 |
boolean equals(Object o) | 比较此集合是否与指定对象相等 |
boolean isEmpty() | 判断该集合是否为空 |
boolean remove(Object o) | 移除该集合中指定的元素 |
int size() | 获取该集合元素的个数 |
Object[] toArray() | 将该集合转换成数组 |
更多方法可查询 Java API 文档
List 集合
List 集合继承自 Collection 集合,将实现了 List 接口的对象称为 List 集合,在 List 集合中允许出现重复的元素,所有元素是以一种线性方式进行存储,可以通过索引来访问集合中的指定元素。List 作为 Collection 集合的子接口,不但继承了 Collection 接口中的全部方法,还增加了一些特有的方法。
方法声明 | 功能描述 |
---|---|
void add(int index,Object o) | 在列表的指定位置插入指定元素 |
boolean addAll(int index,Collection c) | 将集合中的所有元素添加到List集合的指定位置 |
Object get(int index) | 返回列表中指定位置的元素 |
int indexOf(Object o) | 返回对象o在List集合中首次出现的位置索引 |
int lastIndexOf(Object o) | 返回对象o在List集合中最后一次出现的位置索引 |
Object remove(int index) | 移除列表中指定位置处的元素 |
Object set(int index,Object o) | 返回用指定元素替换列表中指定位置的元素 |
List subList(int fromIndex,int toIndex) | 返回fromIndex(包括) 和toIndex(不包括) 之间的集合元素 |
List实现类—ArrayList 集合
ArrayList 是 List 接口的一个实现类,分析 ArrayList 源码可知,在 ArrayList 内部封装了一个长度可变的数组对象,存入 ArrayList 集合内的元素实际上是存入了它内部的数组中,当存入的元素超过数组长度时,ArrayList 会在内存中分配一个更大的数组来存储这些元素,所以说,可以将 ArrayList 集合看成一个长度可变的数组。 正是由于 ArrayList 内部的数据存储结构是数组形式,在增加或删除指定位置的元素时,会创建新的数组,效率比较低,不适合做大量的增删,但这种数据结构允许通过索引访问元素,所以,使用它遍历和查找元素时很高效。
ArrayList 实现类中,有一些构造方法
ArrayList() --无参构造,在jdk1.6之前是默认创建一个容量为10的空列表
jdk1.7改为创建容量为0的空列表,原因是如果不存入数据,会一直占用空间
ArrayList(int initialcapacity) --构造具有指定初始容量的空列表
List实现类—Vector 集合
Vector 类实现了可扩展的对象数组。像数组一样,它包含可以使用整数索引访问的组件。 Vector 的大小可以根据需要增长或缩小,以适应在创建 Vector 之后添加和删除项目。 它是在 jdk1.0的时候出现的,它的底层实现和 ArrayList 是几乎一样的,区别在于 Vector 是运行效率慢,线程安全的。
List实现类—LinkedList集合
为了克服在集合中增删元素时效率低的局限性,可以使用 LinkedList 集合。它是一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而将元素连接起来,它们仅需要记住自己前后的位置即可,LinkedList 类还为在列表的开头及结尾 get,remove 和 insert 元素提供了统一的命名方法,因为既然是链表,那么它的第一个,和最后一个元素,不管是查询,增加,删除,都是最快的。所以额外提供以下这些方法。
方法声明 | 功能描述 |
---|---|
void addFirst(Object o) | 将指定元素插入集合的开头 |
void addLast(Object o) | 将指定元素添加到集合的结尾 |
Object getFirst() | 返回集合的第一个元素 |
Object getLast() | 返回集合的最后一个元素 |
Object removeFirst() | 移除并返回集合的第一个元素 |
Object removeLast() | 移除并返回集合的最后一个元素 |
区别
ArrayList 集合查询快,增删慢,运行效率快,线程不安全(查询多,增删少的情况下使用)
vector 集合查询快,增删慢,运行效率慢,线程安全(基本不使用)
LinkedList 集合查询慢,增删快(增删多,查询少的情况下使用)