List和Set集合
一、Collection
- 定义
public interface Collection<E> extends Iterable<E>
java.util.Collection
是进行单对象保存的最大父接口,即每次利用 Collection
接口都只能保存一个对象信息。但是 Collection
使用了泛型,这样可以保证集合中的数据类型统一。
- 常用方法
编号 | 方法名称 | 描述 |
---|---|---|
1 | boolean add(E e); | 向集合添加数据 |
2 | boolean addAll(Collection<? extends E> c); | 追加一个集合 |
3 | void clear(); | 清空集合,根元素为null |
4 | boolean contains(Object o); | 判断是否包含指定的内容,需要equals()支持 |
5 | boolean isEmpty(); | 判断是否为空集合(不是null) |
6 | boolean remove(Object o); | 删除对象,需要equals()支持 |
7 | int size(); | 取得集合中保存的元素个数 |
8 | Object[] toArray(); | 将集合变为对象数组保存 |
9 | Iterator iterator(); | 为Iterator接口实例化(Iterator接口定义) |
注意:contains()与remove()两个方法的操作时,必须保证类中了已经成功的覆写了 Object
类中的 equals()
方法,否则将无法正常完成操作
Collection
接口存在一个问题,无法区分保存的数据是否重复,所以在开发中往往会使用两个子接口:List
和 Set
子接口。List
子接口保存的数据可以重复、是有顺序的 , Set
去除重复元素,无序的,重复元素会覆盖掉 。
二、List
List
的子类有 ArrayList
、LinkList
、Vector
。但是 Vector
不常用,就不在阐述。
List
子接口中保存的数据是可以重复的,并且在 Collection
子接口中,List
这个子接口是使用最多的。对 Collection
接口的功能进行了扩充。
- 扩充方法
编号 | 方法名称 | 描述 |
---|---|---|
1 | E get(int index); | 根据索引获取数据 |
2 | E set(int index, E element); | 修改制定索引的数据 |
3 | ListIterator listIterator(int index); | 为ListIterator接口实例化 |
2.1、ArrayList和LinkList的区别
2.1.1、底层实现区别
-
ArrayList
底层实现就是数组,且ArrayList
实现了RandomAccess
,表示它能快速随机访问存储的元素,通过下标index
访问,只是我们需要用get()
方法的形式, 数组支持随机访问, 查询速度快, 增删元素慢; -
LinkedList
底层实现是链表,LinkedList
没有实现RandomAccess
接口,链表支持顺序访问, 查询速度慢, 增删元素快 -
ArrayList
定义
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
LinkedList
定义
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
注意:这个问题面试问到的几率十分高
2.1.2、应用场景不同
ArrayList
应该在需要更多搜索操作的地方使用,并且LinkedList
应该在需要更多插入和删除操作的地方使用。
三、Set
Set
的常用的子类有 HashSet<E>
、TreeSet<E>
HashSet
是三列存放数据,TressSet
是有序存放数据。在开发中,如果使用 TressSet
子类,必须同时使用比较器的概念。HashSet
子类相对于 TressSet
子类容易一些,所以没有排序要求的,首先考虑 HashSet
子类。
四、List和Set的区别
1、List
中元素放入是有顺序的,可以重复。Set
去除重复元素,无序的,重复元素会覆盖掉。
2、Set
检索效率低,删除和插入效率高,插入和删除不会引起元素位置的改变;而List
和数组类似,可以动态增长,查找效率高,插入和删除效率低,会引起元素位置的改变。