ArrayList、LinkdedList、Vector

本文详细分析了Java集合框架中的ArrayList和LinkedList。ArrayList基于数组实现,查询速度快但增删慢,适合查询频繁的场景;LinkedList采用双向链表结构,增删速度快但查询慢,适合增删操作多的场景。文章通过代码示例展示了这两个类的使用方法及源码分析,揭示了它们在内存管理和性能上的差异。
摘要由CSDN通过智能技术生成

List是一个接口,不能直接用来新建对象。我们需要使用List的子类才能创建实例对象

  • ArrayList:底层使用的数组结构,特点:查询快、增删慢
  • LinkedList:底层使用的是双向链表结构,特点是查询慢,增删快
  • Vector:实现原理和ArrayList一样,区别是Vector是线程安全的,效率低;ArrayList线程不安全,效率高

数组和ArrayList使用的最多,开发中大部分是从数据库里查询数据并返回给浏览器的情况

LinkedList 更加适合 增删多,但是查询较少的场景

这三个实现类,能够调用的方法是一样的,都可以调用

add(E e) / add(int index, E e) / remove(Object obj) / remove(int index) / clear()

get(int index) / set(int index,E e) / indexOf(Object e) / lastIndexOf(Object obj)

public class ListSource {
    public static void main(String[] args) {
        Vector<String> arrayList = new Vector<>();

        arrayList.add("hello");
        arrayList.add("good");
        arrayList.add(1, "yes");
        System.out.println(arrayList.get(0));
        arrayList.remove(1);
        arrayList.set(0, "ok");
        arrayList.clear();
    }
}

1. ArrayList

1. 1 ArrayList源码分析

ArrayList 底层就是维护了一个Object类型的数组成员变量 elementData,增删慢,但是查询快

常量:

  • int DEFAULT_CAPACITY=10; 如果不指定数组的长度,当调用add方法添加元素时,数组的默认长度为10;
  • Object[] EMPTY_ELEMENTDATA = {}; 如果不指定数组的长度,默认是一个空数组

成员变量:

  • Object[] elementData:ArrayList的核心,ArrayList里所有的数据都保存在这个数组里
  • int size:用来记录数组里元素的个数

构造方法:

  • ArrayList():空参构造方法,Object[] elementData 默认值是{}
  • ArrayList(int initialCapacity):有参构造,数组指定长度initialCapacity

方法:

  • add(E e):如果数组的长度为0,先初始化数组,长度设置为 DEFAULT_CAPACITY=10;

                如果存满了,容量扩充为原来的1.5倍,新建一个数组,并把原来的数据复制过去,elementData再指向新的数组,添加元素时,将元素放入到elementData数组的下标为size的位置上,然后再让size自增

  • add(int index,E e):
  • remove(int index):
public class ArrayListSource {
    public static void main(String[] args) {
        List<String> list2 = new ArrayList<>(10);
        List<String> list = new ArrayList<>();
        list.add("good");
        list.add("yes");
        list.add("ok");
        list.add("no");
        list.add("hi");
        list.add("hello");
        list.add("go");
        list.add("come");
        list.add("you");
        list.add(1, "she");
        list.add("here");

        list.remove(0);
    }
}

1.2 LinkedList 

LinkedList源码分析: 底层维护了一个双向链表结构,增删快,但是查询慢

LinkedList里存储的数据是 一个一个的 Node类型的对象

成员变量:

        int size = 0; 表示元素的个数

        Node<E> first; 表示first元素

        Node<E> last; 表示最后一个元素

构造方法:

        LinkedList():空参构造方法

        LinkedList(Collection<? extends E> collection):

常用方法:

        add(E e): 在最后添加元素

        add(int index,E e): 在指定位置插入元素

        remove(E e): 删除指定元素

        remove(int index): 删除指定位置上的元素

        get(int index): 查找指定位置上的元素

public class LinkedListSource {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();

        list.add("hello");
        list.add("good");
        list.add("yes");

        /*
         10个元素,找index为3的元素,从头开始找 0.next 1.next 2.next
            找 index 为8的元素,从最后一个找  9.prev
        */
        list.add(1,"ok");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值