List集合

柔光的暖阳◎ 2024-03-23 17:14 175阅读 0赞

List是Java集合框架中最常用的集合类型之一,它允许我们存储有序的元素集合,通过索引可以轻松访问和操作这些元素。 List是一个接口,Java提供了多个实现List接口的类,如ArrayList、LinkedList和Vector等。 在本文中,我们将详细讨论List集合和它的子类,从浅入深介绍这些子类的特点、应用场景和底层实现原理。

一、List集合的基本概念

List集合介绍

List是一个接口,它继承自Collection接口。 List表示的是一个元素有序的集合,可以根据插入顺序或其他某个规则来存储元素。 List还提供了访问下标、添加、删除、查询等常规操作。这些操作受到集合的大小、容量、对内存的影响等多个因素的影响,因此我们需要在使用时选择具体的子类。

List的底层实现可以是数组或链表。对于数组实现的List,元素的插入和删除是相对耗时的操作,因为需要进行数组的移位操作。而对于链表实现的List,插入和删除则可以达到O(1)的时间复杂度。

List集合

List集合内置方法

1. add(E e)

public boolean add(E e)

添加元素到List集合末尾。

示例代码:

  1. List<String> list = new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. list.add("C");
  5. System.out.println(list); // 输出 [A, B, C]

2. add(int index, E element)

public void add(int index, E element)

在指定位置插入元素。

示例代码:

  1. List<String> list = new ArrayList<>();
  2. list.add(1, "A");
  3. list.add("B");
  4. list.add(0, "C");
  5. System.out.println(list); // 输出 [C, A, B]

3. get(int index)

public E get(int index)

获取指定位置的元素。

示例代码:

  1. List<String> list = new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. String element = list.get(0);
  5. System.out.println(element); // 输出 A

4. set(int index, E element)

public E set(int index, E element)

修改指定位置的元素。

示例代码:

  1. List<String> list = new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. list.set(0, "C");
  5. System.out.println(list); // 输出 [C, B]

5. remove(int index)

public E remove(int index)

删除指定位置的元素。

示例代码:

  1. List<String> list = new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. list.remove(0);
  5. System.out.println(list); // 输出 [B]

6. size()

public int size()

获取List集合中元素的个数。

示例代码:

  1. List<String> list = new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. int size = list.size();
  5. System.out.println(size); // 输出 2

7. indexOf(Object o)

public int indexOf(Object o)

查找元素在List集合中第一次出现的位置。如果没有找到,则返回-1。

示例代码:

  1. List<String> list = new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. int index = list.indexOf("B");
  5. System.out.println(index); // 输出 1

8. lastIndexOf(Object o)

public int lastIndexOf(Object o)

查找元素在List集合中最后一次出现的位置。如果没有找到,则返回-1。

示例代码:

  1. List<String> list = new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. list.add("A");
  5. int index = list.lastIndexOf("A");
  6. System.out.println(index); // 输出 2

9. subList(int fromIndex, int toIndex)

public List<E> subList(int fromIndex, int toIndex)

获取List集合中指定范围内的子集合。

示例代码:

  1. List<String> list = new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. list.add("C");
  5. List<String> subList = list.subList(1, 3);
  6. System.out.println(subList); // 输出 [B, C]

10. clear()

public void clear()

清空List集合中的所有元素。

示例代码:

  1. List<Integer> list = new ArrayList<>();
  2. list.add(1);
  3. list.add(2);
  4. list.clear();
  5. System.out.println(list); // 输出 []

11. isEmpty()

public boolean isEmpty()

判断List集合是否为空。

示例代码:

  1. List<Integer> list1 = new ArrayList<>();
  2. List<Integer> list2 = new ArrayList<>();
  3. System.out.println(list1.isEmpty()); // 输出 true
  4. System.out.println(list2.isEmpty()); // 输出 true

12. contains(Object o)

public boolean contains(Object o)

判断List集合中是否包含指定元素。

示例代码:

  1. List<String> list = new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. System.out.println(list.contains("B")); // 输出 true
  5. System.out.println(list.contains("C")); // 输出 false

13. toArray()

public Object[] toArray()

将List集合转换成数组。

示例代码:

  1. List<Integer> list = new ArrayList<>();
  2. list.add(1);
  3. list.add(2);
  4. Object[] arr = list.toArray();
  5. System.out.println(Arrays.toString(arr)); // 输出 [1, 2]

14. toArray(T[] a)

public <T> T[] toArray(T[] a)

将List集合转换成指定类型的数组。

示例代码:

  1. List<Integer> list = new ArrayList<>();
  2. list.add(1);
  3. list.add(2);
  4. Integer[] arr = new Integer[2];
  5. Integer[] result = list.toArray(arr);
  6. System.out.println(Arrays.toString(result)); // 输出 [1, 2]

15. addAll(Collection<? extends E> c)

public boolean addAll(Collection<? extends E> c)

将另一个Collection集合中的所有元素添加到List集合末尾。

示例代码:

  1. ArrayList<String> list1 = new ArrayList<>();
  2. list1.add("A");
  3. list1.add("B");
  4. ArrayList<String> list2 = new ArrayList<>();
  5. list2.add("C");
  6. list2.add("D");
  7. list1.addAll(list2);
  8. System.out.println(list1); // 输出 [A, B, C, D]

16. addAll(int index, Collection<? extends E> c)

public boolean addAll(int index, Collection<? extends E> c)

将另一个Collection集合中的所有元素插入到List集合中的指定位置。

示例代码:

  1. ArrayList<String> list1 = new ArrayList<>();
  2. list1.add("A");
  3. list1.add("B");
  4. ArrayList<String> list2 = new ArrayList<>();
  5. list2.add("C");
  6. list2.add("D");
  7. list1.addAll(1, list2);
  8. System.out.println(list1); // 输出 [A, C, D, B]

除了以上方法,List集合还可以使用iterator()方法返回一个迭代器,支持遍历访问所有元素,并且可以使用ListIterator来实现遍历和修改List集合的操作。

List集合下方法

二、ArrayList

ArrayList是List接口的一个实现类。它使用数组来实现元素的存储,支持快速随机访问。 ArrayList是线程不安全的,如果需要在多线程环境下操作,则应该使用线程安全的Vector或者提供了同步机制的ArrayList,称为Synchronized ArrayList。

1、ArrayList的特点

  • 数据以数组形式存储,数据的添加和删除速度较慢;
  • 能够随机访问某个位置的元素,可以通过数组下标来访问元素;
  • 支持快速插入,插入一个元素只需要将需要插入的元素插入到指定的下标即可。若需要在中间位置插入,则会移动后面所有元素一个单位;
  • 可以根据元素内容快速查询其在List中的位置;
  • 遍历ArrayList的速度较快;
  • 存储元素时不需要考虑空间问题,因为ArrayList的容量是动态扩展的。

2、ArrayList的适用场景

  • 强调随机访问与遍历,适用于需要快速访问和遍历所有元素的场景;
  • 可以根据元素位置快速访问,适用于需要随机访问某个位置元素的场景;
  • 元素的内容较为复杂或对象较大,避免使用LinkedList的引用传递操作。

3、ArrayList的底层实现

ArrayList使用数组实现元素的存储和访问。当ArrayList中的元素数量超出容量时,它会新建一个容量更大的数组,并将原来的数组中的元素复制到新的数组中,然后释放老数组。 在ArrayList中插入元素时,如果插入的位置不在ArrayList底层数组中,则需要调整数组大小,而在数组末尾插入元素或删除元素性能较好。因此,在ArrayList中频繁的插入和删除元素时,那么效率较低。

ArrayList底层实现

ArrayList底层使用数组实现,其扩容和添加、修改、删除数据的底层代码如下:

1. 扩容:

当ArrayList的数组长度不够时,需要对数组进行扩容。代码如下:

  1. private void ensureCapacity(int minCapacity) {
  2. // 获取当前数组长度
  3. int oldCapacity = elementData.length;
  4. // 如果需要扩容
  5. if (minCapacity > oldCapacity) {
  6. // 新的容量为原来的1.5倍+1
  7. int newCapacity = (oldCapacity * 3) / 2 + 1;
  8. // 如果新容量仍然小于所需容量,则直接使用所需容量
  9. if (newCapacity < minCapacity)
  10. newCapacity = minCapacity;
  11. // 复制原数组到新数组中
  12. elementData = Arrays.copyOf(elementData, newCapacity);
  13. }
  14. }

2. 添加数据:

在ArrayList中添加数据时,需要先判断是否需要扩容,然后将元素添加到数组末尾。代码如下:

  1. public boolean add(E e) {
  2. // 判断是否需要扩容
  3. ensureCapacity(size + 1);
  4. // 将元素添加到数组末尾
  5. elementData[size++] = e;
  6. return true;
  7. }

3. 修改数据:

在ArrayList中修改数据时,直接在指定位置上修改即可。代码如下:

  1. public E set(int index, E element) {
  2. // 检查索引是否越界
  3. rangeCheck(index);
  4. // 获取旧值
  5. E oldValue = elementData(index);
  6. // 在指定位置上修改元素
  7. elementData[index] = element;
  8. // 返回旧值
  9. return oldValue;
  10. }

4. 删除数据:

在ArrayList中删除数据时,需要先将要删除的元素覆盖掉,然后将后面的元素向前移动。代码如下:

  1. public E remove(int index) {
  2. // 检查索引是否越界
  3. rangeCheck(index);
  4. // 获取旧值
  5. E oldValue = elementData(index);
  6. // 覆盖要删除的元素
  7. int numMoved = size - index - 1;
  8. if (numMoved > 0)
  9. System.arraycopy(elementData, index + 1, elementData, index,
  10. numMoved);
  11. // 将最后一个元素设为null,便于垃圾回收
  12. elementData[--size] = null;
  13. return oldValue;
  14. }

总结:ArrayList底层使用数组实现,扩容和添加、修改、删除数据的底层代码主要涉及数组长度的修改、元素的添加、修改和删除等操作。使用数组实现可以快速地访问数组中的元素,但是也存在数组长度固定、扩容时需要重新分配数组等缺点。

4、ArrayList的方法

  1. add(E e): 将元素e添加到ArrayList的末尾。
  2. add(int index, E element): 将元素element添加到指定的index位置。
  3. addAll(Collection<? extends E> c): 将集合c中的所有元素添加到ArrayList的末尾。
  4. addAll(int index, Collection<? extends E> c): 将集合c中的所有元素添加到指定的index位置。
  5. clear(): 清空ArrayList中的所有元素。
  6. clone(): 复制ArrayList并返回一个新的ArrayList对象。
  7. contains(Object o): 判断ArrayList中是否包含元素o。
  8. ensureCapacity(int minCapacity): 增加ArrayList的容量,使其能够容纳minCapacity个元素。
  9. get(int index): 返回指定index的元素。
  10. indexOf(Object o): 返回元素o在ArrayList中第一次出现的位置。
  11. isEmpty(): 判断ArrayList是否为空。
  12. iterator(): 返回ArrayList中元素的迭代器。
  13. lastIndexOf(Object o): 返回元素o在ArrayList中最后出现的位置。
  14. remove(int index): 删除指定index位置的元素。
  15. remove(Object o): 删除ArrayList中第一个出现的元素o。
  16. removeAll(Collection<?> c): 删除ArrayList中包含在集合c中的所有元素。
  17. retainAll(Collection<?> c): 保留ArrayList中与集合c中相同的所有元素。
  18. set(int index, E element): 将指定index位置的元素替换为element。
  19. size(): 返回ArrayList中元素的数量。
  20. subList(int fromIndex, int toIndex): 返回ArrayList中从fromIndex到toIndex位置的子列表。
  21. toArray(): 将ArrayList转换为一个数组,并返回该数组。
  22. toArray(T[] a): 将ArrayList转换为一个数组,并返回该数组。如果指定的数组a足够大,则将元素存入a中,否则创建一个新的数组来存储元素。

三、LinkedList

LinkedList是List接口的另一个实现类,它使用链表来实现元素存储。相对于ArrayList,LinkedList对于元素的添加和删除操作比较快。

1、LinkedList的特点

  • 数据以链表形式存储,因此支持快速添加和删除元素;
  • 不支持随机访问元素,只能通过指针遍历链表;
  • 可以在链表的任意一端添加和删除元素;
  • 根据元素内容查询其在链表中的位置速度较慢;
  • 存储元素时需要考虑空间问题,因为LinkedList会为每一个元素生成一个Node对象。

2、LinkedList的适用场景

  • 需要频繁地添加、删除元素,并且不需要快速随机访问元素的场景;
  • 存储元素数量不大,不会占用过多的空间;
  • 原始数据类型较小或元素内容较简单,可以直接使用Object存储。

3、LinkedList的底层实现

LinkedList底层使用双向链表实现,每个节点都包含前驱节点和后继节点。插入元素时,需要调整前驱节点和后继节点指针,删除元素时也需要修改前驱节点和后继节点指针。LinkedList也允许我们通过指针遍历链表,即从头节点或尾节点往后或往前遍历。
LinkedList

LinkedList底层添加数据,修改数据和删除数据的代码如下:

  1. 添加数据:

    //在添加数据时,首先会创建一个新节点,然后将该节点链接到链表的末尾。如果链表为空,则将该节点作为链表的头节点(first),否则将该节点作为链表的尾节点(last)的后继节点(next)。

    1. public boolean add(E e) {
    2. linkLast(e);
    3. return true;
    4. }
    5. void linkLast(E e) {
    6. final Node<E> l = last;
    7. final Node<E> newNode = new Node<>(l, e, null);
    8. last = newNode;
    9. if (l == null)
    10. first = newNode;
    11. else
    12. l.next = newNode;
    13. size++;
    14. }
  2. 修改数据:

    //在修改数据时,首先会检查给定的索引是否合法,然后获取该索引对应节点(Node)的item值(即原来的数据),将其替换为新的数据(element),最后返回原来的数据。

    1. public E set(int index, E element) {
    2. checkElementIndex(index);
    3. Node<E> x = node(index);
    4. E oldVal = x.item;
    5. x.item = element;
    6. return oldVal;
    7. }
  3. 删除数据:

    //在删除数据时,首先会检查给定的索引是否合法,然后获取该索引对应节点(Node)的item值(即要删除的数据),然后将该节点从链表中断开,使它的前驱节点(prev)指向它的后继节点(next),同时它的后继节点(next)指向它的前驱节点(prev)。如果该节点是头节点,则将它的后继节点作为新的头节点(first),如果该节点是尾节点,则将它的前驱节点作为新的尾节点(last)。最后将该节点的item值设置为null,缩小链表的size,返回被删除的数据。

    1. public E remove(int index) {
    2. checkElementIndex(index);
    3. return unlink(node(index));
    4. }
    5. E unlink(Node<E> x) {
    6. // assert x != null;
    7. final E element = x.item;
    8. final Node<E> next = x.next;
    9. final Node<E> prev = x.prev;
    10. if (prev == null) {
    11. first = next;
    12. } else {
    13. prev.next = next;
    14. x.prev = null;
    15. }
    16. if (next == null) {
    17. last = prev;
    18. } else {
    19. next.prev = prev;
    20. x.next = null;
    21. }
    22. x.item = null;
    23. size--;
    24. return element;
    25. }

4、LinkedList的方法

  1. add(E e):向链表尾部添加元素e。时间复杂度为O(1)。
  2. add(int index, E element):在指定位置插入元素element。时间复杂度为O(n)。
  3. addFirst(E e):在链表头部插入元素e。时间复杂度为O(1)。
  4. addLast(E e):在链表尾部插入元素e。时间复杂度为O(1)。
  5. clear():清空链表中的所有元素。
  6. get(int index):获取指定位置的元素。时间复杂度为O(n)。
  7. getFirst():获取链表头部的元素。时间复杂度为O(1)。
  8. getLast():获取链表尾部的元素。时间复杂度为O(1)。
  9. indexOf(Object o):返回指定元素o在链表中第一次出现的位置。时间复杂度为O(n)。
  10. remove():删除链表头部的元素。时间复杂度为O(1)。
  11. remove(int index):删除指定位置的元素。时间复杂度为O(n)。
  12. removeFirst():删除链表头部的元素。时间复杂度为O(1)。
  13. removeLast():删除链表尾部的元素。时间复杂度为O(1)。
  14. set(int index, E element):将指定位置的元素替换为element。时间复杂度为O(n)。
  15. size():获取链表中元素的个数。
  16. Object[] toArray(): 将LinkedList转换成一个Object类型的数组返回。
  17. <T> T[] toArray(T[] a): 将LinkedList转换成一个指定类型的数组返回。
  18. boolean add(E e): 将元素e添加到LinkedList的末尾。
  19. void add(int index, E element): 将元素element添加到LinkedList的index位置。
  20. boolean addAll(Collection<? extends E> c): 将集合c中的所有元素添加到LinkedList的末尾。
  21. boolean addAll(int index, Collection<? extends E> c): 将集合c中的所有元素添加到LinkedList的index位置。
  22. void clear(): 删除LinkedList中的所有元素。
  23. boolean contains(Object o): 判断LinkedList中是否包含元素o。
  24. Iterator<E> descendingIterator(): 返回一个逆序遍历的Iterator。
  25. E element(): 返回LinkedList的第一个元素。
  26. E get(int index): 返回LinkedList中指定位置的元素。
  27. int indexOf(Object o): 返回LinkedList中第一次出现元素o的位置。
  28. boolean isEmpty(): 判断LinkedList是否为空。
  29. Iterator<E> iterator(): 返回一个正序遍历的Iterator。
  30. int lastIndexOf(Object o): 返回LinkedList中最后一次出现元素o的位置。
  31. ListIterator<E> listIterator(): 返回一个正序遍历的ListIterator。
  32. ListIterator<E> listIterator(int index): 返回一个从指定位置开始正序遍历的ListIterator。
  33. E peek(): 返回LinkedList的第一个元素,如果LinkedList为空则返回null。
  34. E peekFirst(): 返回LinkedList的第一个元素,如果LinkedList为空则抛出NoSuchElementException异常。
  35. E peekLast(): 返回LinkedList的最后一个元素,如果LinkedList为空则返回null。
  36. E poll(): 删除并返回LinkedList的第一个元素,如果LinkedList为空则返回null。
  37. E pollFirst(): 删除并返回LinkedList的第一个元素,如果LinkedList为空则抛出NoSuchElementException异常。
  38. E pollLast(): 删除并返回LinkedList的最后一个元素,如果LinkedList为空则返回null。
  39. void push(E e): 将元素e压入LinkedList的头部。
  40. E pop(): 删除并返回LinkedList的头部元素。
  41. E remove(): 删除并返回LinkedList的第一个元素,如果LinkedList为空则抛出NoSuchElementException异常。
  42. E remove(int index): 删除并返回LinkedList中指定位置的元素。
  43. boolean remove(Object o): 删除LinkedList中第一次出现的元素o。
  44. boolean removeAll(Collection<?> c): 删除LinkedList中所有属于集合c的元素。
  45. boolean retainAll(Collection<?> c): 保留LinkedList中属于集合c的元素,删除其他元素。
  46. E set(int index, E element): 将LinkedList中指定位置的元素替换为element。
  47. int size(): 返回LinkedList中包含的元素个数。
  48. List<E> subList(int fromIndex, int toIndex): 返回一个从fromIndex到toIndex之间的子List。
  49. boolean linkBefore(Object[] src, int srcPos, int srcEnd, int dstIndex): 将src数组中从srcPos到srcEnd之间的元素插入到LinkedList中dstIndex位置之前。

50.Node<E> node(int index):获取指定位置的节点。

代码实现如下:

  1. private Node<E> node(int index) {
  2. // 判断index是否越界
  3. if (index < 0 || index >= size) {
  4. throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
  5. }
  6. // 如果index小于size的一半,从头部开始遍历
  7. if (index < (size >> 1)) {
  8. Node<E> x = first;
  9. for (int i = 0; i < index; i++)
  10. x = x.next;
  11. return x;
  12. // 如果index大于等于size的一半,从尾部开始遍历
  13. } else {
  14. Node<E> x = last;
  15. for (int i = size - 1; i > index; i--)
  16. x = x.prev;
  17. return x;
  18. }
  19. }
  1. void linkBefore(E e, Node<E> succ):在指定节点前插入元素e。代码实现如下:

    private void linkBefore(E e, Node succ) {

    // 获取succ的前驱节点

    1. final Node<E> pred = succ.prev;

    // 创建一个新节点

    1. final Node<E> newNode = new Node<>(pred, e, succ);

    // 将新节点插入到succ和pred之间

    1. succ.prev = newNode;
    2. if (pred == null)
    3. first = newNode;
    4. else
    5. pred.next = newNode;
    6. size++;
    7. modCount++;

    }

  2. E unlink(Node<E> x):删除指定节点x。代码实现如下:

    private E unlink(Node x) {

    // 获取x的前驱节点和后继节点

    1. final E element = x.item;
    2. final Node<E> next = x.next;
    3. final Node<E> prev = x.prev;

    // 将prev和next连接

    1. if (prev == null) {
    2. first = next;
    3. } else {
    4. prev.next = next;
    5. x.prev = null;
    6. }
    7. if (next == null) {
    8. last = prev;
    9. } else {
    10. next.prev = prev;
    11. x.next = null;
    12. }
    13. x.item = null;
    14. size--;
    15. modCount++;
    16. return element;

    }

四、Vector

Vector是List接口的另一个实现类,通过Vector可以实现线程安全的集合操作。但是,由于Vector在同步时使用了synchronized关键字,因此它的性能比ArrayList要低。

1、Vector的特点

  • 数据以数组形式存储;
  • 可以随机访问某个位置的元素,可以通过数组下标来访问元素;
  • 支持快速插入,插入一个元素只需要将需要插入的元素插入到指定的下标即可。若需要在中间位置插入,则会移动后面所有元素一个单位;
  • 可以根据元素内容快速查询其在List中的位置;
  • 遍历Vector的速度较快;
  • 在多线程的情况下,支持线程安全。

2、Vector的适用场景

  • 适用于需要多线程操作的场景,实现线程安全的操作;
  • 需要快速访问指定位置的元素,适用于需要随机访问元素的场景;
  • 避免在Vector中插入、删除元素,因为这样会导致ArrayList数据重新分配空间的问题。

3、Vector的底层实现

Vector和ArrayList比较相似,不同于ArrayList,Vector在每个本地方法调用时使用了synchronized关键字来保证多线程访问的线程安全性。在其他方面,Vector与ArrayList大致相同。

4、Vector下方法

  1. add(Object o):将一个对象添加到Vector的尾部,并返回true。
  2. add(int index, Object o):将一个对象插入到指定位置,并返回true。
  3. addAll(Collection c):将一个集合中的所有元素添加到Vector的尾部,并返回true。
  4. addAll(int index, Collection c):将一个集合中的所有元素插入到指定位置,并返回true。
  5. clear():清空Vector中的所有元素,并返回void。
  6. clone():创建Vector的副本,并返回Object。
  7. contains(Object o):判断Vector中是否包含指定的元素,并返回boolean。
  8. containsAll(Collection c):判断Vector中是否包含指定集合中的所有元素,并返回boolean。
  9. copyInto(Object[] anArray):将Vector中的元素复制到指定的数组中,并返回void。
  10. elementAt(int index):返回指定位置的元素。
  11. elements():返回一个枚举器,用于遍历Vector中的元素。
  12. ensureCapacity(int minCapacity):确保Vector的容量至少是指定值,并返回void。
  13. equals(Object o):比较Vector与指定对象是否相等。
  14. firstElement():返回Vector中的第一个元素。
  15. get(int index):返回指定位置的元素。
  16. hashCode():返回Vector的哈希码值。
  17. indexOf(Object o):返回指定元素在Vector中第一次出现的位置。
  18. indexOf(Object o, int index):返回指定元素在Vector中从指定位置开始第一次出现的位置。
  19. insertElementAt(Object o, int index):将一个元素插入到指定位置,并返回void。
  20. isEmpty():判断Vector是否为空。
  21. lastElement():返回Vector中的最后一个元素。
  22. lastIndexOf(Object o):返回指定元素在Vector中最后一次出现的位置。
  23. lastIndexOf(Object o, int index):返回指定元素在Vector中从指定位置开始最后一次出现的位置。
  24. remove(int index):删除指定位置的元素,并返回被删除的元素。
  25. remove(Object o):删除指定的元素,并返回boolean。
  26. removeAll(Collection c):删除所有在指定集合中出现的元素,并返回boolean。
  27. removeElement(Object o):删除指定的元素,并返回void。
  28. removeElementAt(int index):删除指定位置的元素,并返回void。
  29. retainAll(Collection c):将Vector中不在指定集合中出现的元素全部删除,并返回boolean。
  30. set(int index, Object o):将指定位置的元素设置为指定值,并返回被替换的元素。
  31. setElementAt(Object o, int index):将指定位置的元素设置为指定值,并返回void。
  32. setSize(int newSize):设置Vector的大小,若新大小比原大小小,则删除后面的元素;若新大小比原大小大,则用null补齐,并返回void。
  33. size():返回Vector中元素的个数。
  34. subList(int fromIndex, int toIndex):返回包含指定范围内的元素的列表。
  35. toArray():将Vector中的元素复制到一个数组中,并返回Object[]。
  36. toArray(T[] a):将Vector中的元素复制到指定类型的数组中,并返回T[]。

Vector类是线程安全的,因此不需要在多线程环境下进行同步,但是相对于ArrayList来说性能会降低一些。如果需要处理大量数据或多线程并发操作,建议使用ArrayList或CopyOnWriteArrayList等其他集合类。


五、总结

List是Java集合框架中最常用的集合类型之一,提供了有序的集合、随机访问、元素添加和删除等常规操作。 Java提供了多个实现List接口的类,如ArrayList、LinkedList和Vector。 在使用时,我们需要根据具体的业务场景和需求选择适合的具体实现。

在数据量较小,需要随机访问元素或进行遍历操作时,ArrayList是一个较好的选择。但是,如果需要频繁插入或删除元素,则LinkedList是比较好的选择。如果我们需要线程安全的操作,则使用Vector即可。

总之,List集合相比其他集合类型,具有较高的灵活性和可扩展性,能够满足我们在不同的业务场景中的需要。

发表评论

表情:
评论列表 (有 0 条评论,175人围观)

还没有评论,来说两句吧...

相关阅读

    相关 List集合

    一、list集合介绍: ![82fbb494afcdf3b9ee11beeb7727dbc2.png][] 在Collection中,List集合是有序的,可对其中每个元素

    相关 List集合

    List是Java集合框架中最常用的集合类型之一,它允许我们存储有序的元素集合,通过索引可以轻松访问和操作这些元素。 List是一个接口,Java提供了多个实现List接口的类

    相关 集合---List

    1.集合主要用于存储类的对象 Collection下有三个子接口,分别是List、 Queue和set,List和 Queue中可以存储有序且重复的数据,Set中存储的数

    相关 List集合

    介绍 > List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。Lis