20200313 加快进度!
目录:JavaStudy05 数组
今天内容和教学目标
一、数组(array)
1.1概念
相当于一个容器,同时存放多个数据(vs变量只能存放一个数据)
1.2特点 3
- 是一种引用数据类型(vs基本数据类型)
- 数据类型必须统一
- 数组的长度在程序运行期间不可改变
1.3数组的初始化
定义:在内存中创建一个数组,并且向其中赋予一些默认值
方式(2):
1.动态初始化(指定长度)
基本/标准格式:数据类型[] 数组名称 = new 数据类型[数组长度];
> 如:int[] arrayA = new int[5]
> 解析含义
可拆分成
int[] arrayA;
arrayA = new int[5];
使用建议:不确定具体内容时
2.静态初始化(指定内容)
基本/标准格式:数据类型[] 数组名称 = new 数据类型[]{5,15,25};
>如:int[] arrayA = new int[]{2,3,4}
>自动计算长度
可拆分成
int[] arrayA;
arrayA = new[]{2,3,4};
省略格式:数据类型[] 数组名称 = {5,15,25};
省略格式不可拆分
/*int[] arrayA;
arrayA = {2,3,4};*/
使用建议:确定具体内容时
1.4数组的访问
直接打印数组名称,得到的是数组对应的,内存哈希值 16进制
访问数组元素的格式:数组名称[索引值];
注意:索引值从0开始,一直到“数组的长度-1”为止。
可以直接打印也可赋值给变量
//静态初始化数组访问
public class Demo03Array {
public static void main(String[] args) {
//静态数组省略格式 2,4,5
int[] arrayA = {2,4,5};
System.out.println(arrayA);//[I@5f150435
//直接打印数组中的元素
System.out.println(arrayA[0]);//2
System.out.println(arrayA[1]);//4
System.out.println(arrayA[2]);//5
System.out.println("==========");
//赋值单个数据给变量
int num = arrayA[0];
System.out.println(num);
}
}
package cn.itcast.day05;
//动态初始化数组访问
/*使用动态初始化数组时,元素自动拥有一个默认值
整数类型为0
浮点类型为0.0
字符类型为'\u000'(为不可见字符,并非为空格)
布尔类型为false
引用类型为null
注意:静态初始化数组也会自动拥有一个默认值,不过之后被替换
*/
public class Demo04Array {
public static void main(String[] args) {
int[] array = new int[3];
System.out.println(array);//内存地址值
System.out.println(array[0]);//0
System.out.println(array[1]);//0
System.out.println(array[2]);//0
System.out.println("==========");
//将数据324赋值给array中的1号元素
array[1]=324;
System.out.println(array[0]);//0
System.out.println(array[1]);//324
System.out.println(array[2]);//0
}
}
二、数组原理内存图
2.1Java中的内存划分(5)
- 栈(Stack):方法的运行一定要在栈中
- 堆(Heap):凡是new出来的东西,都在堆中
堆内存里面的东西都有一个地址值:16进制
堆内的数据都有默认值:
整数 0
浮点数 0.0
字符 ‘\u000’
布尔 false
引用类型 null - 方法区(Method Area):存储.class相关信息,包含方法的信息
- 本地方法栈(Native Method Stack):与操作系统相关
- 寄存器(pc Register):与CPU相关
2.2数组的内存图
一个数组的内存图
两个数组的内存图
数组间赋值的内存图
三、数组的常见操作
3.1 数组索引越界异常
package cn.itcast.day05.Demo03;
/*索引编号并不存在即发生 数组索引越界异常
ArrayIndexOutOfBoundsException
*/
public class Demo01ArrayIndex {
public static void main(String[] args) {
int[] array= {1,3,4};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
//错误写法,并不存在
// System.out.println(array[3]);
}
}
3.2空指针异常
3.3获取数组的长度
格式:
数组名称.length
数组一旦创建,程序运行期间,长度不可改变
3.4遍历数组
package cn.itcast.day05.Demo03;
//遍历打印数组数据
public class Demo04Array {
public static void main(String[] args) {
int[] arrayA = {2,4,45,6,7,8,8,5,6};
//方法一,一次打印
System.out.println(arrayA[0]);
System.out.println(arrayA[1]);
System.out.println(arrayA[2]);
System.out.println(arrayA[3]);
System.out.println(arrayA[4]);
System.out.println(arrayA[5]);
System.out.println(arrayA[6]);
System.out.println("===========");
//方法二,自定义次数,循环
for (int i = 0; i < 6; i++) {
System.out.println(arrayA[i]);
}
//法三,赋值length,循环
int length = arrayA.length;
for (int i = 0; i < length; i++) {
System.out.println(arrayA[i]);
}
//法四,len次数 循环
for (int i = 0; i < arrayA.length; i++) {
System.out.println(arrayA[i]);
}
}
}
快捷写法 数组名.fori = for(int i=0;i<arrayA.length; i++) { }
3.5习题:获取数组中的最大值
package cn.itcast.day05.Demo03;
//获取数组中的最大值,{2,5,3,5,6},依次比较留下较大值再与下一个比,比length-1次,0先赋值给max
public class Test01ArrayMax {
public static void main(String[] args) {
int[] array = {2,5,3,5,6};
int max = array[0];
for(int i=1;i<array.length;i++){
max= (array[i]>max?array[i]:max);
}
System.out.println(max);
}
}
3.6数组元素的反转
不能使用新数组,思路如图
package cn.itcast.day05.Demo03;
public class Text02ArrayReverse {
public static void main(String[] args) {
//数组反转,不用新数组,array[i]=array[length-i-1] 01234 43210,算法错误
/*int[] array = {2,4,6,2,5};
int j=array.length-1;
for (int i = 0; i < array.length; i++) {
array[i]=array[j-i];
System.out.println(array[i]);
}*/
//对称时交换minmax索引值,什么时候停下min>=max,什么时候交换min<max,循环与输出混乱,算法错误
/*int[] array = {2,4,6,2,5};
int min=0;
int max =array.length;
int temper;
for(int i=0;i<max;i++) {
if (array[min] < array[max]) {
temper = array[min];
array[min] = array[max];
array[max] = temper;
}
System.out.println(array[i]);
}*/
//先置换再打印,置换用循环,置换怎么循环for(初始化;条件判断;步进){循环体}
/*初始化:int min=0,max=array.length-1
条件判断:min<max
步进:min++,max--
*/
int[] array = {32,445,65,878,333};
for(int min=0,max=array.length-1;min<max; min++,max--){
int temper =array[min];
array[min]=array[max];
array[max]=temper;
}
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
3.7数组作为方法参数(param)_传递地址
任何数据类型都能作为方法的参数 #记住
数组可以作为方法的参数
当调用方法的时候,向方法的小括号进行传参,传递进去的其实就是数组的地址值。
package cn.itcast.day05.Demo03;
//调用方法传递数组参数
public class Demo05ArrayParam {
public static void main(String[] args) {
int[] array={3,5,6,4,3};
System.out.println(array);//地址值
printArray(array);//传递进去的是array当中保存的地址值
}
/*方法三要素
返回值:打印,无结果,无参数,void
方法名:printArray
参数:需要告诉,数组
*/
public static void printArray(int[] array){
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);//地址值
}
}
}
3.8数组作为方法返回值_返回地址
1.一个方法可以有0/多个参数,但是只能有0/1个返回值。一个方法产生了多个返回数据,就用数组返回。
2.任何数据类型都能作为方法的参数类型或者返回值类型。数组传递和返回的都是数组的地址值。
3.方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值.
package cn.itcast.day05.Demo03;
//传参数,返回平均值和总和
public class Demo06ArrayReturn {
public static void main(String[] args) {
//相当于直接打印array,输出的为地址
System.out.println(calculate(2, 3, 5));
System.out.println("=======");
int[] result = calculate(2, 3, 5);
System.out.println("总和为:"+result[0]);
System.out.println("平均数为:"+result[1]);
}
public static int[] calculate(int a, int b, int c) {
int sum = a + b + c;
int avg = (a + b + c) / 3;
int[] array ={sum,avg};
return array;
}
}
Bug
https://editor.csdn.net/md/?articleId=104827800