03_list

news2024/11/15 21:34:18

文章目录

  • list接口
    • list的API
    • listIterator方法
    • subList方法
  • ArrayList
    • ArrayList的源码阅读
  • LinkedList
  • Vector
  • Stack

在这里插入图片描述

list接口

特点

  • List是Collection的子接口,是描述数据存储的接口
  • 数据结构表现为线性表,可以通过下标来操作
  • 存储数据有序
  • 可以存储重复元素
  • 可以存储null

list的API

  • ListCollection的子接口。所有肯定有Collection的所有方法。
  • 相对于Collectionlist多了一种遍历的方法fori。(因为有了get(index)这种方法)
void add(int index, E element)// 在指定位置添加元素。list添加的位置,只能在[0,length]之间

boolean addAll(int index, Collection<? extends E> c)// 在指定位置添加一个Collection的所有元素

E remove(int index)// 删除指定下标的元素,只能删除下标的位置[0, length-1]。返回的是删除的元素

E set(int index, E element)// 设置指定下标的元素为element

E get(int index)// 获取指定下标元素

int indexOf(Object o)// 获取元素的首个index
// 如果这个元素不存在,就会返回-1

int lastIndexOf(Object o)// 获取元素的最后一个index

ListIterator<E> listIterator()ListIterator<E> listIterator(int index)
List<E> subList(int fromIndex, int toIndex)

面向接口编程
一般都是拿接口去接取对象,而不是拿实现类去接取对象,因为可以方便之后的替换。


listIterator方法

返回一个ListIterator的对象。这个与迭代器(只能向后移动)类似,只是可以前后移动,可以返回index。

  • 有参构造,返回的迭代器对象,调用next返回的是指定下标的元素。
    • 传入的index的范围是:[0,length]
public interface ListIterator<E> extends Iterator<E>

-------------------------------------------------------------
继承迭代器的方法:

boolean hasNext() : // 判断后面是否还有元素可以遍历

E next()    : // 向后遍历

void remove()   : // 删除刚刚遍历的数据

-------------------------------------------------------------
ListIterator的方法:

boolean hasPrevious(): // 向前是否可以遍历

E previous(): // 向前遍历

int nextIndex() : // 向后遍历的数据的下标

int previousIndex() : // 向前遍历的下标

void add(E e) : // 添加一个数据到当前遍历位置
// 1. zs  ls  ww
//       |
// 2. listIterator.add("zl");
//    zs  zl  ls  ww
//           |

void set(E e) : // 修改刚刚遍历过的元素位置
// 可以连续set
// 1. zs  ls  ww
//       |
// 2. listIterator.set("zl");
//    zl  ls  ww
//       |

:如果我们想逆序遍历,可以list.listIterator(list.size());


subList方法

  • 从原有的集合中截取一部分。
  • 返回值为[fromIndex , toIndex)
  • subList生成的一个映射。这个生成的subList操作就是对原有集合的操作
  • 会出现并发修改异常的问题。
    • 当生成了subList之后,如果再修改原集合。再访问subList的对象,会报错。

Q:subList是不是把原有的集合截取了一个,产生一个新的数组呢?
A:subList只是一个引用,只是一个地址。

在这里插入图片描述


ArrayList

特点

  • ArrayList是List的子实现
  • ArrayList数据结构表现为线性表
  • 底层结构是数组
  • 存储元素,有序
  • 可以存储重复元素
  • 可以存储null

构造方法

在这里插入图片描述
size()其实不是数组的大小,是存储元素的个数

ArrayList的API

Object clone()  // 返回此 ArrayList 实例的浅表副本。

void ensureCapacity(int minCapacity)
// 如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。

void trimToSize() // 将此 ArrayList 实例的容量调整为列表的当前大小。

注意事项

  • 浅表副本
    • String类型不能修改
      在这里插入图片描述
  • arrayList.ensureCapacity(10);
    • 其实就是比较传过来的数字和当前elementData的大小
      • 如果传过来的数字小,则不会做任何事情
      • 如果传过来的数字大,会把数组长度变大

ArrayList的源码阅读

初始的容量:10
扩容:按照原来容量的1.5倍进行扩容

(流程图)

class ArrayList {

    // 最终存放数据的地方
    Object[] elementData;

    // 存放数据的地方
    private int size;

    private static final int DEFAULT_CAPACITY = 10;

    // 默认是空的,起到占位的作用
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
        // private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    }

    public boolean add(E e) {
        // 												1
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

    private void ensureCapacityInternal(int minCapacity) {

        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {

            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        if (minCapacity - elementData.length > 0)
            // grow是用来扩容的
            grow(minCapacity);
    }

    private void grow(int minCapacity) {
        //  oldCapacity = 0
        int oldCapacity = elementData.length;
        //  newCapacity  = oldCapacity * 1.5 
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //      0       -     10      < 0
        if (newCapacity - minCapacity < 0)
            //   newCapacity  = 10
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // 相当于给elementData赋值了一个长度为10的数组
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
}

注意事项

  • 构造方法里面没有初始化 —> 添加的时候必须进行初始化(add)
  • 什么时候会扩容 —> 不断调用add方法的时候,会装不下的时候

LinkedList

特点

  • LinkedList是List的子实现
  • LinkedList数据结构表现为线性表
  • LinkedList底层双向链表
  • 存储元素有序
  • 可以存储重复
  • 可以存储null

Q:链表的特点是插入和删除快,是真的吗?
A:查找也需要时间(max(O(n)), O(1))),所以算起来和ArrayList类似。不建议大家把它当List使用,当成Deque接口来用。

构造方法

在这里插入图片描述


Vector

特点

  • Vector是List的子实现
  • Vector的数据结构表现是线性表
  • 底层结构是数组
  • 存储的数据有序,可重复,可存储null
  • 线程安全

注意事项

线程安全:

  • 当多个线程同时对一个变量进行操作时,结果的预期与单线程下是一致的。这就是线程安全的。
    • 比如多个线程对i进行操作,i初始值是0,有5个线程,每个线程累加10000次。最终结果应该是50000。 但真实情况不是这样的,这就是线程安全问题。

为什么vector会被弃用?

  • 效率低。
    • 在所有的接口上都加了synchronized关键字。线程安全是没问题了,但是效率却有问题。因为绝大部分都不涉及到多线程情况,所以jdk1.2采用了ArrayList来替代Vector

Q:ArrayList和Vector的区别?
A:
1.两个都是线性表,都是List的子实现,底层都是数组。
2.存储数据都是有序,允许重复,允许存储null
3.ArrayList是线程不安全的,Vector是线程安全的
4.扩容机制不同。ArrayList初始容量10,扩容1.5倍。Vector初始容量10,扩容2倍。


Stack

特点

  • Stack是Vector的子实现
  • 栈,是先进后出的数据容器。但是不建议使用这个来完成,效率是大问题使用Deque来替代Stack
    • Deque接口及其实现提供了一组更完整的和一致的LIFO堆栈操作,应当优先使用此类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1404212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

x-cmd pkg | frp - 内网穿透工具

简介 frp&#xff08;Fast Reverse Proxy&#xff09;是一个专注于内网穿透的高性能反向代理应用&#xff0c;可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 它采用 C/S 模式&#xff0c;将服务端部署在具有公网 IP 的机器上&#xff0c;客户端部…

身份验证遇到问题,登陆ChatGPT时提示:“we ran into an issue while authenticating you…”

oops&#xff01; we ran into an issue while authenticating you, if this issue persists, please contact us through our help center at help.openai.com 说明&#xff1a;哎呀&#xff01;我们在验证您的身份时遇到了一个问题&#xff0c;如果这个问题仍然存在&#xff…

【Linux】【实战系列】10 分钟掌握日常开发中 Linux 网络处理相关命令

文章目录 lsofnetstatpingnslookupsshssh-keygenscpsftp 网络工具 curl网络工具 wget最后个人简介 hello&#xff0c;大家好&#xff0c;我是 Lorin&#xff0c;上一期和大家分享一期日常开发中常用的 Linux 文件和文本命令实战教学&#xff0c;这一期给大家带来常用的网络处理…

五、垃圾回收

1. 垃圾回收基础 1.1 什么是垃圾 简单说就是&#xff1a;内存中已经不再被使用到的内存空间就是垃圾。 1.2 如何判定是垃圾 1.2.1 引用计数法 引用计数法&#xff1a;给对象添加一个引用计数器&#xff0c;有访问就 1&#xff0c;引用失效就 -1 引用计数法的优缺点&#…

docker容器下php框架laravel的使用问题与解决方案

DB_CONNECTIONmysqlDB_HOSTlocalhost DB_CONNECTIONmysqlDB_HOSTdocker33-mysql-1 容器中只有数据库结构 进入MySQL容器内&#xff0c;创建表结构&#xff0c;添加数据 代码层面需要转换成数组 $query->get([*])->toArray(); 分页数据框架会返回带有data的数据&#xf…

【QT+QGIS跨平台编译】之六:【LZMA+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、lzma介绍二、文件下载三、文件分析四、pro文件五、编译实践一、lzma介绍 LZMA(Lempel-Ziv-Markov chain-Algorithm的缩写),是一个Deflate和LZ77算法改良和优化后的压缩算法。 libLzma是基于LZMA压缩算法封装的开源库。2001年被首次应用于7-Zip压缩工具中,是 …

vscode设置terminal的最大行数

今天跑代码出现一个问题&#xff0c;就是整个程序跑完&#xff0c;整个程序的输出信息过多&#xff0c;最开始输出的信息已经被vscode的缓存冲掉了&#xff0c;只能看到最后的一部分&#xff0c;具体的原因是vscode的terminal默认只能保存1000行的信息&#xff0c;所以如果想保…

C# 获取QQ会话聊天信息

目录 利用UIAutomation获取QQ会话聊天信息 效果 代码 目前遇到一个问题 其他解决办法 利用UIAutomation获取QQ会话聊天信息 效果 代码 AutomationElement window AutomationElement.FromHandle(get.WindowHwnd); AutomationElement QQMsgList window.FindFirst(Tr…

大模型实战营Day5笔记

大模型部署背景 大模型部署是指将训练好的模型在特定的软硬件环境中启动的过程&#xff0c;使模型能够接收输入并返回预测结果。大模型的内存开销巨大&#xff0c;7B模型仅权重需要14G内存。另外大模型是自回归生成&#xff0c;需要缓存Attention的 k/v。 LMDeploy 简…

HCIA——23DNS层次域名空间、域名服务器、域名解析的原理的选择、解答

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

Oracle 19c 配置并启用PDB数据库

一、问题发现 在Oracle 19c多租户环境中&#xff0c;默认情况下&#xff0c;使用startup命令启动数据库实例后&#xff0c;你会发现PDB数据库的状态为MOUNT状态,PDB不会随着CDB启动而启动。 二、查看当前使用的数据库类型 使用sqlplus以管理员身份登录数据库 sqlplus / as s…

Git教程-搭建服务器上GitBlit代码仓库(超详细)

在日常编码时&#xff0c;我常常会有将代码保存到云端的需求&#xff0c;因此我选择将 Git 安装在我的 云服务器上&#xff0c;通过在服务器上搭建 GitBlit 服务&#xff0c;配合本地使用 TortoiseGit 上传代码&#xff0c;实现跨设备的云端代码版本管理。本篇文章将介绍如何在…

Camera 基础知识

一、Camera 基础知识 1.1 Camera 工作原理 外部光线穿过镜头Lens 后&#xff0c; 经过 Color Filter 滤波后照射到CMOS Sensor 上&#xff0c; CMOS Sensor 将从 Lens 上传导过来的光线转换为电信号&#xff0c;再通过内部的AD模数转换&#xff0c;转换为数字信号。如果 Sens…

unity项目《样板间展示》开发:火焰和UI设计

第二章&#xff1a;火焰和UI设计 前言一、火焰模型管理灶台火焰壁炉火焰 二、电视机播放三、UI设计结语 前言 这次带大家从0到1做一个unity项目&#xff1a;《样板间展示》。 顾名思义&#xff0c;项目内容是展示样板间&#xff0c;即玩家可以与房间中的物体、家具进行交互。 至…

【网络安全 -> 防御与保护】信息安全概述

目录 一、信息安全现状及挑战 二、信息安全脆弱性及常见安全攻击 1、网络环境的开放性 2、协议栈的脆弱性及常见攻击 3、操作系统的脆弱性及常见攻击 4、终端的脆弱性及常见攻击 5、其他常见攻击 三、信息安全要素 四、整体安全解决方案 一、信息安全现状及挑战 &…

51单片机LED点阵屏

LED点阵屏 LED点阵屏是一种由许多小型LED灯组成的矩阵式显示屏。这些LED灯可以是单色、双色或全彩的&#xff0c;它们排列成行和列的网格&#xff0c;可以根据需要点亮来显示图像、文字或动画等内容。LED点阵屏广泛应用于户外广告牌、室内显示、交通信号灯、电子价格标签和其他…

gradle打包分离依赖jar

正常打包的jar是包含项目所依赖的jar包资源&#xff0c;而且大多数场景下的依赖资源是不会频繁的变更的&#xff0c;所以实际把项目自身jar和其所依赖的资源分离可以实现jar包瘦身&#xff0c;减小上传的jar包总大小&#xff0c;能实现加速部署的效果 一 原本结构 二 配置buil…

CSS 蜡烛效果

<template><view class="holder"><!-- 身子 --><view class="candle"><!-- 光源 --><view class="blinking-glow"></view><!-- 火星子 --><view class="thread"></view>…

【Python时序预测系列】基于Holt-Winters方法实现单变量时间序列预测(源码)

一、引言 Holt-Winters是一种经典的时序序列预测方法&#xff0c;用于对具有季节性和趋势性的数据进行预测。在这种方法中&#xff0c;使用三个组件来建模时序数据&#xff1a;趋势&#xff08;Trend&#xff09;、季节性&#xff08;Seasonality&#xff09;和残差&#xff0…