Java容器-List和Set

来源:互联网 发布:写简谱的软件 编辑:程序博客网 时间:2024/05/29 12:51

1 List

List接口是Collection接口的子接口,从其名称可以看出,是一个元素有序(并不是按大小排序,具有顺序索引,类似于数组),默认按照元素的添加顺序设置元素的索引。可分为ArrayList、LinkedList和Vector。List集合特有的迭代器:ListIterator(是Iterator的子接口)

1.1 ArrayList

ArrayList底层通过数组实现,是线程非安全的,查询速度快,添加删除比较慢,初始长度为10,可根据添加/删除元素动态改变大小。

    //在指定索引处增加元素    public void add(int index, E element) {        //检查索引是否在数组大小范围内        rangeCheckForAdd(index);        //确保添加一个元素后,元素个数不会超过数组大小,如果超过了则动态增加数组大小        ensureCapacityInternal(size + 1);  // Increments modCount!!        //把从index开始的元素后移一位        System.arraycopy(elementData, index, elementData, index + 1,                         size - index);        elementData[index] = element;        size++;    }
//存储空间增加 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);  }
    private static int hugeCapacity(int minCapacity) {        if (minCapacity < 0) // overflow            throw new OutOfMemoryError();        return (minCapacity > MAX_ARRAY_SIZE) ?            Integer.MAX_VALUE :            MAX_ARRAY_SIZE;    }

1.2 LinkedList

LinkedList实现了List接口,底层通过链表实现,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList 可被用作堆栈(stack),队列(queue)或双向队列(deque)
注意LinkedList没有同步方法,线程非安全。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(…));

1.3 Vector

底层通过数组实现,线程安全的,增删查都比较慢。Vector还提供了Stack子类,实现了“栈”这一数据结构。因此Stack也是线程安全的,性能较差,可以通过使用LinkedList来实现栈。

0 0
原创粉丝点击