集合大致分为两种,Collection接口实现类的子类与Map接口实现类的子类。
Collection接口中定义了一些方法,其实现类的子类常用这些类。
Collection接口定义的方法:
size、isEmpty、add、remove、equals、hashcode、clear//清空集合元素、toArray//将集合转化为数组、iterator//返回一个Iterator接口实现类的对象
contains(Object o)//判断是否包含传入的参数,判断依据:equals方法
如果存入集合中的元素是自定义类的对象,要求:该类要重写equals方法
retainAll(Collection c)//两个集合中相同的元素返回给调用的集合**
addAll(Conllection c)、containsAll(Conllection c)//一个集合是否包含传入集合的所有元素、removeAll(Collection c)//从集合中删除与c共有的元素
Collection接口的子接口:List 、Set
我们在选择集合类型时,应该根据集合的特性进行选择:
List:有序,且可以重复
Set:无序,不能重复
List由于其有序的特性,在Collection的基础上新增了一些与索引有关的方法。
List相对于Collection新增的方法:
void add(int index, E element);
boolean addAll(int index, Collection<? extends E> c);
E get(int index);
E remove(int index);//删除之后后边的元素往前顶
E set(int index, E element);//直接将下标为index的元素改为element,然后返回旧的元素
int indexOf(Object o);//元素o第一次出现的下标
int lastIndexOf(Object o);//元素o最后一次出现的下标
List<E> subList(int fromIndex, int toIndex);//截取。左包含右不包含
List有三个实现类:
ArrayList 、 LinkedList 、Vector
ArrayList:底层实现是数组
源码:transient Object[] elementData;//在集合中添加的元素都会在这个数组中进行存储。
但是ArrayList比起数组,不同之处就在于ArrayList的长度是可变的,那是因为在ArrayList底层的实现中,当数组长度不足以进行存储的时候,elementData数组会扩容,下边是ArrayList源码中的一个方法,可以证实这一结论。
源码:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
LinkedList:底层实现是双端链表
在LinkedList类中有内部类Node(由于Node对象有next与prev,所以底层实现是双端链表):
源码:private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
由于LinkedList实现了一些可以对第一个元素和最后一个元素进行操作的方法,所以LinkedList经常被用作栈、队列等数据结构。
比较ArrayList与LinkedList性能上的优缺点:
ArrayList:底层实现是数组,是一块连续的内存,所以遍历效率高,但缺点是插入的时候效率低。
LinkedList:底层实现是双端链表,由于链表的特性,插入或删除的时候只需要改变Node对象的属性,所以插入删除时有很高的效率。遍历的时候效率低于ArrayList。