本文介绍: ArrayList是一种动态数组,它实现了List接口。ArrayList可以根据需要自动调整大小,可以存储任意类型的对象。ArrayList提供了一系列的方法,可以方便地对其中的元素进行添加、删除、查找和遍历操作。与普通的数组相比,ArrayList的大小是可变的,并且可以自动处理底层数组的扩容和缩容。使用ArrayList能够方便地操作和管理一系列对象的集合。LinkedList实现了Java的List接口,因而可以像其他List实现类一样使用。它也实现了Deque接口,因而可以作为双端队列使用。

目录

List集合

1.1 概述

1.2 特点

1.3 常用方法

1.4 ArrayList集合


List集合

        java.util.List:List是一个接口,它继承自Collection接口。常用的实现类有ArrayList和LinkedList。使用List接口的好处是可以将代码与具体的实现类解耦,从而提高代码的灵活性和可维护性。

  1. 有序的集合,存储元素和取出元素的顺序是一致的(存储123,取出123)。
  2. 有索引,包含了一些带索引的方法 。
  3. 允许存储重复的元素 。

        List接口继承Collection接口,因而Collection中常用的方法List也可使用。这里主要列举一些List个性化的方法(带索引方法的使用)。List接口不能直接创建对象,需要采用多态形式创建 其 实现类对象,才能使用。

方法:

  • void add(int index,E element):将E,添加到该集合中的index处。
  • E get(int index):返回集合中index的E。
  • E remove(int index):移除列表中index的E,返回的是被移除的E。
  • E set(int index,E element):用E替换集合中index的E,返回值是更新前的E。
  • int indexOf(E element):返回集合中E的index,没有找到返回-1。

        

说明:

        E:集合元素,集合中具体的值。

        index:指定位置,集合的索引值。

        

注意事项:操作索引的时候,一定要防止索引越界异常:

  • IndexOutOfBoundsException:索引越界异常,集合会报。
  • ArrayIndexOutOfBoundsException:数组索引越界异常。
  • StringIndexOutOfBoundsException:字符串索引越界异常。

        java.util.ArrayList:ArrayList是一种动态数组,它实现了List接口。ArrayList可以根据需要自动调整大小,可以存储任意类型的对象。ArrayList提供了一系列的方法,可以方便地对其中的元素进行添加、删除、查找和遍历操作。与普通的数组相比,ArrayList的大小是可变的,并且可以自动处理底层数组的扩容和缩容。使用ArrayList能够方便地操作和管理一系列对象的集合。

源代码: 

package com.zhy.coll;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestArrayList {
    public static void main(String[] args) {
        //创建一个集合<泛型为String类型>,多态写法,接口引用 指向 实现类对象
        List<String> list = new ArrayList<String>();

        //往集合中添加元素
        list.add("elememt1");
        list.add("elememt2");
        list.add("elememt3");

        //打印集合
        System.out.println("初始化集合:" + list);

        //1.将指定元素,添加到该集合的指定位置上
        list.add(1,"elementNew");
        System.out.println("在索引1插入元素:" + list);

        //2.返回集合中指定位置的元素
        String nameE = list.get(0);
        System.out.println("返回索引0的元素:" + nameE);

        //3.移除集合中指定位置的元素,返回的是被移除的元素
        String removeE = list.remove(2);
        System.out.println("移除索引2的元素,返回的是被移除的元素:" + removeE);

        //4.用指定元素替换集合中指定位置的元素,返回的是更新前的元素
        String beforeE = list.set(0,"elementUpdate");
        System.out.println("用新元素替换掉索引0的元素,返回的是更新前索引0的元素:" + beforeE);

        //5.返回集合中指定元素的索引,找不到返回-1
        int indexE = list.indexOf("elementOld");
        System.out.println("返回(elementOld)的索引:" + indexE);

        //使用迭代器遍历List集合
        System.out.print("使用迭代器遍历List集合:");
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            String tempE = iterator.next();
            System.out.print(tempE + " ");
        }
    }
}

输出结果:

        java.util.LinkedList:LinkedList实现了Java的List接口,因而可以像其他List实现类一样使用。它也实现了Deque接口,因而可以作为双端队列使用。另外,LinkedList还实现了Queue接口,因而可以作为队列使用。

  • LinkedList是Java中的一种数据结构,它是一个双向链表,每个节点包含了数据本身以及指向前一个节点和后一个节点的引用
  • LinkedList不需要预先指定容量,可以根据需要动态地增加或减少元素。
  • LinkedList允许快速插入和删除元素,因为只需要调整节点的引用,而不需要像数组那样移动元素。
  • 访问和搜索元素的性能较差,因为需要从头或尾开始遍历链表。

        使用LinkedList集合特有的方法,不能使用多态。

  • void addFirst(E e):将指定元素插入此列表的开头。
  • void addLast(E e):将指定元素添加到此列表的结尾。
  • void push(E e):将元素推入此列表所表示的堆栈。
  • E getFirst():返回此列表的第一个元素。
  • E getLast():返回此列表的最后一个元素。
  • E removeFirst():移除并返回此列表的第一个元素。
  • E removeLast():移除并返回此列表的最后一个元素。
  • E pop():从此列表所表示的堆栈出弹出一个元素。

源代码:

package com.zhy.coll;

import java.util.LinkedList;

public class TestLinkedList {
    public static void main(String[] args) {
        //创建LinkedList对象
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("Annie");
        linkedList.add("Bob");
        linkedList.add("Tom");
        System.out.println("初始化LinkedList集合:" + linkedList);

        //返回此列表的第一个元素
        String fistE = linkedList.getFirst();
        System.out.println("列表的第一个元素为:" + fistE);

        //返回此列表的最后一个元素
        String lastE = linkedList.getLast();
        System.out.println("列表的最后一个元素为:" + lastE);

        //将指定元素插入此列表的开头
        linkedList.addFirst("Lisa");
        System.out.println("在列表开头插入元素:" + linkedList);

        //将指定元素添加到此列表的结尾
        linkedList.addLast("Carl");
        System.out.println("在列表末尾插入元素:" + linkedList);

        //移除并返回此列表的第一个元素
        linkedList.removeFirst();
        System.out.println("移除第一个元素:" + linkedList);

        //移除并返回此列表的最后一个元素
        linkedList.removeLast();
        System.out.println("移除最后一个元素:" + linkedList);

        //将元素推入此列表所表示的堆栈
        linkedList.push("Dick");
        System.out.println("在栈首添加元素:" + linkedList);

        //从列表所表示的堆栈出弹出一个元素
        linkedList.pop();
        System.out.println("将栈首的元素弹出:" + linkedList);

        //使用增强for遍历列表
        System.out.print("使用增强for遍历列表:");
        for(String e : linkedList){
            System.out.print(e + " ");
        }
    }
}

输出结果:

        Vector类是Java中提供的一种动态数组实现。它是使用数组来存储元素的,并且可以根据需要自动调整数组的大小。Vector类提供了一系列方法来操作数组,例如添加元素、获取元素、删除元素等。Vector类还具有线程安全的特性,可以在多个线程同时访问和修改数组,以确保数据的一致性和安全性。因此,Vector类常用于需要在多线程环境下操作数组的场景中

源代码:

package com.zhy.coll;

import java.util.Iterator;
import java.util.Vector;

public class TestVector {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("element1");
        vector.add("element2");
        vector.add("element3");
        System.out.println("初始化集合:" + vector);

        vector.remove(0);
        System.out.println("移除第0个元素:" + vector);

        vector.set(0,"elementNew");
        System.out.println("修改第0个元素的值:" + vector);

        System.out.print("使用增强for遍历集合:");
        for (String name : vector){
            System.out.print(name + " ");
        }

        System.out.print("n使用迭代器遍历集合:");
        Iterator<String> iterator = vector.iterator();
        while(iterator.hasNext()){
            String ele = iterator.next();
            System.out.print(ele + " ");
        }
    }
}

输出结果: 

        ArrayList,LinkedList和Vector都是Java集合框架中的实现类,它们用于存储和操作集合数据。三者的异同如下:

相同点:

  • 都实现了List接口,都支持索引访问元素。
  • 都可以存储任意类型的对象。
  • 都具有动态扩容的能力。

不同点: 

  • ArrayList底层使用数组实现;LinkedList底层使用双向链表实现;Vector底层也使用数组实现。
  • ArrayList是非线程安全的;LinkedList和Vector是线程安全的。
  • ArrayList和LinkedList适用于随机访问和遍历;而Vector适用于需要线程安全性的场景。
  • ArrayList和LinkedList的插入和删除操作的性能取决于位置;ArrayList在尾部插入和删除元素效率高,而LinkedList在中间插入和删除元素效率高。
  • Vector相比ArrayList和LinkedList,性能较低,因为它需要进行同步(线程安全)操作。

        因此,选择ArrayList还是LinkedList或Vector取决于具体的需求。如果需要随机访问和遍历,且不需要线程安全,则选择ArrayList;如果需要频繁插入和删除元素,或需要线程安全,则选择LinkedList;如果需要线程安全且不考虑性能,则选择Vector

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注