6.Java数组

news2025/1/16 3:49:53

数组

一、数组概述

1、什么是数组?

数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。

2、数组的特点

  • 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
  • 其元素必须是相同类型,不允许出现混合类型。元素的类型可以是java 支持的任意类型。
  • 数组类型可以是任何数据类型,包括基本类型和引用类型。
  • 数组的元素在堆内存中被分配空间,并且是连续分配的
  • 使用new 关键字对数组进行 内存的分配。每个元素都会被jvm 赋予默认值。默认规则:整数:0 浮点数:0.0 字符:\u0000
    布尔:false 引用数据类型:null。
  • 数组的元素都是有序号的,序号从0开始,0序的。称作数组的下标、索引、角标。

3、数组的声明

  • 声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。
  • 声明一个数组的时候并没有数组真正被创建。
  • 构造一个数组,必须指定长度。

4、数组的格式
元素类型[ ] 数组名 = new 元素类型 [元素个数或数组长度]
元素类型 数组名[ ] = new 元素类型 [元素个数或数组长度]

int[] intArray=new int[4];

int intArrays[]=new int[4];

  • 元素类型:是指数组存储的数据的数据类型
  • []:代表这是数组类型。
  • 数组名:一个合法的标识符,命名规范 和 局部变量 规范一致。
  • new:是java 的关键字。用来向JVM申请内存的。
  • 元素类型[元素个数] :决定了向JVM申请的内存空间的大小(大小:元素类型字节数 * 元素个数)
  • 元素的个数:只要是一个合法的java 表达式就可以。 返回一个int 类型的值即可

在这里插入图片描述
5、数组的创建

  • 声明数组时,给出了数组的初始值,这种创建方法叫做创建静态数组
int[] intArray={1,2,3,4};

String[] strArray= {"Java","C","C++",".NET"};

  • 声明数组时,没有给出数组的初始值,但是指定了数组的长度,这种创建方法叫做创建动态数组。可以通过数组下标找到数组元素,给指定的元素赋值
		int intArrays[]=new int[4];
		intArrays[0]=1;
		intArrays[1]=2;
		intArrays[2]=3;
		intArrays[3]=4;

6、二维数组
二维数组其实是一位数组的嵌套(每一行看做一个内层的一维数组)
示例:

int[][] arr = {{1, 2}, {3, 4}, {5, 6}};//创建静态二维数组

int[][] arr1 = new int[3][2];//创建动态二维数组
arr1[0] = new int[]{1, 2};
arr1[1] = new int[]{3, 4};
arr1[2] = new int[]{5, 6};

7、数组的注意事项

  • 数组下标必须是int、short、byte,或是char
  • 数组下标从0开始计数
  • 元素的个数就是数组的长度,可以通过arrayName.length引用
  • 数组下标最大值为arrayName.length
    -1如果超过最大值,程序将会抛出数组下标越界异常(ArrayIndexOutOfBoundsException)

8、数组的优缺点

优点:

  • 可以保存若干个数据。
  • 随机访问的效率很高。根据下标访问元素效率高(元素连续分配空间)。

缺点:

  • 数组的元素的类型必须一致。元素类型必须一致。
  • 连续分配空间在堆中,如果数组的元素很多,对内存的要求更加的严格。
  • 根据内容查找元素效率比较低,需要逐个比较。
  • 删除元素、插入元素效率比较低,需要移动大量的元素。
  • 数组定长,不能自动扩容。
  • 数组没有封装,数组对象只提供了一个数组长度的属性,但是没有提供方法用来操作元素。

二、数组的应用

1、求数组中最大值

int arr[] = {1, 8, 7, 4, 5, 9};
int k = arr[0];
for(int i=0; i<arr.length; i++){
	if(arr[i]>k){
		k = arr[i];
	}
}
System.out.println(k);

2、求数组中的最小值

int arr[] = {1, 2, 7, 4, 0, 9};
int k = arr[0];
for(int i=0; i<arr.length; i++){
	if(arr[i]<k){
		k = arr[i];
	}
}
System.out.println(k);

3、数组排序

		 int[] a={1,4,-1,5,0};
         Arrays.sort(a);//数组a[]的内容变为{-1,0,1,4,5}
         for(int i=0;i<a.length;i++){
            System.out.print(a[i]+"  ");
         }

4、数组成员10个,找出数组中最大数连同位置一起输出

		    int[] n = new int[]{1, 2, 3, 4, 5, 6, 0};
		    int max = n[0];
		    int index=0;
		    for (int i = 0; i < n.length;i++){
		      if(max<n[i]){
		        max=n[i];
		        index=i;
		      }
		    }
		    System.out.println("最大值是:"+max);
		    System.out.println("最大值位置是:"+index);

5、冒泡排序
冒泡排序就是重复的遍历要排序的数列,每次比较相邻的两个元素,如果他们的顺序不满足排序条件就把他们交换过来。遍历数列的工作是重复地进行直到不再需要交换(排序已完成)。
算法原理:(比如从小到大排)

  • 比较相邻的元素。如果第一个比第二个大,就交换他们的顺序。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
//冒泡排序法
int arr[] = {1, 9, 7, 4, 0};
for(int i=0; i<arr.length-1;i++){
	for(int j=0; j<arr.length-i-1;j++){
		if(arr[j]>arr[j+1]){
			int temp = arr[j+1];
			arr[j+1] = arr[j];
			arr[j] = temp;
		}
	}
}
//以下代码是将数组中的所有元素输出到控制台
for(int i=0; i<arr.length; i++){
	System.out.println(arr[i]);
}

三、数组扩容

方法一:定义一个新数组,将原数组内容放到新数组中,然后将新数组赋值给原数组,从而实现数组扩容。

		//定义原数组
		int[] a={1,2,3,4,5};
		
		//定义新数组
		int[] b=new int[a.length*2];
		
		//循环获取原数组内容并赋值给新数组
		for (int i = 0; i < a.length; i++) {
			b[i]=a[i];
		}
		
		//将新数组赋值给原数组
		a=b;
		
		//展示原数组
		System.out.println(Arrays.toString(a));

输出结果为:

		[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]

方法二:使用Arrays类中的copyof()方法进行扩容

		//定义原数组
		int[] a={1,2,3,4,5};
		
		//使用Arrays类中的copyof()方法进行扩容
		a=Arrays.copyOf(a, a.length*2);
		
		//展示原数组
		System.out.println(Arrays.toString(a));

输出结果为:

		[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]

方法三:使用System类中arraycopy()方法进行扩容

		//定义原数组
		int[] a={1,2,3,4,5};
		
		//定义新数组
		int[] b=new int[a.length*2];
		
		/*
		 * arraycopy()方法本质是循环遍历a数组,并将a数组中的内容放到b数组中
		 * src:旧数组(在本例中为数组对象a)
		 * srcPos:从旧数组的哪个下标开始(在本例中为数组对象a的起始位置)
		 * dest:新的数组(在本例中为数组对象b)
		 * destPos: 从新的数组哪个下标开始接收数据(在本例中为数组对象b的起始位置)
		 * length: 要复制的长度为多少(在本例中为数组对象a的长度)
		 * */
		System.arraycopy(a, 0, b, 0, a.length);;
		
		//将新数组赋值给原数组
		a=b;
		
		//展示原数组
		System.out.println(Arrays.toString(a));

输出结果为:

		[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]

注:三个方法中,最简单的为第一个方法,将数组进行替换和增加容量,并且使用循环来完成,个人推荐第二种方法,使用数组工具类Arrays中的copyof()方法来完成数据的扩容。不推荐第一种和第三种方法,因为这两种方法需要一个新的数组,且将新的数组的地址重新再赋给旧数组,这样一来不仅麻烦,而且繁琐。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哈夫曼树和最小生成树

哈夫曼树 首先给我们一串权值&#xff0c;然后我们需要让这串权值组成一个树&#xff0c;然后当他的wpl最小 我们可以发现当他的小权值离根节点越远&#xff0c;大权值离根节点越近的时候&#xff0c;我们这个时候构建出来的树就是wpl最小的树&#xff0c;也就是我们说的哈夫曼…

c++之 类和对象

目录 1.类和对象的基本概念 1.c语言与c中的结构体 2.类的封装性 3.定义类 4.构造与析构 构造与析构的概念&#xff1a; 构造函数 析构函数 拷贝构造函数 c默认增加的函数 1.类和对象的基本概念 1.c语言与c中的结构体 我们知道在c语言里&#xff0c;我们是无法在结构体…

进程的开销比线程大在了哪里?

进程内部都有哪些数据&#xff1f; 为什么创建进程的成本很高&#xff1f; 这样的问题确实不好回答&#xff0c;除非你真正理解了进程和线程的原理&#xff0c;否则很容易掉入面试大坑。探究问题背后的原理&#xff0c;围绕面试题展开理论与实践知识的学习。真正理解进程和线…

centos7虚拟机下hbase的使用案例讲解

系列文章目录 centos7虚拟机在集群zookeeper上面配置hbase的具体操作步骤 centos7虚拟机配置集群时间同步的操作步骤_centos虚拟机时间同步 centos7配置zookeeper本地模式与集群模式的详细教程 卸载centos7自带的jdk的操作步骤_centos7 卸载java 虚拟机centos7配置Hadoop单…

如何用 Vitis HLS 实现 OpenCV 仿真

这篇文章的基础是《Windows上快速部署Vitis HLS OpenCV仿真库》&#xff0c;我们使用的版本是Vitis HLS 2022.2&#xff0c;其他版本BUG不清楚&#xff0c;目前已知2021版本有BUG&#xff0c;只能使用其他方式&#xff0c;本文不适合。 这次选择中值滤波这个常规算法作为演示算…

Springboot电脑商城项目

目录 系统概述与环境搭建 1 系统开发及运行环境 2 项目分析 3 创建数据库 4 创建Spring Initializr项目 5 配置并运行项目 6 导入前端项目 用户注册 1 用户-创建数据表 2 用户-创建实体类 3 用户-注册-持久层 4 用户-注册-业务层 5 用户-注册-控制器 6 用户-注册…

归并排序(递归实现)

上一次我们说了快排的其他版本&#xff0c;还有就是快排的非递归实现 这次我们就说一哈归并排序&#xff0c;归并排序也是很厉害的一种排序&#xff0c;而且归并排序的时间复杂度可以说成标准的O(n log n) 下面我们就来看一下归并排序 我们先来看一下什么是归并排序 假设我…

Scratch蓝桥杯实战训练 —— 巧解“韩信点兵”难题的五种方式

“韩信点兵”蓝桥杯问题描述&#xff1a; “蓝桥杯”中有一道有趣的 Scratch 编程题&#xff0c;题目要求为&#xff1a;韩信点兵 扩展知识&#xff1a; 这道题叫“中国余数定理”&#xff0c;又叫“孙子定理”&#xff0c;也叫“韩信点兵问题”&#xff0c;是我国古代数学智慧…

Faster-RCNN代码解读3:制作自己的数据加载器

Faster-RCNN代码解读3&#xff1a;制作自己的数据加载器 前言 ​ 因为最近打算尝试一下Faster-RCNN的复现&#xff0c;不要多想&#xff0c;我还没有厉害到可以一个人复现所有代码。所以&#xff0c;是参考别人的代码&#xff0c;进行自己的解读。 ​ 代码来自于B站的UP主&…

Node【三】Buffer 与 Stream

文章目录&#x1f31f;前言&#x1f31f;Buffer&#x1f31f; Buffer结构&#x1f31f; 什么时候用Buffer&#x1f31f; Buffer的转换&#x1f31f; Buffer使用&#x1f31f; 创建Buffer&#x1f31f; 字符串转Buffer&#x1f31f; Buffer转字符串&#x1f31f; 拼接Buffer&…

python 理解BN、LN、IN、GN归一化、分析torch.nn.LayerNorm()和torch.var()工作原理

目录 前言&#xff1a; 简言之BN、LN、IN、GN等归一化的区别&#xff1a; 批量归一化(Batch Normalization&#xff0c;BN) 优点 缺点 计算过程 层归一化(Layer Normalization&#xff0c;LN) 优点 计算过程 总结 分析torch.nn.LayerNorm()工作原理 分析torch.var(…

Vue2-黑马(十一)

目录&#xff1a; &#xff08;1&#xff09;vue2-联调准备 &#xff08;2&#xff09;vue2-登录实战-国际化 &#xff08;3&#xff09;vue2实战-登录-login-index.vue &#xff08;1&#xff09;vue2-联调准备 登录这个请求&#xff0c;并不是发给后台的&#xff0c;现在还…

浙大MBA提面申请材料的三六九等……

每年浙大MBA项目提前批面试申请的每个批次中都会有部分材料因为某些原因而被淘汰&#xff0c;无缘面试资格。考生们由最初的不理解到逐渐隐约的理解&#xff0c;行至今日也可以大体接受材料被刷这个结果&#xff0c;当然其中含有一部分面上资质背景还可以的考生&#xff0c;等到…

Faster-RCNN代码解读2:快速上手使用

Faster-RCNN代码解读2&#xff1a;快速上手使用 前言 ​ 因为最近打算尝试一下Faster-RCNN的复现&#xff0c;不要多想&#xff0c;我还没有厉害到可以一个人复现所有代码。所以&#xff0c;是参考别人的代码&#xff0c;进行自己的解读。 ​ 代码来自于B站的UP主&#xff08;…

中国电子学会2023年03月份青少年软件编程Scratch图形化等级考试试卷四级真题(含答案)

2023-03 Scratch四级真题 分数&#xff1a;100 题数&#xff1a;24 测试时长&#xff1a;90min 一、单选题(共10题&#xff0c;共30分) 1.编写一段程序&#xff0c;从26个英文字母中&#xff0c;随机选出10个加入列表a。空白处应填入的代码是&#xff1f;&#xff08;C&am…

Flink (十二) --------- Flink CEP

目录一、基本概念1. CEP 是什么2. 模式 (Pattern)3. 应用场景二、快速上手1. 需要引入的依赖2. 一个简单实例三、模式 API&#xff08;Pattern API&#xff09;1. 个体模式2. 组合模式3. 模式组4. 匹配后跳过策略四、模式的检测处理1. 将模式应用到流上2. 处理匹配事件3. 处理超…

【高项】项目整体管理、范围管理与进度管理(十大管理)

【高项】项目整体管理与范围管理 文章目录1、项目整体管理1.1 整体管理的过程1.2 制定项目章程&#xff08;启动&#xff09;1.3 制订项目管理计划&#xff08;规划&#xff09;1.4 指导与管理项目执行&#xff08;执行&#xff09;1.5 监控项目工作与实施整体变更控制&#xf…

Systemverilog中operators和expression的记录

1. Equality operators Equality operators有三种&#xff1a; Logical equality&#xff1a;, !&#xff0c;该运算符中如果运算数包含有x/z态&#xff0c;那么结果就是x态。只有在两边的bit都不包含x/z态&#xff0c;最终结果才会为0(False)或1(True)Case equality&#xf…

中云盾DDoS云防护系统

中云盾 DDoS 防护系统作为公司级网络安全产品&#xff0c;为各类业务提供专业可靠的 DDoS/CC 攻击防护。在黑客攻防对抗日益激烈的环境下&#xff0c; DDoS 对抗不仅需要 “降本” 还需要 “增效”。 为什么上云&#xff1f; 云原生作为近年来相当热门的概念&#xff0c;无论…

RHCE-NTP、SSH服务器

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间​ 服务器端&#xff1a; &#xff08;1&#xff09;首先安装chrony软件&#xff1a; dnf install -y chrony &#xff08;2&#xff09;配置时间同步源&#xff1a; 进入vim /etc/chrony.conf &#xf…