数据结构---数组
一、基本概念
1. 存放一组相同数据类型的集合
2.在内存中,分配连续的空间,数组创建时要指定大小
3. 定义 数据类型 [] 数组名
// 1.定义一个数组,里面的元素包含10, 20, 24, 17, 35, 58, 45, 74 int arr[] = {10, 20, 24, 17, 35, 58, 45, 74};
4. 获取数组的长度
int length = arr.length;
5.获取数组中指定位置的元素
int number = arr[1];// 第2个位置的值
6.修改数组中指定位置的元素
arr[2] = 100;// 将第三位的数字改为100
7.数组排序
Arrays.sort(arr);
8.遍历数组
for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]); }
9.索引从0开始,最大为数组长度-1
10.访问数组中元素需要通过索引
11.常见的错误:NULLPointException(空指针异常) ArrayIndexOutofBoundsException(数组索引越界)
System.out.println(arr[length]);// ArrayIndexOutofBoundsException(数组索引越界)
12.常见的数组:字符串,对象数组,哈希表
二、Java数组的特点
<1>数组在内存中连续分配
<2>创建数组时要指明数组的大小
<3>如何访问数组,通过索引,索引从0开始,到数组的长度-1
<4>使用索引
获取指定索引位置的值 arr[index]
修改指定索引位置的值 arr[index] = 值
删除数组中元素(假删除----空间未被删除)
数组的遍历:将数组中的元素一一打印出来
数组最大的优点:快速查询
三、数组的基本操作
-
构造函数
public MyArray(int capacity) {// 判断容量if (capacity < 0) {this.capacity = 10;} else {this.capacity = capacity;}this.size = 0;this.data = (T[]) (new Object[this.capacity]);// 为泛型数组赋值 } -
获取数组中实际存放元素的个数
public int getSize() {return this.size; } -
获取数组的容积
public int getCapacity() {return this.capacity; } -
判断数组是否为空
public boolean isEmpty() {return this.size == 0; } -
向数组中添加元素
public void add(T item) {// this.size 指向的是待插入元素的位置addIndex(this.size, item); } -
向数组中添加元素(头部)
public void addHead(T item) {addIndex(0, item); } -
根据索引修改值
public void setValByIndex(int index, T val) {// 判断索引范围 不符合抛出异常if (index < 0 || index >= this.size) {throw new IllegalArgumentException("index is invalid");}this.data[index] = val; } -
扩容resize(自定义扩容函数)
private void resize(int newCapacity) {System.out.println("resize:" + newCapacity);// 打印数组的新容量T[] newData = (T[]) (new Object[newCapacity]);// 创建一个新的泛型数组并赋值// 将原数组中元素加到新数组for (int i = 0; i < this.size; i++) {newData[i] = this.data[i];}// 改变容量与容积this.data = Arrays.copyOf(newData, newCapacity);this.capacity = newCapacity; } -
向数组中在指定位置添加元素
public void addIndex(int index, T val) {// 判断索引范围 不符合抛出异常if (index < 0 || index > this.size) {throw new IllegalArgumentException("index is invalid");}//判断数组是否满if (this.size == this.capacity) {// 扩容 resize 容积扩一倍capacity *= 2;System.out.println("resize:" + capacity);// 打印数组的新容量this.data = Arrays.copyOf(data, capacity * 2);// 使用数组复制函数//resize(this.capacity * 2);// 使用自定义函数}//从index位置开始,元素需要进行后移for (int i = this.size - 1; i >= index; i--) {this.data[i + 1] = this.data[i];}// 向指定位置添加元素this.data[index] = val;//更新this.sizethis.size++; } -
修改指定位置的值
public void modifyValueByIndex(int index, T value) {// 入参判断--对输入的参数进行判断 参数有误抛异常(index is invlid.)if (index < 0 || index >= this.capacity) {throw new IllegalArgumentException("index is invlid.");}this.data[index] = value;// 修改指定位置的值 } -
获取指定索引位置的值
public T getValueByIndex(int index) {// 入参判断--对输入的参数进行判断 参数有误抛异常(index is invlid.)if (index < 0 || index >= this.capacity) {throw new IllegalArgumentException("index is invlid.");}return this.data[index];// 返回指定索引的值 } -
查询指定的值在数组是否存在
public int containsValue(T val) { // 遍历数组 返回对应索引 使用比较函数 如存在,获取索引,否则返回-1for (int i = 0; i < this.size; i++) {if (val.equals(this.data[i])) {return i;}}return -1; } -
根据索引删除从数组中删除元素
public T removeByIndex(int index) {// 入参判断--对输入的参数进行判断 参数有误抛异常(index is invlid.)if (index < 0 || index >= this.size) {throw new IllegalArgumentException("index is invlid.");} // 删除操作的核心/*** 1.找到删除的位置* 2.删除位置之后的元素要前移 arr[j-1] = arr[j]*/T delValue = this.data[index];// 获取要删除索引的值for (int i = index + 1; i < this.size; i++) {this.data[i - 1] = this.data[i];}// 更新数组索引this.size--;// 判断是否缩容if (this.size < this.capacity / 4 && this.capacity / 2 > 0) {capacity /= 2;this.data = Arrays.copyOf(data, capacity);//resize(this.capacity / 2);// 使用自己编写的缩容函数}return delValue;// 返回删除的值 } -
重写toString---ctrl+O
@Override public String toString() {// [1,2,3,4,5]StringBuilder sb = new StringBuilder("[");// 遍历将数据逐个拼接 中间用逗号隔开for (int i = 0; i < this.size; i++) {sb.append(this.data[i]);if (i != this.size - 1) {sb.append(",");}}sb.append("]");return sb.toString();// 返回字符串 } -
将一个数组转换为字符串
// 将一个数组转换成字符串
int[] res = {1, 2, 3, 4, 5};
// 方式1
String temp = Arrays.toString(res);
System.out.println(temp);// [1, 2, 3, 4, 5]
// 方式2
temp = Arrays.stream(res).boxed().map(Objects::toString).collect(Collectors.joining(""));
System.out.printf(temp);// 12345
- 向原数组中继续添加一个元素,就会越界(解决办法:扩容)
- 只能处理int类型,如何处理多种类型---(解决方法:使用泛型)
- 删除元素后,空间利用率低(解决方法:减少容量)
相关文章:
数据结构---数组
一、基本概念 1. 存放一组相同数据类型的集合 2.在内存中,分配连续的空间,数组创建时要指定大小 3. 定义 数据类型 [] 数组名 // 1.定义一个数组,里面的元素包含10, 20, 24, 17, 35, 58, 45, 74 int arr[] {10, 20, 24, 17, 35, 58, 45, 74}; 4. 获取数组的长度 int lengt…...
知识笔记(八十四)———链式语句中fetchSql和force和bind用法
fetchSql: fetchSql用于直接返回SQL而不是执行查询,适用于任何的CURD操作方法。 例如: $result Db::table(think_user)->fetchSql(true)->find(1);输出result结果为: SELECT * FROM think_user where id 1 force&#…...
为什么要用B+树
B树的优势 支持范围查询:B树在进行范围查询时,只需要从根节点一直遍历到叶子节点,因为数据都存储在叶子节点上,而且叶子节点之间有指针连接,可以很方便的进行范围查询 支持排序:B树的叶子节点按照关键字顺…...
Android 通过adb命令查看应用流量
一. 获取应用pid号 通过adb shell ps -A | grep 包名 来获取app的 pid号 二. 查看应用流量情况 使用adb shell cat /proc/#pid#/net/dev 命令 来获取流量数据 备注: Recevice: 表示收包 Transmit: 表示发包 bytes: 表示收发的字节数 packets: 表示收发正确的…...
超全的测试类型详解,再也不怕面试答不出来了!
在软件测试工作过程中或者在面试过程中经常会被问到一些看起来简单但是总是有些回答不上的问题,比如你说说“黑盒测试和白盒测试的区别?”,“你们公司做灰度测试么?", ”α测试和β测试有什么不一样?“࿰…...
【Linux】
Linux零基础入门 列出文件/文件夹新建/切换路径查看当前路径重命名或者移动文件夹拷贝文件/文件夹删除文件夹设置环境变量编辑文本文件压缩和解压查看cpu的信息查看/杀死进程查看进程的CPU和内存占用重定向日志场景一场景二场景三场景四 列出文件/文件夹 命令:Ls(L…...
「 网络安全常用术语解读 」网络攻击者的战术、技术和常识知识库ATTCK详解
引言:随着网络攻击手段的不断升级和多样化,网络安全领域面临着越来越严峻的挑战。为了帮助网络安全专业人员更好地识别和防御网络攻击,MITRE公司创建了ATT&CK框架,以提供一个统一且结构化的方法来描述网络攻击者的行为和技巧。…...
Java.lang.Integer类详解
Java.lang.Integer类详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在今天的文章中,我们将深度解析Java中的一个重要类——java.lang.Integer&…...
GitFlow工作流
基于 Git 这一版本控制系统,通过定义不同的分支,探索合适的工作流程来完成开发、测试、修改等方面的需求。 例如:在开发阶段,创建 feature 分支,完成需求后,将此分支合并到 develop 分支上;在发…...
GitHub Copilot 与 OpenAI ChatGPT 的区别及应用领域比较
GitHub Copilot 和 OpenAI ChatGPT 都是近年来颇受关注的人工智能项目,它们在不同领域中的应用继续引发热议。本文旨在分析和比较这两个项目的区别,从技术原理、应用场景、能力和限制、输出结果、能力与限制和发展前景等方面进行综合评估,帮助…...
【C++】类和对象(上篇)
文章目录 🛟一、面向过程和面向对象初步认识🛟二、类的引入🛟三、类的定义📝1、类的两种定义方式📝2、成员变量命名规则的建议 🛟四、类的访问限定符及封装🍩1、访问限定符🍩2、封装…...
甜蜜而简洁——深入了解Pytest插件pytest-sugar
在日常的软件开发中,测试是确保代码质量的关键步骤之一。然而,对于测试报告的生成和测试结果的可读性,一直以来都是开发者关注的焦点。Pytest插件 pytest-sugar 以其清晰而美观的输出,为我们提供了一种愉悦的测试体验。本文将深入介绍 pytest-sugar 插件的基本用法和实际案…...
SpringBoot3整合OpenAPI3(Swagger3)
文章目录 一、引入依赖二、使用1. OpenAPIDefinition Info2. Tag3. Operation4. Parameter5. Schema6. ApiResponse swagger2更新到3后,再使用方法上发生了很大的变化,名称也变为OpenAPI3。 官方文档 一、引入依赖 <dependency><groupId>…...
2023美赛各题分析,2024美赛数学建模思路解析2.2日第一时间更新
目录 2024美赛数学建模各题思路模型代码:开赛后第一时间更新,更新见文末 一、2023题目重述 拟解决的问题 我们的工作: 二、模型和计算 1.数据预处理 2.报告数量区间预测模型 3.猜词结果分布预测模型 2024美赛数学建模交流࿰…...
分享一个学习git的网站
Learn Git Branching...
用户拉新的4大关键策略,照着做就对了!
今天给大家分享用户拉新的4个关键策略,掌握了这些策略,不仅有助于增加用户数量,还能让对方成为你忠实的粉丝。 1、制定明确的目标:在开始拉新之前,你需要明确自己的目标。你想要吸引什么样的用户?你希望他…...
如何用“VMware安装Ubuntu”win11系统?
一、 下载Ubuntu 企业开源和 Linux |Ubuntu的 二、 安装 三、 启动虚拟机 选中Try or Install Ubuntu Server,按回车...
ZJOI2009 对称的正方形
P2601 [ZJOI2009] 对称的正方形 题目大意 给定一个 n m n\times m nm的矩阵,求这个矩阵中满足上下对称且左右对称的正方形子矩阵的个数。 1 ≤ n , m ≤ 1000 1\leq n,m\leq 1000 1≤n,m≤1000 题解 首先,我们对原矩阵、左右翻转后的矩阵、上下翻转后…...
大模型学习与实践笔记(十一)
一、使用OpenCompass 对模型进行测评 1.环境安装: git clone https://github.com/open-compass/opencompass cd opencompass pip install -e . 当github超时无法访问时,可以在原命令基础上加上地址: https://mirror.ghproxy.com git clon…...
Elasticsearch+Kibana 学习记录
文章目录 安装Elasticsearch 安装Kibana 安装 Rest风格API操作索引基本概念示例创建索引查看索引删除索引映射配置(不配置好像也行、智能判断)新增数据随机生成ID自定义ID 修改数据删除数据 查询基本查询查询所有(match_all)匹配查…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
鸿蒙Navigation路由导航-基本使用介绍
1. Navigation介绍 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(Nav…...
