数组
一、一维数组的概念
1、概念:
- 在Java程序中记录多个类型相同的数据内容时,则声明一个一维数组,一维数组本质就是在内存空间中申请一段连续的存储单元。
- 数组是相同数据类型的多个元素的容器,元素按照线性顺序排列,在Java语言中体现为一种引用数据类型。
2、一维数组的声明方式
-
数据类型 [] 数组名称 = new 数据类型 [数组长度];
-
调用数组的length属性可以获取数组的长度;
-
可以通过下标的方式访问数组中的每一个元素。需要注意的是:数组的下标从0开始,对于长度为n的数组,下标的范围是0 ~ n-1。
3、一维数组的使用
/*
编程实现以为数组的声明和使用
*/
import java.util.Scanner;
public class ArrayTest {
public static void main(String [] args) {
Scanner sc = new Scanner(System.in);
//声明一个长度为2元素类型为int类型的一维数组
int [] array = new int[2];
System.out.println("输入数组的元素:");
for(int i = 0; i <array.length; i++) {
array[i] = sc.nextInt();
}
//打印一维数组的长度以及每个元素的数值
int len = array.length;
for(int j = 0; j < array.length; j++) {
System.out.println("array[" + j + "]:" + array[j]);
}
System.out.println("数组的长度是:" + len);
}
}
4、一维数组的初始化方式:
-
基本类型的数组(数据元素的基本类型)创建后,其元素的初始值:byte、short、char、int、long为0,float和double为0.0;boolean为false。
-
可以在数组声明的同时进行初始化,具体如下:
数据类型 [] 数组名称 = {初始值, 初始值,...};
数据类型 [] 数组名称 = new 数据类型 [] {初始值, 初始值,...};
5、内存结构
栈区:
- 栈用于存放程序运行过程中所有的局部变量。一个运行的Java程序从开始到结束会有多次变量的声明。
堆区:
- JVM会在其内存空间开辟一个称为“堆”的存储空间,这部分空间用于存储使用new关键字创建的数组和对象。
案例:
/*
案例题目:
1、声明一个长度为5元素类型为int类型的一维数组,打印数组中所有元素值;
2、使用元素11、22、33、44分别对数组中前四个元素赋值后再次打印;
3、将元素55插入到下标为0的位置,原有元素向后移动,再打印所有元素值;
4、将元素55从数组中删除,删除方式为后续元素向前移动,最后位置置为0
并打印;
5、查找数组中是否存在元素22,若存在则修改为220后再次打印所有元素;
*/
public class ArrayCaseTest {
public static void main(String [] args) {
//1、声明一个长度为5元素类型为int类型的一维数组
int [] arr = new int[5];
//打印数组中所有元素值
for(int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "]:" + arr[i]);
}
System.out.println("----------------");
//2、使用元素11、22、33、44分别对数组中前四个元素赋值后再次打印;
arr[0] = 11;
arr[1] = 22;
arr[2] = 33;
arr[3] = 44;
for(int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "]:" + arr[i]);
}
System.out.println("----------------");
//3、将元素55插入到下标为0的位置,原有元素向后移动,再打印所有元素值;
for(int i = 4; i > 0; i--) {
arr[i] = arr[i-1];
}
arr[0] = 55;
for(int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "]:" + arr[i]);
}
System.out.println("----------------");
//4、将元素55从数组中删除,删除方式为后续元素向前移动,最后位置置为0,并打印;
for(int i = 0; i < arr.length-1; i++) {
arr[i] = arr[i+1];
}
arr[4] = 0;
for(int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "]:" + arr[i]);
}
System.out.println("----------------");| |
//5、查找数组中是否存在元素22,若存在则修改为220后再次打印所有元素;
for(int i = 0; i < arr.length; i++) {
if(arr[i] == 22) {
arr[i] = 220;
}
}
for(int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "]:" + arr[i]);
}
}
}
6、一维数组的优缺点
-
可以直接通过下标(或索引)的方式访问指定位置的元素,速度很快。
-
数组要求所有元素的类型相同。
-
数组要求内存空间连续,并且长度一旦确定就不能更改。
-
增加和删除元素时可能移动大量元素,效率低。
7、数组工具类的概念 -
java.util.Arrays类可以实现对数组中元素的遍历、查找、排序等操作。
-
数据工具类常用方法
/*
编程实现数组工具类的使用
*/
import java.util.Scanner;
import java.util.Arrays;
public class ArrayToolTest {
public static void main(String [] args) {
//声明一个初始值为10,20,30,40,50的一组数组
int[] arr = {10, 20, 30, 40, 50};
//使用原始的方法打印数组中的所有元素,要求打印格式为:[10, 20, 30, 40, 50]
System.out.print("数组中的元素有:[");
for(int i = 0; i < arr.length-1; i++) {
System.out.print(arr[i] + ", ");
}
System.out.print(arr[arr.length-1]);
System.out.print("]");
System.out.println();
//使用工具类:输出数组中的内容
System.out.println("数组中的元素有:" + Arrays.toString(arr));
System.out.println("----------------");
//声明一个长度为5的数组
int[] arr1 = new int[5];
System.out.println("数组中的元素有:" + Arrays.toString(arr1));
//使用工具类:将参数指定元素赋值给数组中的所有元素
Arrays.fill(arr1, 10);
System.out.println("数组中的元素有:" + Arrays.toString(arr1));
System.out.println("----------------");
//声明一个长度为5的数组
int[] arr2 = new int[5];
System.out.println("数组中的元素有:" + Arrays.toString(arr2));
Arrays.fill(arr2, 10);
//判断两个数组内容和次序是否相同
System.out.println(Arrays.equals(arr1, arr2));
//修改arr[4]元素
arr2[4] = 20;
System.out.println("数组中的元素有:" + Arrays.toString(arr1));
System.out.println("数组中的元素有:" + Arrays.toString(arr2));
System.out.println(Arrays.equals(arr1, arr2));
System.out.println("----------------");
//提示用户输入学生的人数以及每个学生的成绩
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生的人数:");
int num = sc.nextInt();
System.out.println("请输入学生的考试成绩:");
int[] score = new int[num];
for(int i = 0; i < arr.length; i++) {
score[i] = sc.nextInt();
}
//查找最大值和最小值
System.out.println("原始成绩:" + Arrays.toString(score));
//调用工具类:对数组中的元素进行从下到大排序
Arrays.sort(score);
System.out.println("排序后的成绩:" + Arrays.toString(score));
System.out.println("最高分:" + score[num-1]);
System.out.println("最低分:" + score[0]);
System.out.println("----------------");
//从数组中查找参数指定元素所在位置
System.out.println("59分在数组中下标的位置:" + Arrays.binarySearch(score, 59));
}
}
二、二维数组
1、二维数组的概念
二维数组本质上就是有多个一维数组摞在一起组成的数组,二维数组中每一个元素都是一维数组,而一维数组中的每个元素才是数据内容。
2、二维数组的声明和初始化
- 数据类型[][] [] [] 数组名称 = new 数据类型[行数] [列数]
- 数据类型 [] [] 数组名称 = {{元素1, 元素2,...}, .....};
/*
编程实现二维数组的声明和使用
*/
public class ArrayArrayTest {
public static void main(String [] args) {
//声明一个2行3列的数组
int[][] arr = new int[2][3];
//打印数组中的每个元素
//使用外层循环控制打印行数
for(int i = 0; i < arr.length; i++) {
//使用内循环控制打印的列数
for(int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
System.out.println("--------------------------");
//实现二维数组中的赋值
int cnt = 1;
//使用外层循环控制打印行数
for(int i = 0; i < arr.length; i++) {
//使用内循环控制打印的列数
for(int j = 0; j < arr[i].length; j++) {
arr[i][j] = cnt++;
}
}
//使用外层循环控制打印行数
for(int i = 0; i < arr.length; i++) {
//使用内循环控制打印的列数
for(int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
System.out.println("--------------------------");
//声明时初始化
int[][] arr1 = {{11, 22, 33},{44, 55, 66}};
//使用外层循环控制打印行数
for(int i = 0; i < arr1.length; i++) {
//使用内循环控制打印的列数
for(int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j] + " ");
}
System.out.println();
}
}
}
笔试考点:
//考点:
int[][] arr2 = new int[3][];//声明一个有3行但不确定多少列的数组
arr2[0] = new int[3];//该数组第一行3列
arr2[1] = new int[4];//该数组第二行4列
arr2[2] = new int[5];//该数组第三行5列
杨辉三角:
/*
案例题目
根据用户输入的行数n输出对应行数的杨辉三角
*/
import java.util.Scanner;
public class ArrayTriangleTest {
public static void main(String [] args) {
//提示用户输入一个行数并记录变量
System.out.println("请输入一个行数:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//根据用户输入的行数来声明对应的二维数组
int[][] arr = new int[n][];
//对二维数组进行初始化,使用双重for循环
for(int i = 0; i < n; i++) {
arr[i] = new int[i+1];
for(int j = 0; j <= i; j++) {
if(j == 0 || j == i) {
arr[i][j] = 1;
}else {
//否则对应位置的元素就是上一行当前列的元素加上上一行前一列的元素
arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
}
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j <= i; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
文章内容输出来源:拉勾教育Java高薪训练营
本文来自博客园,作者:寒露凝珠,转载请注明原文链接:https://www.cnblogs.com/china-soldier/p/14829813.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现