当前位置: 首页 > news >正文

数据结构---数组

一、基本概念

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] = 值

  • 删除数组中元素(假删除----空间未被删除)

  • 数组的遍历:将数组中的元素一一打印出来

数组最大的优点:快速查询

三、数组的基本操作 

  1. 构造函数

    public MyArray(int capacity) {//  判断容量if (capacity < 0) {this.capacity = 10;} else {this.capacity = capacity;}this.size = 0;this.data = (T[]) (new Object[this.capacity]);//  为泛型数组赋值
    }
  2. 获取数组中实际存放元素的个数

    public int getSize() {return this.size;
    }
  3. 获取数组的容积 

    public int getCapacity() {return this.capacity;
    }
  4. 判断数组是否为空

    public boolean isEmpty() {return this.size == 0;
    }
  5. 向数组中添加元素

    public void add(T item) {//  this.size  指向的是待插入元素的位置addIndex(this.size, item);
    }
    ​
  6. 向数组中添加元素(头部)

    public void addHead(T item) {addIndex(0, item);
    }
  7. 根据索引修改值

    public void setValByIndex(int index, T val) {//  判断索引范围  不符合抛出异常if (index < 0 || index >= this.size) {throw new IllegalArgumentException("index is invalid");}this.data[index] = val;
    }
  8. 扩容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;
    }
  9. 向数组中在指定位置添加元素

    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++;
    }
    ​
  10. 修改指定位置的值

    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;//  修改指定位置的值
    }
  11. 获取指定索引位置的值

    public T getValueByIndex(int index) {//  入参判断--对输入的参数进行判断    参数有误抛异常(index is invlid.)if (index < 0 || index >= this.capacity) {throw new IllegalArgumentException("index is invlid.");}return this.data[index];//  返回指定索引的值
    }
    ​
  12. 查询指定的值在数组是否存在

    public int containsValue(T val) { //  遍历数组    返回对应索引  使用比较函数    如存在,获取索引,否则返回-1for (int i = 0; i < this.size; i++) {if (val.equals(this.data[i])) {return i;}}return -1;
    }
  13. 根据索引删除从数组中删除元素

    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;//  返回删除的值
    }
  14. 重写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();//  返回字符串
    }
  15. 将一个数组转换为字符串

//  将一个数组转换成字符串
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
  1. 向原数组中继续添加一个元素,就会越界(解决办法:扩容)
  2. 只能处理int类型,如何处理多种类型---(解决方法:使用泛型)
  3. 删除元素后,空间利用率低(解决方法:减少容量)

相关文章:

数据结构---数组

一、基本概念 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&#xff1a; fetchSql用于直接返回SQL而不是执行查询&#xff0c;适用于任何的CURD操作方法。 例如&#xff1a; $result Db::table(think_user)->fetchSql(true)->find(1);输出result结果为&#xff1a; SELECT * FROM think_user where id 1 force&#…...

为什么要用B+树

B树的优势 支持范围查询&#xff1a;B树在进行范围查询时&#xff0c;只需要从根节点一直遍历到叶子节点&#xff0c;因为数据都存储在叶子节点上&#xff0c;而且叶子节点之间有指针连接&#xff0c;可以很方便的进行范围查询 支持排序&#xff1a;B树的叶子节点按照关键字顺…...

Android 通过adb命令查看应用流量

一. 获取应用pid号 通过adb shell ps -A | grep 包名 来获取app的 pid号 二. 查看应用流量情况 使用adb shell cat /proc/#pid#/net/dev 命令 来获取流量数据 备注&#xff1a; Recevice: 表示收包 Transmit: 表示发包 bytes: 表示收发的字节数 packets: 表示收发正确的…...

超全的测试类型详解,再也不怕面试答不出来了!

在软件测试工作过程中或者在面试过程中经常会被问到一些看起来简单但是总是有些回答不上的问题&#xff0c;比如你说说“黑盒测试和白盒测试的区别&#xff1f;”&#xff0c;“你们公司做灰度测试么&#xff1f;", ”α测试和β测试有什么不一样&#xff1f;“&#xff0…...

【Linux】

Linux零基础入门 列出文件/文件夹新建/切换路径查看当前路径重命名或者移动文件夹拷贝文件/文件夹删除文件夹设置环境变量编辑文本文件压缩和解压查看cpu的信息查看/杀死进程查看进程的CPU和内存占用重定向日志场景一场景二场景三场景四 列出文件/文件夹 命令&#xff1a;Ls(L…...

「 网络安全常用术语解读 」网络攻击者的战术、技术和常识知识库ATTCK详解

引言&#xff1a;随着网络攻击手段的不断升级和多样化&#xff0c;网络安全领域面临着越来越严峻的挑战。为了帮助网络安全专业人员更好地识别和防御网络攻击&#xff0c;MITRE公司创建了ATT&CK框架&#xff0c;以提供一个统一且结构化的方法来描述网络攻击者的行为和技巧。…...

Java.lang.Integer类详解

Java.lang.Integer类详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在今天的文章中&#xff0c;我们将深度解析Java中的一个重要类——java.lang.Integer&…...

GitFlow工作流

基于 Git 这一版本控制系统&#xff0c;通过定义不同的分支&#xff0c;探索合适的工作流程来完成开发、测试、修改等方面的需求。 例如&#xff1a;在开发阶段&#xff0c;创建 feature 分支&#xff0c;完成需求后&#xff0c;将此分支合并到 develop 分支上&#xff1b;在发…...

GitHub Copilot 与 OpenAI ChatGPT 的区别及应用领域比较

GitHub Copilot 和 OpenAI ChatGPT 都是近年来颇受关注的人工智能项目&#xff0c;它们在不同领域中的应用继续引发热议。本文旨在分析和比较这两个项目的区别&#xff0c;从技术原理、应用场景、能力和限制、输出结果、能力与限制和发展前景等方面进行综合评估&#xff0c;帮助…...

【C++】类和对象(上篇)

文章目录 &#x1f6df;一、面向过程和面向对象初步认识&#x1f6df;二、类的引入&#x1f6df;三、类的定义&#x1f4dd;1、类的两种定义方式&#x1f4dd;2、成员变量命名规则的建议 &#x1f6df;四、类的访问限定符及封装&#x1f369;1、访问限定符&#x1f369;2、封装…...

甜蜜而简洁——深入了解Pytest插件pytest-sugar

在日常的软件开发中,测试是确保代码质量的关键步骤之一。然而,对于测试报告的生成和测试结果的可读性,一直以来都是开发者关注的焦点。Pytest插件 pytest-sugar 以其清晰而美观的输出,为我们提供了一种愉悦的测试体验。本文将深入介绍 pytest-sugar 插件的基本用法和实际案…...

SpringBoot3整合OpenAPI3(Swagger3)

文章目录 一、引入依赖二、使用1. OpenAPIDefinition Info2. Tag3. Operation4. Parameter5. Schema6. ApiResponse swagger2更新到3后&#xff0c;再使用方法上发生了很大的变化&#xff0c;名称也变为OpenAPI3。 官方文档 一、引入依赖 <dependency><groupId>…...

2023美赛各题分析,2024美赛数学建模思路解析2.2日第一时间更新

目录 2024美赛数学建模各题思路模型代码&#xff1a;开赛后第一时间更新&#xff0c;更新见文末 一、2023题目重述 拟解决的问题 我们的工作&#xff1a; 二、模型和计算 1.数据预处理 2.报告数量区间预测模型 3.猜词结果分布预测模型 2024美赛数学建模交流&#xff0…...

分享一个学习git的网站

Learn Git Branching...

用户拉新的4大关键策略,照着做就对了!

今天给大家分享用户拉新的4个关键策略&#xff0c;掌握了这些策略&#xff0c;不仅有助于增加用户数量&#xff0c;还能让对方成为你忠实的粉丝。 1、制定明确的目标&#xff1a;在开始拉新之前&#xff0c;你需要明确自己的目标。你想要吸引什么样的用户&#xff1f;你希望他…...

如何用“VMware安装Ubuntu”win11系统?

一、 下载Ubuntu 企业开源和 Linux |Ubuntu的 二、 安装 三、 启动虚拟机 选中Try or Install Ubuntu Server&#xff0c;按回车...

ZJOI2009 对称的正方形

P2601 [ZJOI2009] 对称的正方形 题目大意 给定一个 n m n\times m nm的矩阵&#xff0c;求这个矩阵中满足上下对称且左右对称的正方形子矩阵的个数。 1 ≤ n , m ≤ 1000 1\leq n,m\leq 1000 1≤n,m≤1000 题解 首先&#xff0c;我们对原矩阵、左右翻转后的矩阵、上下翻转后…...

大模型学习与实践笔记(十一)

一、使用OpenCompass 对模型进行测评 1.环境安装&#xff1a; git clone https://github.com/open-compass/opencompass cd opencompass pip install -e . 当github超时无法访问时&#xff0c;可以在原命令基础上加上地址&#xff1a; https://mirror.ghproxy.com git clon…...

Elasticsearch+Kibana 学习记录

文章目录 安装Elasticsearch 安装Kibana 安装 Rest风格API操作索引基本概念示例创建索引查看索引删除索引映射配置&#xff08;不配置好像也行、智能判断&#xff09;新增数据随机生成ID自定义ID 修改数据删除数据 查询基本查询查询所有&#xff08;match_all&#xff09;匹配查…...

velocity-subtemplate-variable-fix

为什么你的 Velocity 子模板变量总是失效&#xff1f;一行代码解决了阅读前提&#xff1a;你正在用 Velocity 做模板引擎开发&#xff0c;主模板能正常渲染&#xff0c;但子模板里一用变量就报空指针或者路径找不到。先说我的血泪史 昨晚被一个问题折磨了两个小时&#xff1a; …...

Oracle数据库架构入门概述

本文分为四个部分简单概述 一、入门概述 二、数据库实例简述 三、数据库物理存储和逻辑存储结构简述 四、网络体系结构概述 入门概述 Oracle 数据库服务器包括一个数据库和至少一个数据库实例 &#xff08;通常是指只有一个实例&#xff09;。 因为实例和数据库关联紧密&#x…...

深度解析IDM激活脚本:注册表锁定技术的完整实现指南

深度解析IDM激活脚本&#xff1a;注册表锁定技术的完整实现指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager&#xff08;IDM&…...

别光看原理了!用STM32F407从零撸一个四轴飞控代码(附完整工程)

用STM32F407从零构建四轴飞控代码实战指南 当你在论坛上看到别人分享的无人机飞行视频&#xff0c;是否也曾心动想亲手打造一套自己的飞控系统&#xff1f;市面上大多数教程止步于理论讲解&#xff0c;真正落实到代码层面的少之又少。本文将带你用STM32F407开发板&#xff0c;…...

LEDPatternLib:非阻塞LED动画库设计与嵌入式实践

1. 项目概述LEDPatternLib 是一款面向嵌入式 LED 动画控制的轻量级、模块化 Arduino 库&#xff0c;专为资源受限的微控制器平台设计。其核心目标并非替代底层驱动&#xff0c;而是构建在成熟硬件抽象层之上的非阻塞&#xff08;non-blocking&#xff09;模式动画调度框架。该库…...

避坑指南:.NET MAUI页面跳转最常见的5个坑点及解决方案(2023最新版)

.NET MAUI页面导航避坑实战&#xff1a;5个高频问题与工业级解决方案 刚接触.NET MAUI的开发者常会在页面跳转环节踩坑——传参莫名丢失、导航堆栈突然崩溃、模态窗口关闭失效...这些问题往往消耗大量调试时间。本文将结合GitHub高星issue和StackOverflow热帖&#xff0c;拆解5…...

MybatisPlus分页插件PaginationInnerInterceptor原理解析与实战配置指南

MybatisPlus分页插件PaginationInnerInterceptor深度剖析与高效实践 当你在Spring Boot项目中处理海量数据时&#xff0c;分页查询就像给数据装上精准导航——而MybatisPlus的PaginationInnerInterceptor正是这个导航系统的核心引擎。不同于简单配置就能用的工具类&#xff0c;…...

Windows下BERTopic安装避坑指南:解决hdbscan报错(附Python 3.8环境配置)

Windows下BERTopic安装避坑指南&#xff1a;解决hdbscan报错&#xff08;附Python 3.8环境配置&#xff09; 第一次在Windows上安装BERTopic时&#xff0c;那个红色的hdbscan报错信息让我盯着屏幕发了十分钟呆。作为一款强大的主题建模工具&#xff0c;BERTopic的安装本不该如此…...

ESLyric歌词源高效配置与避坑指南:Foobar2000用户进阶教程

ESLyric歌词源高效配置与避坑指南&#xff1a;Foobar2000用户进阶教程 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource ESLyric-LyricsSource是Foobar2000…...

LFM2.5-1.2B-Thinking-GGUF应用场景:智能硬件说明书问答机器人落地实践

LFM2.5-1.2B-Thinking-GGUF应用场景&#xff1a;智能硬件说明书问答机器人落地实践 1. 项目背景与需求 在智能硬件领域&#xff0c;产品说明书往往存在以下痛点&#xff1a; 内容专业术语多&#xff0c;普通用户难以理解纸质说明书查找信息效率低不同型号产品差异导致用户混…...