//【格式1】 数据类型[] 数组名 //示例 int[] arr double[] arr long[] arr boolean[] arr String[] arr
格式二:
//【格式2】 数据类型 数组名[] //示例
数组的初始化的基本格式
package com.itheima_01; /* 数组:是一种用于存储多个相同类型数据的存储模型 定义格式:(推荐方式) 数据类型[] 数组名; 举例:int[] arr; 数组初始化: A:所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值 B:数组初始化 动态初始化 静态初始化 动态初始化: 初始化时只指定数组长度,由系统为数组分配初始值 格式:数据类型[] 变量名 = new 数据类型[数组长度]; 范例:int[] arr = new int[3]; */ public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[3]; /* 左边: int:说明数组中的元素类型是int类型 []:说明这是一个数组 arr:这是数组的名称 右边: new:为数组申请内存空间 int:说明数组中的元素类型是int类型 []:说明这是一个数组 3:数组长度,其实就是数组中的元素个数 */ //输出数组名 System.out.println(arr); //[I@880ec60 //输出数组中的元素 System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); } }
小结
-
数组是什么?
数组是用于存储多个相同类型的数据容器。
-
数组的特点?
只能存储同一类型的数据。
-
数组的定义格式
-
格式一: 数据类型[] 变量名 推荐使用
-
格式二: 数据类型 变量名[] 了解即可
-
-
数组的索引值的特点?
数组的索引是从0开始,每次+1.
-
能够使用数组的动态初始化定义数组
格式: 数据类型[] 变量名 = new 数据类型[长度|容量]
比如:double[] arr = new double[3];
左边:
double:代表了该数组能够存储的数据类型。
arr : 只是一个变量名
右边:
new 申请内存空间。new是一个关键字,凡是创建对象都必须要使用的关键字。
double:代表了该数组能够存储的数据类型。
[]: 代表的是数组
3 : 代表了数组容器的容量,最多只能存3个数据。
--------
什么是动态初始化?
==只给定数组的长度,由系统给出默认初始化值。==
动态初始化的格式?
数据类型[] 数组名 = new 数据类型[数组长度];
//数组动态初始化 //定义长度为3的int数组 int[] arr = new int[3]; //定义长度为5的double数组 double[] arr = new double[5]; //定义长度为5的char数组 char[] arr = new char[5]; //定义长度为4的字符串数组 String[] arr = new String[4];
int[] arr = new int[5];
-
等号左边:
-
int:数组的数据类型
-
[]:代表这是一个数组
-
arr:代表数组的名称
-
等号右边:
-
new:为数组开辟内存空间
-
int:数组的数据类型
-
[]:代表这是一个数组
-
-
5:代表数组的长度
各个内存区的作用
区域名称 | 作用 |
栈内存(Stack) | 方法运行时使用的内存,存放方法中的变量和参数。 |
堆内存(Heap) | 存储对象或数组,new出来的数据,都存储在堆内存。 |
方法区 | 存储已加载的class文件信息。 |
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
目前我们只需要关注栈内存和堆内存。
栈内存:方法执行完毕,内存释放,栈内存存放的是局部变量。
堆内存:数据使用完毕后,等待垃圾回收器回收,堆内存存放的是new出来的数据, 数组,对象。
数组的默认初始化值
整数类型:0
浮点类型:0.0
字符类型:空字符
布尔类型:false
引用类型:null String[] arr = new String[5];
小结
-
-
栈内存: 一个方法如果需要运行,jvm会为该方法在栈内存开辟一片独立的空间,栈内存存储的都是局部变量。
-
堆内存: 凡是通过new关键字创建的数组或者对象,jvm都会在堆内存中开辟一片独立的内存空间。
-
方法区
-
寄存器
-
本地方法栈
-
-
栈内存与堆内存存储数据的特点?
-
栈内存: 一个方法如果需要运行,jvm会为该方法在栈内存开辟一片独立的空间,栈内存存储的都是局部变量。
-
堆内存: 凡是通过new关键字创建的数组或者对象,jvm都会在堆内存中开辟一片独立的内存空间。
-
多个变量指向了同一个数组对象,那么修改元素会互相影响吗?
-
会互相影响的。
什么是静态初始化?
在创建数组时,直接确定元素的值。
什么时候使用动态初始化:
创建数组时,无法确定数组元素的值时候,使用动态初始化
什么时候使用静态初始化
创建数组时,已经确定了元素的值时,使用静态初始化
静态初始化的格式:
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3...} //示例 int[] arr = new int[]{10,20,30,40};
静态初始化的简写形式:
数据类型[] 数组名 = {元素1, 元素2, 元素3...}; //示例 int[] arr = {10,20,30,40};
静态初始化的基本使用
/* 静态初始化: 初始化时指定每个数组元素的初始值,由系统决定数组长度 格式:数据类型[] 变量名 = new 数据类型[]{数据1, 数据2, 数据3, ……}; 范例: int[] arr = new int[]{1, 2, 3}; 简化格式:数据类型[] 变量名 = {数据1, 数据2, 数据3, ……}; 范例: int[] arr = {1, 2, 3}; */ public class ArrayDemo { public static void main(String[] args) { //定义数组 int[] arr = {1, 2, 3}; //输出数组名 System.out.println(arr); //输出数组中的元素 System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); } }
小结
-
静态初始化的特点?
数组一旦创建就已经指定了元素的值。
-
静态初始化的格式?
格式一:数据类型[] 变量名 = new 数据类型[]{元素1,元素2...}
格式二(推荐) : 数据类型[] 变量名 = {元素1,元素2....}
-
什么时候使用静态初始化与动态初始化?
动态初始化特点:创建一个数组对象,但是不指定数组的元素。
静态初始化的特点: 一旦创建数组对象,那么就已经指定了数组的元素。
答案: 根据实际需求而决定。 比如: 当前我需要从数据库中读取15条数据放入到数组中。
【练习】下面创建数组错误的是(C ) A、 int[] arr = new int[5]; B、 int arr[] = new int[5]; C、 int[] arr = new int[3]{1,2,3}; //int[] arr = new int[]{1,2,3}; D、 int[] arr = {1,2,3}; 【练习】下面为数组初始化正确的写法是( A ) A: double c[]=new double[]{1,2} B: double c[]=new double(1,2) //double c[]=new double[]{1,2} C: double c[]=new double[](1,2) //double c[]=new double[]{1,2} D: double c[]=new double{1,2} //double c[]=new double[]{1,2} E: double c[]=new double[2]{1,2} //double c[]=new double[]{1,2}
/* 索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题 ArrayIndexOutOfBoundsException 空指针异常:访问的数组已经不再指向堆内存的数据,造成空指针异常 NullPointerException null:空值,引用数据类型的默认值,表示不指向任何有效对象 */ public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[3]; //System.out.println(arr[3]); //System.out.println(arr[2]); //把null赋值给数组 arr = null; System.out.println(arr[0]); } }
-
-
索引越界
-
空指针异常
-
-
是何种原因导致出现的?
-
索引越界: 访问了不存在的索引值, 索引值的范围:0~容量-1
-
空指针异常: 一个变量没有记录任何对象的内存地址,然后访问了对象的属性或者方法。
-
/* 遍历 获取数组中的每一个元素输出在控制台 获取数组元素 数组名.length */ public class ArrayTest01 { public static void main(String[] args) { //定义数组 int[] arr = {11, 22, 33, 44, 55}; //使用通用的遍历格式 for(int x=0; x<arr.length; x++) { System.out.println(arr[x]); } } }
/* 需求:求数组最大值 分析:打擂台思想 步骤: 1、定义临时变量max,存储数组最大值,并假设第一个元素为最大值。 2、遍历数组,从第二个元素开始,逐个与max比较。 3、如果该元素比max变量还大,将该元素赋值给max变量。 4、循环结束后,max中存储的就是数组的最大值。 */ package com.itheima_05; /* 获取最值 获取数组中的最大值 最小值同学们自己完成 */ public class ArrayTest02 { public static void main(String[] args) { //定义数组 int[] arr = {12, 45, 98, 73, 60}; //定义一个变量,用于保存最大值 //取数组中第一个数据作为变量的初始值 int max = arr[0]; //与数组中剩余的数据逐个比对,每次比对将最大值保存到变量中 for(int x=1; x<arr.length; x++) { if(arr[x] > max) { max = arr[x]; } } //循环结束后打印变量的值 System.out.println("max:" + max); } }
小结
-
-
使用静态初始化的方式创建一个数组
-
定义一个变量用于保存最大值,默认值是获取数组的第一个元素。
-
从索引值1开始遍历数组的元素,然后拿这个每个元素与最大值的变量进行比较,如果出现某个元素大于最大值,那么最大值的变量就改变为当前的元素。
-
输出最大值
-