Java - 数组 Array

一、概念

结构是一种线性表(元素排列成直线的结构),创建数组会开辟一块连续的内存空间,长度固定无法更改,元素可以重复且只能是同一种类型(Object类型数组除外)。
优点查询快:由于元素是连续存储的,带有索引查询起来快。
缺点增删慢:由于初始化后长度固定无法更改,增删元素只能用一个新的数组去存储。

二、一维数组

2.1 初始化

动态初始化指定数组长度,元素由系统分配(值都为null)。
格式:数据类型[] 数组名称= new 数据类型[元素个数]
静态初始化指定元素,长度由系统分配。
数据类型[] 数组名称 = { 元素1, 元素2, 元素3 }
//动态初始化
int[] arr = new int[5];    //推荐
int arr[] = new int[5];
//静态初始化
int[] arr = { 1, 2, 3 }    //推荐
int[] arr = new int[] { 1, 2, 3 }

2.2 获取、赋值

int x = arr[1] //获取元素
arr[2] = 4    //对元素赋值
int len = arr.length    //获取数组长度
int[] arr2 = arr    //复制数组,只是赋值了引用,并没有创建新数组,对arr中元素的修改会影响arr2

2.3 增删

数组长度不可改变,在处理固定大小数据的时候性能更好,有增删需求推荐使用 ArrayList,否则需要遍历旧数组对元素进行操作后存储到新数组中,或者遍历旧数组对目标元素位置后面的元素索引+1或-1即整体向前或向后移动1位。

2.4 遍历

for(int i = 0; i < arr.length; i++)    //for循环
for(int i : arr)    //for-each循环

2.5 查找

2.5.1 顺序查找

从头到尾遍历,返回值在数组中第一次出现的位置(即使有相同的元素)。

public int getIndex(int[] arr, int targetValue) {
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == targetValue) {
            return i;
        }
    }
    return -1;    //索引不存在负数,以此表达无结果
}

2.5.2 折半查找 / 二分查找

适用于数组中元素数量较大时,但必须保证元素是排好序的(升序、降序)。

//方式一
public int halfSearch(int[] arr, int targetValue) {
    int min = 0;   //最小索引
    int max = arr.length - 1;  //最大索引
    int mid = (min + max) / 2 ; //中间值索引
    while (arr[mid] != targetValue) {
        if (arr[mid] < targetValue) {
            min = mid + 1;
        } else if (arr[mid] > targetValue) {
            max = mid - 1;
        }
        if (min > max) return -1;   //最值交叉无法折半,没有找到
        mid = (min + max) / 2;
    }
    return mid;
}
//方式二
public int halfSearch2(int[] arr, int targetValue) {
    int min = 0;   //最小索引
    int max = arr.length - 1;  //最大索引
    while(min <= max) {
        int mid = (min + max) / 2 ; //中间值索引
        if (arr[mid] < targetValue) {
            min = mid + 1;
        } else if (arr[mid] > targetValue) {
            max = mid - 1;
        } else {
            return mid;
        } 
    }
    return -1;    //若想把 targetValue 插入还保持数组有序,则 -1 改为 min
}

2.6 排序

实际开发中直接用 Arrays.sort(arr)

2.6.1 选择排序

内循环一次,最值出现在头部索引位置。

public void selectSort(int[] arr) {
    //-1是最后一个元素不跟自己比较
    for (int i = 0; i < arr.length -1; i++) {
        //j+1是避免第一个元素跟自己比较
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {    //改成 < 则是从小到大排序
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

2.6.2 冒泡排序

内循环一次,最值出现在尾部索引位置。有N个元素排序,外循环 N-1 次,内循环 N-i-1 次。

public void bubbleSort(int[] arr) {
    //-1是最后一个元素不跟自己比较
    for (int i = 0; i < arr.length - 1; i++) {
        //j=0是每次从0开始比较,-i是每一轮元素减少1个,-1是避免索引越界
        for (int j = 0; j < arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {    //改成 < 则是从小到大排序
                //将两个元素互换位置
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

三、二维数组

(一维)数组中的每个元素也是一个(二维)数组。

3.1 命名格式

//正确写法
int[][] arr1 = new int[3][2];
//以下两种IDE会提示是C语言风格,让写成第一种
int arr2 [][] = new int[3][2];
int[] arr3[] = new int[3][2];
//以下这种IDE也会提示C语言风格,a和b是两个变量,a是一维数组,b是二维数组
int[]x,y[] = new int[3][2];
//会让写成这样
int[]a;
int[][] b = new int[3][2];

3.2 初始化

int[][] arr1 = new int[3][2];
System.out.println(arr1[1]);    //打印一维数组元素默认值为内存地址值
System.out.println(arr1[1][1]); //打印二维数组元素默认值为0
int[][] arr2 = new int[3][];
System.out.println(arr2[1]);    //打印一维数组元素默认值为null
System.out.println(arr2[1][1]); //打印二维数组元素报错,因为一维元素是null
arr2[0] = new int[2];   //对二维数组元素赋值后,打印一维数组元素默认值为地址值,二维数组元素默认值为0
int[][] arr3 = { {1,2},{3,4},{5,6} };   //打印一维数组元素默认值为地址值

3.3 遍历

for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[i].length; j++) {
        
    }
}

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

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

相关文章

二手手机回收平台系统|基于JSP技术+ Mysql+Java+ B/S结构的二手手机回收平台系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

代码中加了@ApiModelProperty注解,swagger不显示注释?

前言 今天接了一个需求&#xff0c;因为只是涉及到字段内容的更改&#xff0c;就把以前的接口copy过来&#xff0c;只改了一个sql。结果后面和前端联调的时候&#xff0c;前端告诉我swagger返回的字段没有注释&#xff0c;我寻思我家里swagger的注解&#xff0c;为什么没显示呢…

类和对象详解

目录 1.面向对象 1.1什么是面向对象 1.2与面向过程的比较 2类的定义和使用 2.1简单认识类 2.2类的定义格式 2.3类的实例化 2.3.1什么是实例化 2.3.2类和对象的说明 2.3.3this关键字 2.3.4什么是this引用 2.3.5this引用的特性 3.对象的构造和实例化 3.1对象的初始化…

AIOCR:AI文字识别web集成系统@Kylin+RISCV

基于kotti_ai的AI文字识别web集成系统 AIOCR项目目标&#xff1a; 在KylinRISCV搭建一个kotti_ai构架的网站&#xff0c;提供AI OCR文字识别web服务。 二期目标&#xff1a;在AIOCR的基础上提供chatgpt和文心一言等大模型调用&#xff0c;建立综合大模型应用平台。 功能&am…

【链表】算法例题

目录 八、 链表 57. 环形链表 ① 58. 两数相加 ② √ 59. 合并两个有序链表 ① √- 60. 随机链表的复制 ② 61. 反转链表II ② 62. K个一组翻转链表 ③ 63. 删除链表的倒数第N个结点 ② √- 64. 删除排序链表中的重复元素II ② √- 65. 旋转链表 ② √- 66. 分隔链…

腾讯云服务器如何购买省钱?2024年优惠券和优惠活动整理

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

基于torch.compile和gptfast代码风格实现ChatGLM模型推理加速

目录 一、ChatGLM模型代码重构迁移 二、推理的代码重构 三、效果分析对比 参考文章 torch2.0发布以后模型训练和推理可以实现一行代码加速&#xff0c;试用之后发现效果并不明显。随后gptfast项目也发布&#xff0c;表明它确实是可以实现模型推理的加速&#xff0c;看来之前…

c/c++ 深拷贝和浅拷贝

深拷贝与浅拷贝 深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是对象复制的两种不同方式&#xff0c;它们涉及到对象成员数据的复制方式和内存管理。 浅拷贝&#xff08;Shallow Copy&#xff09;&#xff1a; 浅拷贝是指将一个对象的…

投资400亿美元!人工智能或将诞生超级大国

据外媒报道&#xff0c;沙特阿拉伯政府计划设立约 400 亿美元的基金来投资人工智能&#xff0c;如此规模的基金将成为迄今为止全球最大的专注于人工智能发展的基金之一。 据知情人士透露&#xff0c;该基金长期以来一直被硅谷用来为科技初创企业提供资金&#xff0c;甚至一度是…

在线教育话术(1W字精选)

产品结构图 Nginx实现代理 问&#xff1a;我们在本机的host文件中配置了域名映射&#xff0c;都是同一个服务器。我们只需要输入对应的域名就可以到对应的界面&#xff0c;这是怎么实现的&#xff1f; 答&#xff1a;主要就是通过Nginx反向代理来实现的&#xff0c;Nginx会先…

【go语言开发】性能分析工具pprof使用

本文主要介绍如何在项目中使用pprof工具。首先简要介绍pprof工具的作用&#xff1b;然后介绍pprof的应用场景&#xff0c;主要分为工具型应用和服务型应用。最后数据分析项目&#xff0c;先采集项目信息&#xff0c;再可视化查看 文章目录 前言应用场景工具型应用服务型应用 数…

基于补丁方式修复 nginx漏洞 缓冲区错误漏洞(CVE-2022-41741)、越界写入漏洞(CVE-2022-41742)

nginx1.22.0版本漏洞 CVE-2022-41741 、CVE-2022-41742 漏洞描述 1、nginx 缓冲区错误漏洞(CVE-2022-41741) 此插件基于版本检测&#xff0c;有可能误报&#xff0c;未开启 MP4 模块的nginx属于误报&#xff0c;请忽略该漏洞。Nginx是美国Nginx公司的一款轻量级Web服务器/反…

Jmeter Ultimate Thread Group 和 Stepping Thread Group

线程组&#xff1a;使用复杂场景的性能测试 有时候我们做性能测试时&#xff0c;只依靠自带的线程组&#xff0c;显示满足不了性能测试中比较复杂的场景&#xff0c;下面这两种线程组可以帮助你很好的完成复杂的场景 第一种&#xff1a;Stepping Thread Group 在取样器错误后…

2024年【安全员-C证】考试资料及安全员-C证新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证考试资料是安全生产模拟考试一点通生成的&#xff0c;安全员-C证证模拟考试题库是根据安全员-C证最新版教材汇编出安全员-C证仿真模拟考试。2024年【安全员-C证】考试资料及安全员-C证新版试题 1、【多选题…

Java基础入门day17

day17 复习二分查找java package com.saas; ​ public class BinarySearch { ​public static void main(String[] args) {int[] nums {12, 21, 33, 77, 89, 90}; ​System.out.println(binarySearch(nums, 21));} ​public static int binarySearch(int[] arrs, int target)…

springBoot项目,无配置中心,怎么实现类似功能

实现EnvironmentPostProcessor import cn.hutool.http.HttpUtil; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.boot.env.YamlPropertySourceLoader; import org.springfr…

springboot企业级抽奖项目业务一(登录模块)

开发流程 该业务基于rouyi生成好了mapper和service的代码&#xff0c;现在需要在controller层写接口 实际操作流程&#xff1a; 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口文档 在登录模块有登录和登出方…

在windows上安装Jenkins

jenkins安装 下载jenkins 官网&#xff1a;Jenkins download and deployment 官方文档说明&#xff1a;Jenkins User Documentation 安装jenkins1.点击下载好的安装包&#xff0c;点击Next 2.选择一个安装路径 如果系统是windows家庭版打不开策略就创建一个txt文件&#xff0c…

Android分区存储到底该怎么做

文章目录 一、Android存储结构二、什么是分区存储&#xff1f;三、私有目录和公有目录三、存储权限和分区存储有什么关系&#xff1f;四、我们应该该怎么做适配&#xff1f;4.1、利用File进行操作4.2、使用MediaStore操作数据库 一、Android存储结构 Android存储分为内部存储和…

NBlog Java定时任务-备份MySQL数据

NBlog部署维护流程记录&#xff08;持续更新&#xff09;&#xff1a;https://blog.csdn.net/qq_43349112/article/details/136129806 为了避免服务器被攻击&#xff0c;给博客添加了一个MySQL数据备份功能。 此功能是配合博客写的&#xff0c;有些方法直接用的已有的&#xf…