Java开发入门之第一阶段(十一)——数组学习

这篇博客详细介绍了Java中的数组,包括数组的概念、定义格式、动态与静态初始化、访问数组元素、内存划分、常见问题及解决方案。还讨论了数组的遍历、最值求解、元素反转等操作,适合Java开发入门者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组的概念

数组的概念:是一种容器,可以同时存放多个数据值
数组的特点:
1.数组是一种引用数据类型
2.数组当中的多个数据,类型必须统一
3.数组的长度在程序运行期间不可改变

数组的定义格式

数组的初始化:在内存当中创建一个数组,并且向其中赋予一些默认值。

两种常见的初始化方式:
1.动态初始化(指定长度):在创建数组的时候,直接指定数组当中的数据元素个数
2.静态初始化(指定内容):在创建数组的时候,不直接指定数据个数多少,而是直接将具体的数据内容进行指定。

动态初始化

动态初始化数组的格式:
数组类型[] 数组名称 = new 数据类型[数组长度];

解析含义:
左侧数据类型:也就是数组当中保存的数据,全都是统一的什么类型
左侧的中括号:代表我是一个数组
左侧的数组名称:给数组起一个名字
右侧的new:代表创建数组的动作
右侧数据类型:必须和左边的数据类型保持一致
右侧中括号的长度:也就是数组当中,到底可以保存多少个数据,是一个int数字。

public class Demo01 {

	public static void main(String[] args) {
		//创建一个数组,里面可以存放300个int数据
		//格式:数组类型[] 数组名称 = new 数据类型[数组长度];
		int[] arryA = new int[300];
		
		//创建一个数组,能存放10个double类型的数据
		double[] a1 = new double[10];
		
		//创建一个数组,能存放5个字符串
		String[] a2 = new String[5];
	}

}

静态初始化

静态初始化基本格式:
数据类型[] 数组名称 = new 数据类型[] { 元素1,元素2,元素3····};

注意事项:
虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以自动推算出来长度(即元素的个数)

public class Demo02 {

	public static void main(String[] args) {
		// 直接创建一个数组,里面装的全都是int数字,具体为:5、15、25、
		int[] arryA = new int[] {5,15,25};
		
		//创建一个数组,用来装字符串:hello,world,java
		String[] arryB =new String[] {"hello","world","java"};
	}

}

注:使用静态初始化数组的时候,格式还*可以再省略一下。

标准格式:就是上面的基本格式。
数据类型[] 数组名称 = new 数据类型[] { 元素1,元素2,元素3····};

省略格式:
数据类型[] 数组名称 = { 元素1,元素2,元素3····};

注意事项:
1.静态初始化没有直接指定长度,但是仍然会自动推算得到长度
2.静态初始化标准化格式可以拆成两个步骤
3.动态初始化也可以拆成两个步骤
4.静态初始化一旦使用省略格式,就不能拆分为两个步骤使用。

public class Demo03 {

	public static void main(String[] args) {
		// 省略格式的静态初始化
		int[] arryA = { 10,20,30 };
		
		//静态初始化标准化格式可以拆成两个步骤
		int[] arryB;
		arryB = new int[] {1,2,3,};
		
		//动态态初始化标准化格式可以拆成两个步骤
		int[] arryC;
		arryC = new int[5];
	}

}

使用建议:
如果不确定数组的具体内容,就用动态初始化,否则就用静态初始化。

访问数组元素进行获取

访问数组元素的格式:
数组名称[索引值]

索引值:就是一个int数字,代表数组当中元素的编号

注意】:索引值从0开始,一直到“数组长度-1”为止。

public class Demo04 {

	public static void main(String[] args) {
		// 静态初始化的省略格式
		int[] arry = {10,20,30};
		//直接打印数组名称,得到的是数组对应的:内存地址哈希值。
		System.out.println(arry);//运行结果是:[I@7852e922
		//直接打印数组当中的元素
		System.out.println(arry[0]);//10
		System.out.println(arry[1]);//20
		System.out.println(arry[2]);//30
		System.out.println("=================");
		//也可以将数组当中某一个的单个元素赋值交给变量,然后打印
		int num = arry[1];
		System.out.println(num);//20
		
		
	}

}

在这里插入图片描述

访问数组元素进行赋值

使用动态初始化数组的时候,其中的元素会自动拥有一个默认值。
规则如下:
如果是整数类型,那么默认为0.
如果是浮点数类型,那么默认为0.0
如果是字符类型,那么默认为‘\u0000’
如果是布尔类型,那么默认为false。
如果是引用类型,那么默认为null。

注意事项:
静态初始话其实也有默认值的过程,只不过系统自动马上将默认值替换成了大括号当中的具体数值。

public class Demo05 {

	public static void main(String[] args) {
		//动态初始化一个数组
		int[] arry= new int[3];
		
		System.out.println(arry);//内存地址
		System.out.println(arry[0]);//0
		System.out.println(arry[1]);//0
		System.out.println(arry[2]);//0
		System.out.println("==============");
		
		//将数据123交给数组arry当中的1号元素
		arry[1] = 123;
		System.out.println(arry[0]);//0
		System.out.println(arry[1]);//123
		System.out.println(arry[2]);//0
		
		
	}

}

在这里插入图片描述

Java中的内存划分

Java的内存需要划分成5个部分:
1.栈(stack):存放的都是方法中的局部变量。方法的运行,一定要在栈当中

  • 局部变量:方法的参数,或者方法{}内部的变量
  • 作用域:一旦超出作用域,立刻从栈内存当中消失

2.堆(heap)凡是new出来的东西,都在堆当中。

  • 堆内存里面的东西都有一个地址值:16进制
  • 堆内存里面的数据,都有默认值。规则如下:
    如果是整数,默认为0。
    如果是浮点数,默认为0.0
    如果是字符,默认为‘\u0000’
    如果是布尔,默认为false
    如果是引用类型,默认为null

3.方法区(Method Area):存储.class相关信息,包含方法的信息

4.本地方法栈(Nativa Method Stack):与操作系统相关

5.寄存器(pc Register):与cpu相关

一个数组的内存图

在这里插入图片描述

常见问题_数组索引越界异常

数组的索引编号从0开始,一直到”数组的长度-1“为止
如果访问数组元素的时候,索引编号并不存在,那么将会发生数组索引越界异常(ArrayIndexOutOfBoundsException)
在这里插入图片描述
原因:索引编号写错了
处理解决办法:修改成为存在的正确索引编号

常见问题_空指针异常

所有的引用类型变量,都可以赋值为一个null值,但是代表其中什么都没有。
数组必须进行new初始化才能使用其中的元素。
如果只是赋值了一个null,没有进行new创建
那么将会发生:空指针异常 (NullPointerException)

原因:忘记new
解决:补上new
在这里插入图片描述
补上之后
在这里插入图片描述

获取数组长度

如何获取数组长度,格式:
数组名称.length

这将会得到一个int数字,代表数组的长度

数组一旦创建,程序运行期间,长度不可改变。

当我们新创建另一个数组,arrayC,动态初始化长度为3,当我们输出arrayC数组长度会得到一个int值为3.但是我们可以重新初始化长度为5的数组,那么他的栈内存地址就会改变,长度也会发生变化。
在这里插入图片描述

数组的遍历

遍历数组:说的就是数组当中每一个元素进行逐一,挨个er处理。默认的处理方式就是打印输出。

public class Demo10 {

	public static void main(String[] args) {
		int[] array = {15,25,35,45,50};
		
		//首先使用原始方式
		System.out.println(array[0]);
		System.out.println(array[1]);
		System.out.println(array[2]);
		System.out.println(array[3]);
		System.out.println(array[4]);
		System.out.println("==============");
		
		//使用循环,次数其实就是数组的长度
		for (int i = 0; i < 5; i++) {
			System.out.println(array[i]);			
		}
		System.out.println("==============");
//		int len = array.length;
		for (int i = 0; i < array.length; i++) {
			System.out.println(array[i]);
		}
	}

}

在这里插入图片描述

求出数组中的最值

在这里插入图片描述
这就好比比武招亲,两两相比,最后留在擂台上的是战斗力最高的那个。
我们以这个例子模型求出数组中的最大值。

public class Demo11 {
	
	public static void main(String[] args) {
		int[] array = {5,15,30,20,10000};
//		求出数组中的最大值
		int max = array[0];//假设max就是比武擂台
		for (int i = 1; i < array.length; i++) {
//			如果当前元素比max更大,则换人
			if(array[i] > max) {
				max = array[i];
			}
		}
		//谁最后厉害,就能在max当中留下谁的战斗力
		System.out.println("最大值:" + max);
	}

}

在这里插入图片描述
以此还可以求出最小值

public class Demo11 {
	
	public static void main(String[] args) {
		int[] array = {5,15,30,20,10000};
//		求出数组中的最小值
		int min = array[0];
		for (int i = 1; i < array.length; i++) {
//			如果当前元素比min更小,则换人
			if(array[i] < min) {
				min = array[i];
			}
		}
		//输出最小值
		System.out.println("最小值:" + min);
	}

}

在这里插入图片描述

数组元素反转

本来的样子:{1,2,3}
之后的样子:{3,2,1}

注意事项:
要求不能使用新的数组,就用原来的数组。

  1. 数组元素的反转其实就是对称位置的元素交换

  2. 通常遍历数组用的是一个索引:
    int i=0;
    现在表示对称位置, 需要两个索引:
    int min = 0;
    int max = array.lenth - 1

  3. 如何交换两个变量的值?
    int a = 10;
    int b=20;
    如果是两个水杯,都是满的,如何交换?借助第三个杯子。
    int temp = a;
    a = b;
    b = temp;在这里插入图片描述

用第三个倒手。

  1. 什么时候停止交换?
    (1)min == max
    数组长度是单数,最后对称交换后会剩下最中间的一个数字,也就是min==max

在这里插入图片描述
在这里插入图片描述
(2)min>max
数组长度是双数,最后两两对称全部交换完毕,最中间的也交换完毕,则min>max

在这里插入图片描述
在这里插入图片描述

package 数组;

public class Demo12 {

	public static void main(String[] args) {
		int[] array = {10,20,30,40,50};
		
		//遍历打印数组本来的样子
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + " ");
		}
		System.out.println();
		System.out.println( "===============");
		
		/*
		 * 初始化语句:int min = 0;max = array.lenth-1
		 * 条件判断:min < max
		 * 步进表达式:min ++,max--
		 * 循环体:用第三个变量倒手
		 */
		for (int min = 0,max = array.length - 1; min < max; min++,max--) {
			int temp = array[min];
			array[min] = array[max];
			array[max] = temp;
		}
//		再次打印遍历输出数组后来的样子
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + " ");
		}
	}

}



在这里插入图片描述
数组就到这里了,要是觉得我写的不错,请给个赞或者评论,支持我一下,谢谢!!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃糖的霏霏子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值