第一章 数组的定义和访问
1.1 容器概述
- 容器:是将多个数据存储到一起,每个数据称为该容器的元素。
- 生活中的容器:水杯、衣柜、教室
1.2 数组的概念
- 数组概念:是一种容器,可以同时存放多个数据。
- 特点:
- 数组是一种引用数据类型
- 数组当中的多个数据,类型必须统一
- 数组的长度在程序的运行期间不可改变
- 初始化:在内存当中创建一个数组,并且向其中赋予一些默认值。
- 两种常见的初始化方式:
- 动态初始化(指定长度):在创建数组的时候,直接指定数组当中的多个元素。
- 静态初始化(指定内容):在初始话的时候,不直接指定数据多少个,而是直接将数据的内容进行指定。
1.3 数组的定义
1. 动态初始化
-
动态初始化数组的格式:
数据类型【】 数组名称 = new 数据类型【数组长度】;
-
解析含义:
左侧数据类型:也就是数组当中保存的数据,全都是统一的数据类型。
左侧的中括号:代表我是一个数组。
左侧数组名称:给数组取一个名字
右侧的new:代表创建数组的动作
右侧的数据类型:必须和左侧的数据类型保持一致。
右侧中括号的长度:也就是数组当中可以存多好个数据,是一个int数字。
int[] arr = new int[3];
2.静态初始化
-
基本格式:
数据类型 数组名称 = new 数据类型[]{元素1,元素2,.....};
-
注意事项:
虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以自动推算出长度。
int[] arr = new int[]{元素1、元素2、元素3、、、};
3.静态初始化省略格式
-
使用静态初始化数组的时候,格式可以省略
静态初始化标准格式:
数据类型【】 数组名称 = new 数据类型【】{元素1,元素2,。。。。}
省略格式:
数据类型【】 数组名称 = {元素1,元素2、、}
int[] arr = {元素1、元素2、、、};
-
注意事项:
- 静态初始化没有直接指定长度,但是仍然会自动推算长度。
- 静态初始化的标准格式可以拆分为两个步骤。
- 动态初始化也可以拆分为两个步骤。
- 静态初始化一旦使用省略格式,就不能拆分为两个步骤。
-
使用建议:
如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体内容,用静态初始化.
1.4 数组的访问
-
索引:每一个存储到数组的元素,都会自动拥有一个编号,从0开始,自动编号称为索引值。
-
格式:
数组名【索引】;
-
数组长度属性:每个数组都有长度,而且固定的,可以通过语句 数组名.length获取数组的长度。数组最大的索引值为length-1;
public static void main(String[] args){ int[] arr = new int[]{3,6,9,12,23}; //打印数组长度 System.out.println(arr.length) }
-
访问数组中的元素:
- 数组名[索引] = 数值,为数组中的元素赋值。将会替换掉原来的数值。
- 变量 = 数组名称 [索引],获取数组中的元素。
第二章 数组内存图
2.1 内存的概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。 我们平时编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须存放进内存中才能运行,运行完毕后就会清空内存。
2.2 java虚拟机的内存划分
-
栈(Steck):存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。
局部变量:方法的参数,或者是方法{}内部的变量。
作用域:一旦超出作用域,立刻从栈内存中消失。
-
堆(Heep):凡是new出来的东西,都在堆当中。
堆内存当中的东西都有一个地址值:16进制,
堆内存中的数据,都有默认值。规则:
如果是整数 默认值为0
如果是浮点数 默认值为0.0
如果是字符 默认值为'u0000'
如果是布尔 默认值为false
如果是引用类型 默认值为null
-
方法区(Method Area):存储.class文件相关信息,包含方法的信息。
-
本地方法栈(Native Method Stack):与操作系统相关。
-
寄存器(Pc Register):与CPU相关。
2.3 数组在内存中的存储
1.一个数组的内存图
涉及知识点:
- 方法区:中存放.class相关文件,包含方法信息(主要就是方法信息),如Demo02ArrayOne的main方法
- 栈:运行main方法,加载到栈内存当中,并为main方法在栈当中开辟内存空间,这个动作叫做进入栈内存。(进栈)
- new出来的东西都在堆当中, 在堆里边开辟一段内存空间。十六进制开头0X表示
- 数组在内存空间有自己的内存地址,以十六进制表示。0X开头
其他:
十六进制开头0X表示
数组的名称其实就是一个局部变量
2.两个数组的内存图
3.两个变量执行同一个数组
第三章 数组的常见操作
3.1常见问题_数组索引越界
数组的索引编号从0开始,一直到”数组长度-1“为止。
如果访问数组的编号并不存在,就会发生数组索引越界异常
报错代码:ArrayIndexOutOfBoundsException
原因:索引编号写错了
解决:修改称为正确的索引即可。
3.2 空指针异常
所有引用类型变量都可以赋值为一个null值,但其代表为空。
数组值赋了一个null,没有进行new的创建,就会发生空指针异常。 NullPointerException
3.3 获取数组的长度
格式:数组名称.length
将会得到一个int类型的数字,代表数组的长度。
数组一旦创建,程序运行期间不可更改,长度不可改变。
3.4 数组的遍历
数组遍历:就是将数组中的每个元素分别获取出来。
public static void main(String[] args){
int[] arr = new int[]{3,6,9};
for(int i=0;i<=arr.length-1;i++){
System.out.println(arr[i]);
}
}
3.5 获取数组的最大值
从数组的所有元素中找出最大值
public static void main(String[] args){
int max = 0;
int[] arr = new int[]{3,69,9,66,33};
for(int i = 0;i<=arr.length-1;i++){
if(max<arr[i]){
max = arr[i];
}
}
System.out.println("最大值是:"+max);
}
3.6 数组反转
数组反转:数组中的元素颠倒顺序。
public static void main(String[] args){
int[] arr = {1,2,3,5,6};
/*循环中定义变量min = 0最小索引
max = arr.length-1最大索引
*/
for(int min = 0,max = arr.length-1;max>min;max--,min++){
//利用第三方变量完成数组中的元素交换
int temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
//反转后,遍历数组
for(int i= 1;i<arr.length-1;i++){
System.out.println(arr[i])
}
}
第四章 数组作为方法参数和返回值类型
4.1 数组作为方法参数
-
任何数据类型都可以作为方法参数。
-
数组作为方法参数传递,传递的参数是数组内存的地址值。
public static void mian(String[] args){ int[] array = {3,6,9}; printArray(array); } /* 三要素: 返回值类型:只是进行打印而已,不需要进行其他操作,也没有结果,所以用void; 方法名称:printArray 参数列表:必须给数组,才能打印其中的元素,int[] array*/ public static void printArray(int[] array){ for(int i = 0;i<array.length;i++){ System.out.print(array[i]); } }
4.2 数组作为方法返回值
数组作为方法的参数,传递进去的其实就是数组的地址值。
数组作为方法的返回值,返回的其实也是数组的地址值。
public static void mian(String[] args){
//调用方法,接收数组的返回值
//接收到的是数组的内存地址
int[] arr = gerArray();
for(int a=0;a<arr.length;a++){
System.out.print(arr[i])
}
}
public static int[] gerArray(){
int[] arr = {3,6,9};
//返回数组的地址,返回到调用者
return arr;
}
方法的参数为基本数据类型时,传递的是数据值。方法的参数为引用数据类型时传递的是地址值。