集合复习之List

集合大致分为两种,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。

猜你喜欢

转载自blog.csdn.net/lei133691/article/details/81461673
今日推荐