零基础学JAVA--Day32(ArrayList底层+Vector+LinkedList)

ArrayList底层操作机制源码分析

1)ArrayList中维护了一个Object类型的数组elementData.

transient Object elementData;//transient表示瞬间,短暂的,表示该属性不会被序列化

2)当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为上次的1.5倍。

3)如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容则直接扩容elementData为原来的1.5倍。

Victor

基本介绍

1)继承了List和Collection类

2)Vector底层也是一个对象数组,protected Object elementData;

3)Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized

java 复制代码
public synchronized E get(int index){
    if (index >= elementCount);
    throw new ArraylndexOutOfBoundsException(index):
    return elementData(index);
}

4)在开发中,需要线程同步安全时,考虑使用Vector

Vector和ArryList比较

LinkedList


底层结构

1)LinkedList底层实现了双向链表和双端队列特点

2)可以添加任意元素(元素可以重复),包括null

3)线程不安全,没有实现同步

LinkedList的底层操作机制

1)LinkedList底层维护了一个双向链表

2)LinkedList中维护了两个属性first和last分别指向首节点和尾节点

3)每个节点(Node对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点。最终实现双向链表.

4)所以LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高。

一些方法

java 复制代码
package com.List;

import java.util.LinkedList;

public class LinkedListCRUD {
    @SuppressWarnings("all")
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();//底层维护的是一个双向链表

        //增
        linkedList.add(1);
        linkedList.add(2);
        linkedList.add(3);
        //删除
        linkedList.remove();//默认删除第一个元素
        linkedList.remove(1);//按索引
        linkedList.remove("1");//按元素
        //改
        linkedList.set(1,333);//第一个位置代表index,第二个位置是改成啥
        //查
        linkedList.get(1);//按索引查找
    }
}

ArrayList和LinkedList的比较

如何选择ArrayList和LinkedList

1)如果我们改查的操作多,选择ArrayList

2)如果我们增删的操作多,选择LinkedList

3)一般来说,在程序中,80%-90%都是查询,因此大部分情况下会选择ArrayList

4)在一个项目中,根据业务灵活选择,也可能这样,一个模块使用的是ArrayList,另外一个模块是LinkedList.

相关推荐
一木 之林2 分钟前
李沐《动手学深度学习》知识卡合集:从 Softmax 回归到房价实战(第24-50集)
开发语言·c++·人工智能
心中有你02142 分钟前
Java Swing实现校园最短路径导航系统(Dijkstra算法完整源码+详细解析)
java·开发语言·算法
Alphapeople5 分钟前
路径规划算法的python实现
开发语言·python·算法
重生之小比特6 分钟前
【Java SE】数组的定义与使用
java·开发语言
旋生万物11 分钟前
圈道裂痕——用 Python 验证素数分布的螺旋生成论判据
开发语言·python·数论·素数·cci·可计算数学
qeen8730 分钟前
【C++】智能指针介绍
开发语言·c++·笔记·指针
hanchenxing36 分钟前
本地AI绘画网关: 用 30 行 Python 把 NVIDIA FLUX.2 Klein 接入 OpenAI 兼容客户端Python
开发语言·python·ai作画·ai绘画·nvidia
摆烂z36 分钟前
定时任务同步数据--续跑&重试
java·mybatis·ai编程
CAE虚拟与现实1 小时前
docker desktop中的build功能是要build什么
java·docker·容器
PHP实战开发录2 小时前
PHP脚本手动能跑定时任务却失败
开发语言·php·开发