数据结构——数组
数组定义:
在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识。
因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。
性能空间占用
java中所有对象的大小都是8字节的整数倍,不足的要用对齐字节补足
随机访问
即根据索引查找元素,时间复杂度是O(1)
动态数组
private int size; // 逻辑大小private int capacity=8; // 容量private int[] array=new int[capacity];
插入
//向最后的位置[size]添加元素public void addLast(int element){array[size]=element;size++;}
//向[0....size]位置添加元素public void add(int index,int element){//未考虑数组扩容问题if(size>=0&&index<size) {//进行一个拷贝System.arraycopy(array, index, array, index + 1, size - index);array[index] = element;size++;} else if(index==size){//addLastarray[index]=element;size++;}}
public void add1(int index,int element){if(size >= 0 && index < size){System.arraycopy(array,index,array,index+1,size-index);}array[index]=element;size++;}
查询和遍历元素
//查询元素public int get(int index){//[0....size]return array[index];}//打印每个元素public void foreach(){for (int i=0;i<size;i++){System.out.println(array[i]);}}//函数式接口//遍历方法1,consumer接口 遍历执行的操作,每个元素入参public void foreach1(Consumer<Integer> consumer){for(int i=0;i<size;i++){consumer.accept(array[i]);}}//Iterator 是个接口,要有实现类//迭代器遍历@Overridepublic Iterator<Integer> iterator() {//java里叫匿名内部类return new Iterator<Integer>() {int i=0;@Overridepublic boolean hasNext() {//有没有下一个严肃return i<size;}@Overridepublic Integer next() {//返回当前元素,并移动到下一个元素return array[i++];}};}public IntStream stream(){//IntStream 传的数字不仅有有效数字,还有无效的 eg:1,2,3,4,0,0,0,0return IntStream.of(Arrays.copyOfRange(array,0,size));}
public static void main(String[] args) {System.out.println("Hello world!");DynamicArray dynamicArray = new DynamicArray();dynamicArray.addLast(1);dynamicArray.addLast(2);dynamicArray.addLast(3);dynamicArray.addLast(4);dynamicArray.add(2,5);for(int i=0;i<5;i++){System.out.println(dynamicArray.get(i));}//迭代器遍历for(Integer element:dynamicArray){//hasnext()、next()方法System.out.println(element);}}
删除
public int remove(int index){ //[0...size]int removed=array[index];if(index<size-1) {//java数组中移动元素的方法System.arraycopy(array, index + 1, array, index, size - index - 1);}size--;return removed;}
对比数据是否一致(断言)
assertEquals(3,removed);
assertIterable(List.of(1,2,4,5),dynamicArray);
容量不够,先扩容
private void checkAndGrow() {//容量检查if(size==0){array=new int[capacity];}if(size==capacity){//进行扩容,1.5 1.618 2capacity+=capacity>>1;int [] newArray=new int[capacity];System.arraycopy(array,0,newArray,0,size);array=newArray;}}
插入或删除性能
头部位置,时间复杂度是O(n)
中间位置,时间复杂度是O(n)
尾部位置,时间复杂度是O(1)
全部代码
package org.example;import java.util.Iterator;
import java.util.Arrays;
import java.util.function.Consumer;
import java.util.stream.IntStream;//动态数组
public class DynamicArray implements Iterable<Integer>{private int size; // 逻辑大小private int capacity=8; // 容量// private int[] array=new int[capacity];private int[] array={};//向最后的位置[size]添加元素public void addLast(int element){array[size]=element;size++;}//向[0....size]位置添加元素public void add(int index,int element){checkAndGrow();//未考虑数组扩容问题if(size>=0&&index<size) {//进行一个拷贝System.arraycopy(array, index, array, index + 1, size - index);array[index] = element;size++;} else if(index==size){//addLastarray[index]=element;size++;}}private void checkAndGrow() {//容量检查if(size==0){array=new int[capacity];}if(size==capacity){//进行扩容,1.5 1.618 2capacity+=capacity>>1;int [] newArray=new int[capacity];System.arraycopy(array,0,newArray,0,size);array=newArray;}}public void add1(int index,int element){if(size >= 0 && index < size){System.arraycopy(array,index,array,index+1,size-index);}array[index]=element;size++;}//查询元素public int get(int index){//[0....size]return array[index];}//打印每个元素public void foreach(){for (int i=0;i<size;i++){System.out.println(array[i]);}}//函数式接口//遍历方法1,consumer接口 遍历执行的操作,每个元素入参public void foreach1(Consumer<Integer> consumer){for(int i=0;i<size;i++){consumer.accept(array[i]);}}//Iterator 是个接口,要有实现类//迭代器遍历@Overridepublic Iterator<Integer> iterator() {//java里叫匿名内部类return new Iterator<Integer>() {int i=0;@Overridepublic boolean hasNext() {//有没有下一个严肃return i<size;}@Overridepublic Integer next() {//返回当前元素,并移动到下一个元素return array[i++];}};}public IntStream stream(){//IntStream 传的数字不仅有有效数字,还有无效的 eg:1,2,3,4,0,0,0,0return IntStream.of(Arrays.copyOfRange(array,0,size));}public int remove(int index){ //[0...size]int removed=array[index];if(index<size-1) {//java数组中移动元素的方法System.arraycopy(array, index + 1, array, index, size - index - 1);}size--;return removed;}}
二维数组
从行开始遍历比从列开始遍历更快。
局部性原理:(空间方面)
cpu读取内存(速度慢)数据后,会将其放入高速缓存(速度快)中当中,如果后来的计算机再用到此数据,在缓存中能读到的话,就不必读内存了。
缓存的最小存储单位是缓存行,一般是64bytes,一次读的数据少了不划算,因此最少读64bytes填满一个缓存行,因此读入某一个数据时也会读取其临近的数据,这就是所谓的空间局部性。
相关文章:

数据结构——数组
数组定义: 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识。 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。 性…...
python asyncio websockets server
python websocket server在收到接受消息处理完后会默认关闭连接。需要在msg_handler里面加个while true就能一直保持连接了。 start_server websockets.serve(msg_handler, "0.0.0.0", 29967) asyncio.get_event_loop().run_until_complete(start_server) asyncio.…...

视频素材免费网站有哪些?8个视频素材库网站下载推荐
在视频创作领域,选择正确的高质量无水印素材网站能够极大地丰富您的作品,让每一帧都鲜活起来。下面,我们继续为您介绍更多优质的视频素材网站,每一个都是您创作旅程中的宝贵资源。 1. 蛙学府(中国) 集合了…...

ChatGPT与传统搜索引擎的区别:智能对话与关键词匹配的差异
引言 随着互联网的快速发展,信息的获取变得比以往任何时候都更加便捷。在数字化时代,人们对于获取准确、及时信息的需求愈发迫切。传统搜索引擎通过关键词匹配的方式为用户提供了大量的信息,然而,这种机械式的检索方式有时候并不…...
xargs后调用bash自定义函数(写该函数文本到脚本, 并引导PATH)
xargs后调用bash自定义函数 需要3步骤,如下 function to_markdown_href_func() { fp$1 #echo $fpecho -e "\n[${fp}](${PREFIX}/${fp})" }BIN/tmp/bin/ F$BIN/to_markdown_href_func.sh mkdir -p $BIN 获得函数to_markdown_href_func的文本 ,写文本到 /tmp/bin/to_ma…...
学术论文写作新利器:ChatGPT技巧详解
ChatGPT无限次数:点击直达 学术论文写作新利器:ChatGPT技巧详解 在如今信息爆炸的时代,学术论文写作变得愈发重要且具有挑战性。随着人工智能技术的不断发展,ChatGPT作为一种强大的写作辅助工具,为学术论文创作者提供了全新的可能…...
Spring整合JDBC
1、引入依赖 <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><depen…...
详解Qt中的布局管理器
Qt中的布局管理是用于组织用户界面中控件(如按钮、文本框、标签等)位置和尺寸调整的一种机制。说白了就是创建了一种规则,随着窗口变化其中的控件大小位置跟着变化。Qt提供了多种布局管理器,每种都有其特定用途和特点。以下是对Qt…...

MyBatis 参数重复打印的bug
现象 最近有个需求,需要在mybatis对数据库进行写入操作的时候,根据条件对对象中的某个值进行置空,然后再进行写入,这样数据库中的值就会为空了。 根据网上查看的资料,选择在 StatementHandler 类执行 update 的时候进…...

ES6学习之路:迭代器Iterator和生成器Generator
迭代器 一、知识背景 什么是迭代器 迭代器就是在一个数据集合中不断取出数据的过程迭代和遍历的区别 遍历是把所有数据都取出迭代器注重的是依次取出数据,它不会在意有多少数据,也不会保证能够取出多少或者能够把数据都取完。比如斐波那契额数列&#…...

如何使用 DynamiCrafter Interp Loop 无缝连接两张照片
DynamiCrafter Interp Loop 是一个基于 AI 的工具,可以用来无缝连接两张照片。它使用深度学习技术来生成中间帧,从而使两张照片之间的过渡更加自然流畅。 使用步骤 访问 DynamiCrafter Interp Loop 网站:https://huggingface.co/spaces/Dou…...

今天起,Windows可以一键召唤GPT-4了
ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 微软 AI 大计的最后一块拼图完成了? 把 Copilot 按钮放在 Window…...

使用Kaggle API快速下载Kaggle数据集
前言 在使用Kaggle网站下载数据集时,直接在网页上点击下载可能会很慢,甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包: pip install…...
java 通过 microsoft graph 调用outlook(二)
这次提供一些基础调用方式API PS: getMailFolders 接口返回的属性中,包含了未读邮件数量unreadItemCount 一 POM文件 <!-- office 365 --><dependency><groupId>com.google.guava</groupId><artifactId>guava<…...

【机器学习】代价函数
🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...

[leetcode] 100. 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3], q [1,2,3] 输出:true示例 2&a…...
08、Lua 函数
Lua 函数 Lua 函数Lua函数主要有两种用途函数定义解析:optional_function_scopefunction_nameargument1, argument2, argument3..., argumentnfunction_bodyresult_params_comma_separated 范例 : 定义一个函数 max()Lua 中函数可以作为参数传递给函数多返回值Lua函…...

【数据分析面试】1. 计算年度收入百分比(SQL)
题目 你需要为公司的营收来源生成一份年度报告。计算截止目前为止,在表格中记录的第一年和最后一年所创造的总收入百分比。将百分比四舍五入到两位小数。 示例: 输入: annual_payments 表 列名类型amountINTEGERcreated_atDATETIMEstatusV…...
数据库SQL语句速查手册
SQL 语句语法AND / ORSELECT column_name(s) FROM table_name WHERE condition AND|OR conditionALTER TABLEALTER TABLE table_name ADD column_name datatypeorALTER TABLE table_name DROP COLUMN column_nameAS (alias)SELECT column_name AS column_alias FROM table_name…...

智慧城市一屏统览,数字孪生综合治理
现代城市作为一个复杂系统,牵一发而动全身,城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。城市工作要树立系统思维,从构成城市诸多要素、结构、功能等方面入手,系统推进…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...