ArrayList与线性表详解

1.线性表

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

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

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

2.顺序表

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

2.1接口的实现

public class SeqList {
    private int[] array;
    private int[] size;
    //默认构造方法
    SeqList() { }
    //将顺序表底层容量设置为initcapcity
    SeqList(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位置设置为value
    public void remove(int toremove) { }
    //删除第一次出现的关键字key
    public 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进行扩容

                

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VGA显示器驱动设计与验证

1.原理 场同步信号的单位是像素点 场同步信号的单位是一行 60的含义是每秒钟刷新60帧图像 全0表示黑色 2.1 CLK_gen.v module CLK_gen(input wire sys_clk ,input wire sys_rst_n ,output wire CLK_out ,output wire locked );parameter STATE1b0; reg [1:0] cnt; r…

E5071C是德科技E5071C网络分析仪

181/2461/8938产品概述&#xff1a; E5071C ENA 矢量网络分析仪&#xff0c;9 kHz 至 20 GHz&#xff0c;配有增强型 TDR 测量选件。E5071C 网络分析仪具有较高的射频性能和较快的速度&#xff0c;并具有宽频率范围和全面的功能。它是制造和研发工程师们测试频率范围在 20 GHz…

uniapp自定义卡片轮播图

效果图 1、封装组件 <template><view><!-- 自定义卡片轮播 --><swiper class"swiperBox" :previous-margin"swiper.margin" :next-marginswiper.margin :circular"true"change"swiperChange"><swiper-ite…

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

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

SpringBoot(48)-使用 SkyWalking 进行分布式链路追踪

Spring Boot&#xff08;48&#xff09;- 使用 SkyWalking 进行分布式链路追踪 介绍 在分布式系统中&#xff0c;了解各个服务之间的调用关系和性能表现是非常重要的。SkyWalking 是一款开源的分布式系统监控与分析平台&#xff0c;能够帮助我们实现分布式系统的链路追踪、性…

Xshell Mobaxterm等终端工具连接不上服务器,显示 SSH服务器拒绝密码。请再试一次。解决办法

问题解决办法&#xff1a; &#xff08;1&#xff09;需要查看配置SSH密钥时&#xff0c;输入的password密码和当前users_name cd /home/: 查看当前系统下的用户名 注意上图中的登录名是服务器端linux下自己设置的user_name用户名&#xff1a; 所以需要将fl改为&#xff1a…

python 利用xpath 爬取一周天气

需求&#xff1a; 爬取 中国天气网指定城市一周的天气&#xff0c;以天津为例 实现&#xff1a; 1&#xff0c;先找到一周的数据位置。 divs html.xpath("//div[classhanml]") 2&#xff0c;再遍历每天。 trs div.xpath("./div/div[2]/table//tr[position…

院内感染的相关因素分析(Boruta联合SHAP分析2)R

院内感染的相关因素分析&#xff08;Boruta联合SHAP分析2&#xff09;R 和鲸社区一键运行代码 院内感染是指住院患者在医疗机构内发生的感染&#xff0c;是医院管理中常见且严重的问题。院内感染不仅会延长患者住院时间&#xff0c;增加医疗费用&#xff0c;还会严重威胁患者生…

概率论经典题目-二维随机变量及分布--由概率密度求分布函数和概率

解答&#xff1a; 由概率密度函数求解分布函数的公式可知&#xff1a; 辅助图形加以确定积分上下限

【JavaWeb】Day32.MySQL概述

什么是数据库 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音类的app&#xff0c;那这些大家所…

Django路由分发的三种方式以及命名空间namespce——附带源码解析

目录 1. 前言 2. include常规路由分发 3. include源码解析 4. 路由分发的第二种写法 5. 路由分发的第三种写法 6. 小结 7. 有关namespace 8. 最后 1. 前言 本篇文章主要是讲解路由分发的三种方式。当然&#xff0c;你可能在想&#xff0c;一般做路由分发只需要一个incl…

云计算存在的安全隐患

目录 一、概述 二、ENISA云安全漏洞分析 三、云计算相关系统漏洞 3.1 概述 3.2 漏洞分析 3.2.1 Hypervisor漏洞 3.2.1.1 CVE-2018-16882 3.2.1.2 CVE-2017-17563 3.2.1.3 CVE-2010-1225 3.2.2 虚拟机漏洞 3.2.2.1 CVE-2019-14835 3.2.2.2 CVE-2019-5514 3.2.2.3 CV…

css 属性值计算过程

1.css 属性值计算过程 某个元素从所有CSS属性没有值&#xff0c;到所有CSS属性都有值的过程1.确定声明值 2.层叠 3.继承 4.使用默认值 1.确定声明值 样式表总共有两类&#xff1a;作者样式表&#xff08;自己写的样式&#xff09;和浏览器样式表 html <h1 class"text&…

前视声呐目标识别定位(三)-部署至机器人

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 开发了多波束前视声呐目标识别定位模块后&#xff0c;自然期待能将声呐部署至AUV&#xff0c;实现AUV对目标的抵近观测。原本规划着定位模块不…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 一、简单介绍 二、简单视频放大抖动效果实现原理 三、简单视频放大…

面试经典150题【131-140】

文章目录 面试经典150题【131-140】123.买卖股票的最佳时机III188.买卖股票的最佳时机IV二分查找的板子&#xff1a;35.搜索插入位置74.搜索二维矩阵162.寻找峰值33.搜索旋转排序数组34.在排序数组中查找元素的第一个和最后一个位置153.寻找旋转排序数组中的最小值4.寻找两个正…

练习 18 Web [RoarCTF 2019]Easy Calc

表达式注入&#xff0c;被屏蔽字符的处理方式 一开始先看一下前端的源码 有一个calc.php&#xff0c;肯定需要打开 这是calc中的代码 <?php error_reporting(0); if(!isset($_GET[num])){show_source(__FILE__); }else{$str $_GET[num];$blacklist [ , \t, \r, \n,\,…

计算机网络-HTTP相关知识-HTTP的发展

HTTP/1.1 特点&#xff1a; 简单&#xff1a;HTTP/1.1的报文格式包括头部和主体&#xff0c;头部信息是键值对的形式&#xff0c;使得其易于理解和使用。灵活和易于扩展&#xff1a;HTTP/1.1的请求方法、URL、状态码、头字段等都可以自定义和扩展&#xff0c;使得其具有很高的…

【Android、 kotlin】kotlin学习笔记

基本语法 fun main(){val a2var b "Hello"println("$ (a - 1} $b Kotlin!")} Variables 只赋值一次用val read-only variables with val 赋值多次用var mutable variables with var Standard output printin() and print() functions String templ…

蓝桥杯第793题——排水系统

题目描述 对于一个城市来说&#xff0c;排水系统是极其重要的一个部分。 有一天&#xff0c;小 C 拿到了某座城市排水系统的设计图。排水系统由 n 个排水结点&#xff08;它们从 1∼n 编号&#xff09;和若干个单向排水管道构成。每一个排水结点有若干个管道用于汇集其他排水…