第五章 Java数组

目录

概述

数组的初始化

数组元素的调用

数组的长度与遍历

数组元素的默认初始化值

内存结构说明

java内存模型

foreach循环

案例:

交换两个变量

二维数组

案例:

数组常见的异常


概述

  • 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理
  • 数组的常见概念
    1. 数组名
    2. 下标(或索引)
    3. 元素
    4. 数组的长度

 

  • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型
  • 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址
  • 数组的长度一旦确定,就不能修改
  • 我们可以直接通过下标(索引)的方式调用指定位置的元素,速度很快
  • 数组的分类:
    1. 按照维度:一维数组、二维数组、。。。。
    2. 按照元素的数据类型:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)

数组的初始化

//1.数组的声明
int[] arr1; //声明一个数组
		
//静态初始化:数组初始化的同时也给元素赋值
arr1 = new int[]{1,3,5,7,9};
		
//动态初始化:数组的初始化和元素赋值分开
String[] arr2 = new String[4];

数组元素的调用

//调用数组中指定位置的元素:通过索引的方式调用
//数组的索引是从0开始的,到数组的长度-1
arr2[0] = "张三";
arr2[1] = "李四";
arr2[2] = "王五";
arr2[3] = "赵六";

数组的长度与遍历

//获取数组的长度,使用属性length
System.out.println(arr1.length);

		
//遍历数组
for(int i = 0; i < arr2.length; i++){
	System.out.println(arr2[i]);
}

数组元素的默认初始化值

  • 数组元素是整型:0
  • 数组元素是浮点型:0.0
  • 数组元素是char型:0或者'\u0000',也就是ASCII码是0的那个字符
  • 数组元素是boolean型:false
  • 数组元素是引用类型:null
    	int[] arr3 = new int[3];
		for (int i = 0; i < arr3.length; i++) {
			System.out.println(arr3[i]);
		}
		
		float[] arr4 = new float[3];
		for (int i = 0; i < arr4.length; i++) {
			System.out.println(arr4[i]);
		}
		
		
		char[] arr5 = new char[3];
		for (int i = 0; i < arr5.length; i++) {
			
			System.out.println(arr5[i]);
		}
		
		System.out.println(arr5[0] + 0);
		
		boolean[] arr6 = new boolean[3];
		for (int i = 0; i < arr6.length; i++) {
			System.out.println(arr6[i]);
		}
		
		
		String[] arr7 = new String[3];
		for (int i = 0; i < arr7.length; i++) {
			
			System.out.println(arr7[i]);
		}

内存结构说明

我们写好的程序,里面有好多变量数据,那在程序运行的时候这些变量、数据是放在哪里的呢??

放在内存中的。

(局部变量:在方法中定义的变量都称为局部变量)

数组的内存结构:

说明:其实张三和李四不是放在堆区的,应该是放在常量池的。

局部变量,是存放在栈区的,当方法执行完毕后,局部变量就要销毁,就会自动的从栈区弹出来。

先进后出!!!

对于一个数组来说,比如:int[] arr = new int[3];

new int[3] 这部分是放在堆区的

arr是放在栈区的,而且arr这块的值实际上是new int[3]在堆区中的地址值!

java内存模型

  1. 栈区:存放的是局部变量 (基本类型、引用)
  2. 堆区:new出来的对象和数组
  3. 方法区(常量池,静态域)

foreach循环

之前我们讲过三种循环结构:

  1. for循环
  2. while循环
  3. do-while循环

其实还有一种循环是 foreach循环,它是jdk5.0出来的,它其实底层用的还是for循环。

只不过是它使用起来更简单一些,我们经常用它来遍历数组、集合。

案例:

public static void main(String[] args) {
		
		String[] names = new String[3];
		
		names[0] = "张三";
		names[1] = "李四";
		names[2] = "王五";
		
		for (int i = 0; i < names.length; i++) {
			System.out.println(names[i]);
		}
		
		
		//增强for循环
		for(String name : names){
			System.out.println(name);
		}
	}

交换两个变量

public static void main(String[] args) {
		
		int num1 = 15;
		
		int num2 = 30;
		
		int temp = 0;
		
		temp = num1;
		
		num1 = num2;
		
		num2 = temp;
		
		
		System.out.println("num1=" + num1);
		System.out.println("num2=" + num2);

二维数组

  • Java语言里提供了支持多维数组的语法
  • 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像下图excel中的表格一样

  • 对于二维数组的理解,我们可以看作是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,并没有什么多维数组,还是一维数组

案例:

public static void main(String[] args) {
	
		//一维数组的声明及初始化
		int[] arr1 = new int[]{1,3,5};
		
		//1. 二维数组的静态初始化
		int[][] arr2 = new int[][]{{1,2,3},{2,6},{3,8}};
		
		//2.1 二维数组的动态初始化
		String[][] arr3 = new String[3][2];
		
		//2.2 二维数组的动态初始化
		String[][] arr4 = new String[3][];
		
		//3.获取二维数组中指定位置的元素
		System.out.println(arr2[1][1]);
		System.out.println(arr3[2][1]);
		
		arr4[1] = new String[3];
		System.out.println(arr4[1][2]);
		
		//4.获取数组的长度
		System.out.println(arr1.length);
		System.out.println(arr2.length);
		System.out.println(arr2[1].length);
		
		//5.遍历二维数组
		for (int i = 0; i < arr2.length; i++) {
			
			for(int j = 0; j < arr2[i].length; j++){
				System.out.print(arr2[i][j] + "\t");
			}
			
			System.out.println();
		}
		
		//6.数组元素的默认初始化值
		//规定:二维数组分为外层数组的元素,内层数组的元素
		//外层元素:arr[0]、arr[1]等
		//内层元素:arr[0][1]、arr[2][1]等
		int[][] arr5 = new int[4][3];
		System.out.println(arr5[1]); //输出的是一维数组 int类型@地址值
		System.out.println(arr5[1][2]); 
		System.out.println(arr5[4]); //输出的是二维数组int类型@地址值
		
		
		float[][] arr6 = new float[3][];
		System.out.println(arr6[2]); //null
		System.out.println(arr6[2][1]); //报错
	}

二维数组的内存结构图:

数组常见的异常

数组索引越界异常。java.lang.ArrayIndexOutOfBoundsException。

也就是当我们根据索引获取数组中的元素时,如果输入的索引是不存在的,就会报这个异常!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值