数组就是一个容器,用来存储一批同种类型的数据。
1.静态初始化数组
定义数组的时候直接给数组赋值。
静态初始化数组的格式:
//完整格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
int [] ages = new int[]{12,24,36}
double[] scores = new double[]{89.9,99.5,59.5,88.0};
//简化格式
数据类型[] 数组名 = {元素1,元素2,元素3....};
itn [] ages = {12,24,36};
注意:
- 数据类型[ ] 数组名 = 数据类型 数组名[ ]
- 什么类型的数组只能存放什么类型的数据
package item6;
import java.util.Random;
public class Array1 {
public static void main(String[] args) {
//数组的应用:掌握数组的定义方式一:静态初始化数组
//1.数据类型[] 数组名 = new 数据类型[] {元素1,元素2,元素3....}
int[] ages = new int[] {12,24,36};//存储三个数组的年龄
double[] scores = new double[] {89.9,99.5,59.5,88};
//2.简化写法
//数据类型[] 数组名 ={元素1,元素2,元素3....}
int[] ages2 = {12,15,52};
double[] scores2 = {89.9,99.5,88};
//3.数据类型[ ] 数组名 = 数据类型 数组名[ ]
int age3[] = {22,58,54};
}
}
注意:数组变量名中存储的是数组在内存中的地址,数组是一种引用数据类型。
1.1.数值的访问
数组名[索引]
//取值
System.out.println(arr[0]);
//赋值
arr[2] = 100;
System.out.println(arr[2]);//100
数组的长度属性:length
//获取数组的长度(就是数组元素的个数)
System.out.println(arr.length);//3
1.2.数组的遍历
就是一个一个数据的访问。
package item6;
import java.util.Random;
public class Array1 {
public static void main(String[] args) {
int[] ages4 = {12,24,36};
//System.out.println(ages4[0]);
//System.out.println(ages4[1]);
//System.out.println(ages4[2]);
for(int i = 0;i < 3;i++) {
System.out.println(ages4[i]);
}
}
}
求和案例
需求:某部门5名员工的销售额分别是:16、26、36、6、30。
分析:
- 把这五个数据拿到程序中去--->使用数组
- 遍历数组中的每个数据,然后在外面定义求和变量把它们累加起来。
package item7;
public class ArrayTest4 {
public static void main(String[] args) {
//目标:完成对数组的元素求和
//1、定义一个数组存储5名员工的销售额
int[] money = {16,26,36,6,100};
//2、遍历这个数组中的每个数据
//3、定义夜歌变量用于累加求和
int sum = 0;
for(int i = 0; i<money.length;i++) {
sum += money[i];
}
System.out.println(sum);
}
}
2.动态初始化数组
定义数组是先不存入具体的元素值,只确定数组存储的数据类型和数组的长度
2.1.数组初始化的格式
数据类型[] 数组名 = new 数据类型[长度];
int[] arr = new int[3];
注意:静态初始化和动态初始化数组的写法是独立的,不可以混用。
错误写法:
int[] arr = new int[3]{30,40,50};//错误
2.1.1.动态初始化数组元素默认值规则:
数据类型 | 明细 | 默认值 |
---|---|---|
基本类型 | byte、short、char、int、long | 0 |
基本类型 | float、double | 0.0 |
基本数据类型 | boolean | false |
引用类型 | 类、接口、数组、String | null |
2.2.打分案例
需求:某歌唱比赛,需要开发一个系统:可以录入6名评委的打分,录入完毕后立即输出平均分作为选手分数。
分析:
- 6名评委打分时后期录入的,一开始不知道具体的分数,因此定义一个动态初始化的数组存分数。
- 遍历数组中的每一个位置,每次提醒用户录入一个评委的分数,并存入到数组对应的位置。
- 遍历数组中的每个元素进行求和,最终算出平均分打印出来即可。
package item8;
import java.util.Scanner;
public class ArrayTest5 {
public static void main(String[] args) {
//需求:某歌唱比赛,需要开发一个系统:可以录入6名评委的打分,录入完毕后立即输出平均分作为选手分数。
//1、定义一个动态初始化的数组,负责后期储存6个评委的打分
double[] scores = new double[6];
Scanner sr = new Scanner(System.in);
//2.遍历数组中的每个位置,录入评委的分数,存入到数组中去
for (int i = 0;i <6;i++) {
System.out.println("请您输入当前第" + (i + 1)+ "个评委的分数:");
double score = sr.nextDouble();
scores[i] = score;
}
//3、遍历数组中的元素求和
double sum = 0;
for(int i = 0;i < scores.length;i++) {
sum += scores[i];
}
System.out.println("选手的最终得分是:" + sum/scores.length );
}
}
运行效果:
3.内存执行原理
Java内存分配介绍:
- 方法区
- 栈
- 堆
- 本地方法栈
- 程序计数器
3.1.方法区
字节码文件先加载到这里(放程序编译后的.class文件)
3.2.栈内存
方法运行时所进入的内存变量也是在这里(main...等)
3.3.堆内存
new(数组) 出来的东西会在这块内存中开辟空间并产生地址
例:说说int a = 20;int[] = new int[3]这两行代码的执行原理?
- a是变量,直接放在栈中,a变量中存储的数据就是20这个值。
- new int[3]是创建一个数组对象,会在堆内存中开辟区域存储3个整数。
- arr是变量,在栈中,arr中存储的是数组对象在堆内存中的地址值。
注意:如果某个数组变量存储的地址是null,那么该变量将不再指向任何数组对象
arr2 = null;//把null赋值给arr2
System.out.println(arr2);//null
System.out.println(arr2[0]);//异常
System.out.println(arr2.length);//异常
4.求最值案例
需求:找出分数最低和最高的
步骤:
- 把分数数据拿到程序中去,用数组装起来。
- 定义一个变量用于记录最终的最大值
- 遍历替换
package item9;
public class MaxRequire {
public static void main(String[] args) {
int[] scores = {15,32,57,98,-5};
int MaxScores = scores[0];
for(int i = 1; i < scores.length;i++) {
if(scores[i] > MaxScores) {
MaxScores = scores[i];
}
}
System.out.println("最大的数是:" + MaxScores);
}
}
运行效果是:
5.数组反转
需求:某个数组有五个数据:10,20,30,40,50,请将这个数组中的数据进行反转。
[10,20,30,40,50]反转后[50,40,30,20,10]
分析:
- 数组反转操作实际上就是:依次前后交换数据即可实现。
package item10;
public class ArrayFlip {
public static void main(String[] args) {
//目标:完成数组反转
//1、准备一个数组
int[] numbers = {10,20,30,40,50};
//2、定义一个循环,设计2个变量,一个在前,一个在后
for(int i = 0,j = numbers.length - 1;i < j;i++,j--) {
//numbers[i] numbers[j]
//交换
//1、定义一个临时变量记住后一个位置处的值
int temp = numbers[j];
//2、把前一个位置处的值赋值个后一个位置了
numbers[j] = numbers[i];
//3、把临时变量中记住的后一个位置处的值赋值给前一个位置处
numbers[i] = temp;
}
//3、遍历数组中的每个数据,看是否反转成功了
for(int i = 0;i < numbers.length;i++) {
System.out.print(numbers[i] + " ");
}
}
}
运行效果:
6.随机排名
需求:用户依次录入几个序号,然后展示出一组随机的排名顺序
分析:
- 在程序中录入几个数字存储起来-->使用动态初始化数组的方式。
- 依次遍历数组中的每个数据。
- 没遍历到一个数据,都随机一个索引值出来,让当前数据与该索引位置处的数据进行交换。
package item11;
import java.util.Random;
import java.util.Scanner;
public class RandomNumber {
public static void main(String[] args) {
//完成随机排名
//1、定义一个动态初始化的数组用于存储5个数据
int[] numbers = new int[5];
//2、提示用户录入数据
Scanner sr = new Scanner(System.in);
for(int i = 0;i < numbers.length;i++) {
System.out.println("请输入当前第" + (i + 1) + "个数据");
int number = sr.nextInt();
numbers[i] = number;
}
//3、打乱数组中元素顺
Random r= new Random();
for(int i = 0;i < numbers.length;i++) {
//numbers[i]
//每遍历到一个数据,都随机一个数组索引范围内的值,然后让当前遍历的数据与
int code = r.nextInt(numbers.length);//0 - 4
//定义一个临时变量记住code的位置
int temp = numbers[code];
numbers[code] = numbers[i];
}
for(int i = 0;i < numbers.length;i++) {
System.out.println(numbers[i] + " ");
}
}
}