ArrayList与线性表详解

1.线性表

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、队列……

线性表在逻辑上是线性结构,也就是说是连续的一条直线。但是在物理结构上不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

我们来看一下顺序表和链表的区别,如下图所示:

2.顺序表

即是一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。

2.1接口的实现

public class SeqList {private int[] array;private int[] size;//默认构造方法SeqList() { }//将顺序表底层容量设置为initcapcitySeqList(int initcapacity) { }//新增元素,默认在数组最后新增public void add(int data) { }//在pos位置新增元素public boolean contains(int toFind) { return ture;}//判断是否包含某个元素public int indexOf(int toFind) {return -1;}//查找某个元素对应的位置public int get(int pos){return -1;}//获取pos位置的元素public void set(int pos,int value) { }//给pos位置设置为valuepublic void remove(int toremove) { }//删除第一次出现的关键字keypublic int size() {return 0;}//获取顺序表长度public void clear(){ }//清空顺序表public void display(){ }//打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看到测试结果给出的
}

3.ArrayList

在集合框架中,ArrayList是一个普通类,实现了List接口,具体框架如下:

需要注意的是以下几点:

  1. ArrayList是以泛型方式实现的,使用时必须先要实例化
  2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
  3. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
  4. ArrayList实现了Cloneable接口,表明ArrayList是支持clone的
  5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrrayList
  6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

3.关于使用

3.1关于构造

方法解释
ArrayList()无参构造
ArrayList(Collection<? extends E> c)利用其他Collection构建ArrayList
ArrayList(int initialCapacity)

指定顺序表初始z

 我们直接先来看一段代码:

public static void main(String[] args) {//构造一个空的列表List<Integer> list1=new ArrayList<>();//构造一个具有10容量的列表List<Integer> list2=new ArrayList<>();list2.add(1);list2.add(2);list2.add(3);//list3创建好了以后,与list中的元素一致ArrayList<Integer> list3=new ArrayList<>(list);//避免省略类型,否则:任意类型的元素都可以不存放,使用时将会出现大问题List list4=new ArrayList<>(list2);list4.add("111");list.add(100);
}

3.2常见的操作

方法解释
boolean add (E e)尾插e
void add (int index,E elemt)将e插入到index位置
boolean addAll(Collection<? extends E>c)尾插c中元素

E remove (int index)

删除index位置元素
boolean remove (Object o)删除遇到的第一个o
E get (int index)获取下标index位置元素
E set (int index,E element)将下标index位置元素设置为element
void clear()清空
boolean contains(Object o)判断o是否在线性表中
int indexOf(Object o)返回第一个o所在下标
int lastindexOf(Object o)返回最后一个o下标
List<E> subList(int fromIndex,int toIndex)截取部分list

3.3关于遍历

ArrayList可以使用三种方式遍历,即:for循环+下标,foreach,使用迭代器。

public static void main(String[] args) {List<Integer> list =new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);//使用下标+for遍历for(int i=0;i<list.size();i++) {System.out.println(list.get(i)+" ");}System.out.println();//借助foreach遍历for(Integer integer:list) {System.out.print(integer+" ");}System.out.println();Inerator<Integer> it=list.listlterator();while(it.hasNext()) {System.out.print(it.next()+" ");}System.out.println();
}

注意:

  1. ArrayList最长使用的遍历方式是:for循环+下标以及foreach
  2. 迭代器是设计模式的一种,在容器这个内容会涉及到这里就不过多赘述了

3.4ArrayList的扩容机制

ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容。以下是ArrayList源码中的扩容方式。

Object[] elementData;//
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA={};//
private static final int DEFAULT_CAPACITY=0;//
public boolean add(E e) {ensureCapacityInternal(size+1);elementData[size++]=e;return true;
}
private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elemnet Data,minCapacity));
}
private void int calculateCapacity(Object[] elementData,int minCapacity) {if(elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_EMPTY_ELEMENTDATA);    }return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {modCount++;if(minCapacity-elementData.length>0)grow(minCapacity);
}
private static final int MAX_ARRAY_SIZE=Integer.MAX_VALUE-8;
private void grow(int minCapacity) {//获取旧空间大小int oldCapacity=elementData.length;//按照1.5倍方式扩容int newCapacity=oldCapacity+(oldCapacity>>1);//如果用户需要扩容大小超过原空间1.5倍,按照用户所需大小扩容if(newCapacity-minCapacity<0)newCapacity=minCapacity;if(newCapacity-MAX_ARRAY_SIZE>0)newCapacity=hugeCapacity(minCapacity);//调用copyOf扩容elementData=Arrays.copyOf(elementData,newCapacity);
}private static int hugeCapacity(int minCapacity) {//如果minCapacity小于0,抛出OutOfMemoryError异常if(minCapacity<0)throw new OutOfMemoryError();return (minCapacity>MAX_ARRAY_SIZE)?Integer.MAX_VALUE:MAX_ARRAY_SIZE;
}

总结:

  1. 检测是否真正需要扩容,如果是调用grow准备扩容
  2. 预估需要库容的大小,初步预估按照1.5倍大小扩容,如果用户所需大小超过预估1.5倍大小则按照用户所需大小扩容,真正扩容之前检测是否能扩容成功,防止太大导致扩容失败。
  3. 使用copyOf进行扩容

                

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

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

相关文章

Unity类银河恶魔城学习记录12-2 p124 Character Stats UI源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_Statslot.cs using System.Collections; using System.Collections.Gen…

基于深度学习的条形码二维码检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5的条形码二维码检测系统。核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及基于Streamlit的交互…

Leetcode-894-所有可能的真二叉树-c++

题目详见https://leetcode.cn/problems/all-possible-full-binary-trees/ 主搞动态规划&#xff0c;因为这玩意儿我还不是很懂 关于节点个数为奇数偶数的证明请见官方题解方法一中的如下内容&#xff1a; 这里DP的一个主要思想是&#xff1a;对于任何一个满二叉树&#xff…

4 月 8 日至 9 日 ICP Hacker House 邀你共赴 IC 生态项目开发新风口

为了更好地探索区块链技术前沿&#xff0c;体验作为全面智能合约云平台的互联网计算机&#xff08;Internet Computer Protocol&#xff09;&#xff0c;将数据、内容、计算和用户体验全部托管于链上&#xff0c;IC 生态致力于推动去中心化互联网的深度发展&#xff0c;并将更安…

jpg、bmp、png图像的位深度分别有多少种?分别表示什么意思?如果操作时需要注意什么?

JPG (JPEG) JPEG 格式通常使用 24 位颜色深度&#xff0c;这意味着每个像素由三个 8 位颜色通道组成&#xff1a;红色、绿色和蓝色&#xff08;RGB&#xff09;。因此&#xff0c;它可以表示大约 1600 万种颜色&#xff08;2^24&#xff09;。不过&#xff0c;JPEG 也支持有损…

ES6学习(四)-- Reflect / Promise / Generator 函数 / Class

文章目录 1. Reflect1.1 代替Object 的某些方法1.2 修改某些Object 方法返回结果1.3 命令式变为函数行为1.4 ! 配合Proxy 2. ! Promise2.1 回调地狱2.2 Promise 使用2.3 Promise 对象的状态2.4 解决回调地狱的方法2.5 Promise.all2.6 Promise.race 3. Generator 函数3.1 基本语…

Android Studio学习5——布局layout与视图view

wrap_content&#xff0c;内容有多大&#xff0c;就有多宽&#xff08;包裹&#xff09; 布局 padding 边框与它自身的内容 margin 控件与控件之间

This app has no Android key hashes configured. . Configure your app key

Unity 接入 Facebook SDK 的过程中遇到这个问题&#xff0c;查了很多帖子&#xff0c;不太直观&#xff0c;记录下来方便需要的同学参考 报上面错误的原因是在https://developers.facebook.com/apps/ 设置里没有填入有效的密钥 怎么填入这个密钥呢&#xff0c;其实很简单&…

Redis性能管理及集群三种模式(一)

一、前期准备 至少准备三台服务器为主从复制、哨兵的实验做准备 一台主redis、两台从redis 二、Redis性能管理 2.1 查看Redis内存使用 查看Redis内存使用——info memory 2.2 内存使用率 1<内存碎片<1.5表示合理的内存碎片大于>1.5&#xff0c;需要输入shutdown save…

创建vue3项目及基本常用配置

1、创建vue3项目 1.1 创建vue3项目 确保电脑中安装了nodejs&#xff0c;新建文件夹&#xff0c;输入以下命令&#xff1a; npm create vuelatest 看是否为自己需要的vue版本&#xff0c;选择Y 各配置具体如下&#xff0c;根据自己的需求选择是或者否 npm create vuelatest …

阿里云数据库服务器价格表查询,一键查询报价

阿里云数据库服务器价格表&#xff0c;优惠99元一年起&#xff0c;ECS云服务器2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;优惠价格99元一年&#xff1b;阿里云数据库MySQL版2核2G基础系列经济版99元1年、2核4GB 227.99元1年&#xff0c;云数据库PostgreSQL、SQL Serve…

OpenHarmony实战:标准系统移植指南

本文描述了移植一块开发板的通用步骤&#xff0c;和具体芯片相关的详细移植过程无法在此一一列举。后续社区还会陆续发布开发板移植的实例供开发者参考。 定义开发板 本文以移植名为MyProduct的开发板为例讲解移植过程&#xff0c;假定MyProduct是MyProductVendor公司的开发板…

RC滤波电路

RC滤波电路 综述&#xff1a;本文简单讲述了RC低通滤波电路和RC高通滤波电路。 滤波电路是指过滤输入信号中不需要的信号&#xff0c;保留需要的信号。 一、RC低通滤波电路 1.定义&#xff1a;RC低通滤波电路&#xff1a;保留低频信号&#xff0c;衰减高频信号。 2.截止频率…

突破校园网限速:使用 iKuai 多拨分流负载均衡 + Clash 代理(内网带宽限制通用)

文章目录 1. 简介2. iKuai 部署2.1 安装 VMware2.2 安装 iKuai(1) 下载固件(2) 安装 iKuai 虚拟机(3) 配置 iKuai 虚拟机(4) 配置 iKuai(5) 配置多拨分流 2.3 测试速度 3. Clash 部署3.1 准备工作(1) 配置磁盘分区(2) 安装 Docker(3) 安装 Clash(4) 设置代理 1. 简介 由于博主…

014——超声波模块驱动开发Plus(基于I.MX6uLL、SR04和poll机制)

目录 一、基础知识 二、分析为什么打印会影响中断 三、驱动程序 四、应用程序 五、验证及其它 一、基础知识 013——超声波模块驱动开发&#xff08;基于I.MX6uLL与SR04&#xff09;-CSDN博客 二、分析为什么打印会影响中断 asmlinkage __visible int printk(const ch…

一条SQL查询语句是如何执行的

这是专栏的第一篇文章&#xff0c;我想来跟你聊聊 MySQL 的基础架构。我们经常说&#xff0c;看一个事儿千万不要直接陷入细节里&#xff0c;你应该先鸟瞰其全貌&#xff0c;这样能够帮助你从高维度理解问题。同样&#xff0c;对于 MySQL 的学习也是这样。平时我们使用数据库&a…

Windows11安装MySql-8.0.36安装详细教程(保姆级教程)

之前一直用的mysql5.7&#xff0c;最近导入一个项目一直报错&#xff0c;经查阅发现数据库mysql版本太老&#xff0c;今天特地重头下载安装配置一下&#xff0c;做个记录供大家参考。 下载安装包&#xff1a; 下载地址&#xff1a;https://dev.mysql.com/downloads/ 进入后选…

C++STL--排序算法

sort 使用快速排序,平均性能好O(nlogn),但最差情况可能很差O(n^2)。不稳定。 sort(v.begin(),v.end());//对v容器进行排序,默认升序 sort(v.begin(),v.end(),greater<int>());//降序排序对于支持随机访问的迭代器的容器&#xff0c; 都可以利用sort算法直接对其进行排序…

基于SSM的师生交流平台

目录 背景 技术简介 系统简介 界面预览 背景 传统的师生互动平台主要依赖于面对面的线下交流&#xff0c;用户必须亲自到场以获取和交流相关信息。然而&#xff0c;随着信息技术的广泛传播&#xff0c;众多教育机构开始转向线上发展&#xff0c;寻求更多样化的发展途径。线…

C++11:声明 初始化

C11&#xff1a;声明 & 初始化 初始化{ }初始化initializer_list 声明autodecltypenullptr 初始化 { }初始化 在C98中&#xff0c;允许使用花括号{ }对数组或者结构体元素进行统一的列表初始化。 用{ }初始化数组&#xff1a; int arr[] { 1, 2, 3, 4, 5 };用{ }初始化…