数组--java--动态数组--有序数组--底层
java数组
- 基础--java中的数组
- 创建数组
- 空间占用
- 初始化数组
- 访问元素
- 插入查找
- 删除元素
- 动态数组
- 扩容
- 插入和添加
- 重写toString
- 删除
- 二维数组
- 二维数组注意点
- 有序数组
- 实现
- 测试
写在开头:
这篇文章包括数组的基础、一点底层的内容和一些稍微深入的东西。
作为第一个深入学习的数据结构,现在还不太知道怎么样了。有缺点请指出。
还有内容之后在补充。
本来是想和ArrayList源码一起来写进来的,但是发现实在不好插入进来了。还是到时候换一篇文章写了。
基础–java中的数组
数组是应用最广泛的数据存储结构。
因为里面元素是连续存储的,所以数组中的元素的地址可以用索引计算出来。
第iii个元素的地址:address=baseAddress(起始索引)+i∗sizeaddress = baseAddress(起始索引) + i*sizeaddress=baseAddress(起始索引)+i∗size
size是每一个元素所占的字节大小,如int占4,double占8
在许多语言中都把数组当作基本数据类型,但是在java中是把他们当作对象来对待的,所以在创建数组的时候使用new关键字。
创建数组
我们一般会把[]放在类型后面,清晰的代表着数据类型的一部分
int[] arr = new int[n];
像大部分的对象一样,arr只是作为存储这个对象的地址值。且大小固定,一旦创建就不可修改。
空间占用
用int来介绍
- 8字节的markword:记录对象的hash码等状态信息。这个具体会在java类介绍中。
- 4字节的类指针:指定这个对象的类型,数据指向类的字节码文件。
- 4字节的数组大小:所以最高2322^{32}232的容量
- 数据元素+对其字节:内存对齐
初始化数组
创建数组后
-
如果是基本数据类型会自动初始化数组
-
如果是引用类型,则他们会是特殊的null对象
如果尝试访问null的数据项,会出现Null Point Assignment(空指针赋值错误)
对于基本数据类型我们还可以通过{}来初始并创建数组
int[] arr= {1,2,3};
访问元素
第一个元素下标为0,所以容量为10的数组,下标为0-9.
越界访问会出现Array Index Out Of Bounds(数组越界错误)错误
插入查找
在n位置设置为num
arr[n]=num;
查询n位置的数
System.out.println(arr[n]);
删除元素
删除第n个元素
想要删除的话,将n后面的元素全部往前一个就可以了。
for(int i = n-1;i<arr.length-1;i++{arr[i]=arr[i+1]
}
arr[arr.length-1]=0;
动态数组
因为普通数组,大小是写死的。很不方便,所以我们需要动态数组。
在java中有ArrayList类是已经实现了动态数组了。
这里介绍的是手写动态数组,但是不考虑泛型,只用整形数字。
想要实现动态数组,那么我们需要一些属性来标记
- 数组:我们需要一个基本数组来存储。
- 大小:我们需要记录数组已经存储了的大小。
- 容量:记录数组的大小,在不够用的时候进行扩容处理。
public class Array{private int size = 0;private int capacity = 8;private int[] array = new int[capacity];
}
添加
这个应该是用的最多的,所以我们先设计这个。
在不考虑扩容的情况下,在最后设置成element,大小加一就可以了。
public void add(int element){array[size] = element;size++;
}
插入
实现在index位置插入element:
我们需要将index之后的元素往后移动一位就可以实现了
public void insert(int index,int element){System.arraycopy(array,index,array,index+1,size-index);array[index]=element;
}
我们需要对其进行容量判断,并实现扩容。
扩容
为了节省空间,在需要使用的时候在给数组空间。
private int[] array={};
对于扩容我们首先判断容量是否是0。
public void grow(){if(array.length > 0){capacity += capacity>>1;array = Arrays.copyOf(array,capacity);}else{capacity = 8;array = new int[capacity];}
}
插入和添加
然后我们可以改进我们的代码了。
是否满
private boolean isFull(){return size == capacity;
}
在index位置插入元素
public void insert(int index, int element){if (isFull()){//判断是否需要扩容grow();}if (index < 0 || index > size){//判断index是否合法throw new IndexOutOfBoundsException("Index: " + index + ", Size " + size);}System.arraycopy(array, index, array, index + 1, size - index);//将index后面的元素往后移动array[index] = element;size++;
}
在最后位置添加就可以复用代码了。
public void add(int element){insert(size,element);
}
测试:
测试代码中重写了toString方法,在下一节有。

重写toString
我们需要toString方法输出的只是我们的数组就可以了,所以这里需要重写toString方法。
这里建议使用append字符,而不是字符串,效率高。
@Override
public String toString() {StringBuilder sb = new StringBuilder();sb.append('[');for (int i = 0; i < size-1; i++) {sb.append(array[i]).append(',').append(' ');}sb.append(array[size-1]);sb.append(']');return sb.toString();
}
删除
将index索引位置元素删除:
- 去除index索引元素
- 后面元素前移
public int remove(int index){//判断index是否合法if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index: " + index + ", Size " + size);}int oldValue = array[index];//去除元素int numMoved = size - index - 1;//查看后面元素的数量if (numMoved > 0)System.arraycopy(array, index+1, array, index,numMoved);//将后面的元素往前移动array[--size] = 0; // clear to let GC do its workreturn oldValue;//返回删除的元素
}
二维数组
创建数组
int[][] array = new int[2][2];
初始化
int[][] arry = {{1,2,3},{2,3,4}
};
二位数组的实现:
起始就是一个数组存储着各种数组的地址值。

二维数组注意点
因为有缓存机制的影响,所以我们尽量在遍历的时候同一层的使用如:
int[x][y]
for(int i = 0;i<x;i++)for(int j = 0;j<y;j++)。。。
这样子速度会更快。
有序数组
在有序数组中,因为查询位置则会成为重点。所以我们会选择二分查询来加快速度。但不会书写二分查询的代码,而是直接调用API,不过需要学习的可以点击链接去看看。而动态数组中的内容也不在重复。
有序数组需要在动态数组的基础上实现。
很多也是复用了代码。
下面是不同点:
- 对于给定位置插入和删除,我们不再对外公开所以权限给位private
- 查询使用的Arrays的二分查询的api
- 不用在判断位置是否合法了
实现
private int size = 0;
private int capacity = 0;
private int[] array = {};//扩容
public void grow() {if (array.length > 0) {capacity += capacity >> 1;array = Arrays.copyOf(array, capacity);} else {capacity = 8;array = new int[capacity];}
}//插入数据
private void insert(int index, int element) {if (isFull()) {//判断是否需要扩容grow();}if (index < 0 || index > size) {//判断index是否合法throw new IndexOutOfBoundsException("Index: " + index + ", Size " + size);}System.arraycopy(array, index, array, index + 1, size - index);//将index后面的元素往后移动array[index] = element;//插入元素size++;
}public void add(int element) {if (isFull()) {//判断是否需要扩容grow();}//二分查找元素应该插入的位置int i = Arrays.binarySearch(array, 0, size, element);if (i < 0) {i = -i - 1;}insert(i, element);
}private boolean isFull() {return size == capacity;
}public boolean delete(int index) {int i = Arrays.binarySearch(array, 0, size, index);if (i<0){return false;}remove(i);return true;
}
private void remove(int index) {int numMoved = size - index - 1;//查看后面元素的数量if (numMoved > 0)System.arraycopy(array, index + 1, array, index,numMoved);//将后面的元素往前移动array[--size] = 0; // clear to let GC do its work
}@Override
public String toString() {StringBuilder sb = new StringBuilder();sb.append('[');for (int i = 0; i < size - 1; i++) {sb.append(array[i]).append(',').append(' ');}sb.append(array[size - 1]);sb.append(']');return sb.toString();
}
测试

相关文章:
数组--java--动态数组--有序数组--底层
java数组基础--java中的数组创建数组空间占用初始化数组访问元素插入查找删除元素动态数组扩容插入和添加重写toString删除二维数组二维数组注意点有序数组实现测试写在开头: 这篇文章包括数组的基础、一点底层的内容和一些稍微深入的东西。 作为第一个深入学习的数…...
Linux下使用C语言实现简单的聊天室程序
本文章介绍一种基于Linux使用C语言实现简单的局域网聊天室程序的方法,支持消息群发,历史数据查询,好友列表查看,好友上线下线提醒等功能。聊天界面如下图所示:下面将按步骤介绍该系统的设计实现,首先在linu…...
【数学】任意一个正整数n最多只有一个质因数大于根号n,怎么证明?
定理 任意一个正整数n最多只有一个大于n\sqrt{n}n的质因子,并且该大于n\sqrt{n}n质因子的幂次是1。 证明(反证法) 证明:最多只有一个大于n\sqrt{n}n的质因子 假设n存在两个大于n\sqrt{n}n的质因子,分别为p…...
【ES6】var let const 之面试题系列
关于 var、let、const 是前端开发人员经常用到的关键字,也是经典的面试题,接下来就站在面试题的角度来看待它们之间的区别。 一、区别 1. var 声明的范围是函数作用域,let 和 const 声明的范围是块作用域,块作用域是函数作用域的…...
Vue基础入门讲义(四)-组件化
文章目录1.引言2.定义全局组件3.组件的复用4.局部注册5.组件通信5.1.父向子传递props5.2.传递复杂数据5.3.子向父的通信1.引言 在大型应用开发的时候,页面可以划分成很多部分。往往不同的页面,也会有相同的部分。例如可能会有相同的头部导航。 但是如果…...
Android onLayout布局流程解析
组件布局流程结论 1.)layout流程始于ViewRootImpl的performLayout()方法,该方法会调用根View(DecorView)的layout()方法进行布局,因为DecorView是ViewGroup(FrameLayout),所以layout流程来到了ViewGroup(其…...
浅分析BIG-建筑展示系统
一、主页(主要界面)重点疑点(需要解决)1.云平台实时同步。是否可以电脑与hololens2同步或链接?并可以传输信息提醒?一级界面(启动界面)1.交互式启动激活效果(触发按钮旋转…...
模电基础(1) 半导体基础知识
基本内容: 1.本征半导体的基本介绍结构; 2.杂质半导体; 3.PN结的形成; 4.PN结的性质。 1.本征半导体 半导体:导电性能介于绝缘体和导体之间的物质。 本征半导体是纯净的晶体结构的半导体。 纯净→无杂质晶体结构→稳…...
阅读笔记:TF - IDF 原理
今天查阅 TF-IDF 资料,发现百度百科里面提供了一个例子,解释的很清楚,记下来备用。 原文链接:https://baike.baidu.com/item/tf-idf/8816134?fraladdin 例子:在某个一共有一千词的网页中 “原子能”、“的” 和 “应…...
【C语言】float 关键字
🚩write in front🚩 🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🏅2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4…...
Linux 网络编程(实现多路IO转接服务器)
1.select函数实现多路IO转接服务器select函数原型:包含在头文件<sys/time.h>,<sys/types.h>和<unistd.h>int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);作用:确定…...
DC-4 靶场学习
信息搜集: 首先获取靶场ip,和之前一样。 arp-scan -l nmap -sP 192.168.28.0/24然后访问。 发现需要登录。 漏洞分析: 直接用bp爆破,爆破出来密码为happy,登录。 发现执行了命令,抓包。 修改命令可以执行ÿ…...
QML组件
一个QML文件定义了一个独立的、顶级的QML组件。 一个QML组件就是一个模板,被QML运行环境解释来创建一个带有一些预定义行为的对象。 一个独立的QML组件可以运行多次来禅城多个对象,每个对象都可以称为该组件的实例。 例子: 在项目中添加一…...
canvas 学习指南
canvas 学习指南 创建一个 canvas <! DOCTYPE html><html xmlns"http://www.w3.org/1999/xhtml"><head><title></title><meta charset"utf-8" /><script type"text/javascript">window.onload fun…...
【华为OD机试2023】开心消消乐 C++
【华为OD机试2023】开心消消乐 C++ 前言 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优),不能保证通过率。 Tips1:机试为ACM 模式 你的代码需要处理输入输出,input/cin接收输入、print/cou…...
学历?能力?
一个面试官愿意看一张有形的总结报告,还是愿意相信看不到的人品?...
使用ECharts打造一个数据可视化面板
使用ECharts打造一个数据可视化面板1. 使用技术2. 案例适配方案3. 基础设置4. header 布局5. mainbox 主体模块6. 公共面板模块 panel7. 柱形图 bar 模块(布局)8. 中间布局9. ECharts 介绍10. ECharts 体验11. ECharts 基础配置12. 柱状图图表࿰…...
【论文简述】PVSNet: Pixelwise Visibility-Aware Multi-ViewStereo Network(arxiv 2020)
一、论文简述 1. 第一作者:Qingshan Xu 2. 发表年份:2020 3. 发表期刊:arxiv 4. 关键词:MVS、3D重建、可见性、代价体、训练策略 5. 探索动机:ETH3D基准测试提供的图像包含强烈的视图变化,这就要求MVS…...
CSS隐藏元素的几种方式以及display、visibility、opacity的区别
CSS隐藏元素的方式首先最通用且最易想到的方法肯定是display、visibility和opacity这三种了display:none设置元素不可见并且连盒模型也不生成,一般用于不占空间的隐藏元素。display属性规定元素应该生成的框的类型,当其值为“none”时可以规定元素不生成…...
【Java|golang】1487. 保证文件名唯一---golang中string方法的坑
给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹。 由于两个文件 不能 共享相同的文件名,因此如果新建文件夹使用的文件名已经被占用,系统会以 (k) 的形式为新…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
