Java大数据开发和安全开发
- (一)Java的数组
- 1.1 静态初始化数组
- 1.1.1 静态数组的定义
- 1.1.2 数组的原理
- 1.1.3 数组的访问
- 1.1.3.1 数组的取值
- 1.1.3.2 数组的赋值
- 1.1.3.3 数组的长度
- 1.1.3.4 数组的使用
- 1.1.4 数组的遍历
- 1.1.3 数组的案例
- 1.2 动态初始化数组
- 1.2.1 动态初始化数组的定义
- 1.2.1 数组的案例
- 1.3 数组的执行原理,Java程序的执行原理
(一)Java的数组
- 数组就是一个容器,用来存储一批同种类型的数据
有变量,为什么还用数组?
- 下面是一个随机点名的系统
假设用变量解决随机点名的需求:
- 代码繁琐:大量变量的定义。 实现需求繁琐。
假设用数组解决随机点名的需求:
- 代码简洁。 逻辑清晰。
结论:遇到批量数据的存储和操作时,数组比变量更适合
1.1 静态初始化数组
1.1.1 静态数组的定义
- 定义数组的时候直接给数组赋值
静态初始化数组的格式:
注意
- “数据类型 [ ] 数组名”也可写成“数据类型 数组名[ ]”
- 什么类型的数组只能存放什么类型的数据。
public class ArrayDemo {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,24,36};double[] scores2 = {89.9,99.5,59.5,88};// 3、数据类型[] 数组名 也可以写成 数据类型 数组名[] int ages3[] ={12,24,36}; //不推荐double scores3[] = {89.9,99.5,59.5,88};}
}
1.1.2 数组的原理
声明一个数组,首先是在内存中分出一块盒子,盒子内部分成两个区域,一个区域保存数组变量,一个区域保存数组的值,数组的值又分成三部分,每个部分独立存储一个数据,每个数据都有自己的下标被用来提供访问,数组的值在内存中以地址的形式被记录,变量中保存的也是数组的内存地址,访问数组的变量就会指向这个内存地址,从而找到数组的值,这也叫传值引用
验证数组变量的值的指向:
public class ArrayDemo {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};System.out.println(ages);System.out.println(scores);}
}
[I@4554617c //指向内存地址
[D@74a14482
注意:数组变量名中存储的是数组在内存中的地址,数组是一种引用数据类型
1.1.3 数组的访问
数组的访问
数组名
[索引]
1.1.3.1 数组的取值
/1 取值
System.out.println(arr[0]);//12
1.1.3.2 数组的赋值
// 赋值
arr[2]= 100;
System.out.println(arr[2]);//100
1.1.3.3 数组的长度
数组的长度属性:length
//获取数组的长度(就是数组元素的个数)
System.out.println(arr.length); //3// 3、访问数组的元素个数:数组名.length
System.out.println(arr1.length);
// 技巧:获取数组的最大索引:arr.length-1(前提是数组中存在数据)
System.out.println(arr1.length-1);
int[] arr2 = {}; //并不是所有数组的长度都是length-1
System.out.println(arr2.length-1);
1.1.3.4 数组的使用
public class ArrayDemo1 {public static void main(String[] args) {//1 访问数组中的值int[] arr1 = {12, 25, 63, 45};System.out.println(arr1[0]);System.out.println(arr1[1]);System.out.println(arr1[2]);System.out.println(arr1[3]);//2 修改数组中的值System.out.println(arr1[0]=21);System.out.println(arr1[1]=22);System.out.println(arr1[2]=23);System.out.println(arr1[3]=24);}
}
1.1.4 数组的遍历
- 遍历:就是一个一个数据的访问
public class ArrayDemo1 {public static void main(String[] args) {//1 访问数组中的值int[] arr1 = {12, 25, 63, 45};System.out.println(arr1[0]);System.out.println(arr1[1]);System.out.println(arr1[2]);System.out.println(arr1[3]);for (int i = 0; i < arr1.length;i++){System.out.println(arr1[i]); //访问}//2 修改数组中的值System.out.println(arr1[0]=21);System.out.println(arr1[1]=22);System.out.println(arr1[2]=23);System.out.println(arr1[3]=24);for (int i = 0; i < arr1.length;i++){arr1[i] =i+1; //赋值System.out.println(arr1[i]);}// 3、访问数组的元素个数:数组名.lengthSystem.out.println(arr1.length);// 技巧:获取数组的最大索引:arr.length-1(前提是数组中存在数据)System.out.println(arr1.length-1);int[] arr2 = {}; //并不是所有数组的长度都是length-1System.out.println(arr2.length-1);}
}
为什么要遍历数组?
- 求和 元素搜索 找最大值、最小值
1.1.3 数组的案例
public class ArrayDemo2 {public static void main(String[] args) {// 目标:完成对数组的元素求和。// 1.定义一个数组存储5名员工的销售额int[] arr1 = {16,26,36,6,100};//3、定义一个变量用于累加求和int sum = 0;//2、遍历这个数组中的每个数据。for (int i=0;i<arr1.length;i++){sum += arr1[i];}System.out.println("员工的销售总额:" + sum);}
}
1.2 动态初始化数组
1.2.1 动态初始化数组的定义
- 定义数组时先不存入具体的元素值,只确定数组存储的
数据类型
和数组的长度
- 静态初始化和动态初始化数组的写法是独立的,
不可以混用
数组的动态初始化格式:
import java.util.Random;public class ArrayDemo3 {public static void main(String[] args) {// 目标:掌握定义数组的方式二:动态初始化数组。// 1、数据类型[]数组名=new 数据类型[长度]int[] ages =new int[3]; //ages =[0,0,0]System.out.println(ages[0]);System.out.println(ages[1]);System.out.println(ages[2]);ages[0]= 12;ages[1]= 18;ages[2]= 32;System.out.println(ages[0]);System.out.println(ages[1]);System.out.println(ages[2]);// 2、动态数组循环赋值 数据类型[]数组名=new 数据类型[长度]int[] arr1 = new int[10];for (int i=0; i<10;i++){Random r = new Random();int num = r.nextInt(10);arr1[i] = num;}System.out.println(arr1.length);}
}
动态初始化数组元素默认值规则:
public class ArrayDemo3 {public static void main(String[] args) { int[] age1 =new int[3]; //age1 =[0,0,0]System.out.println(age1[0]);System.out.println(age1[1]);System.out.println(age1[2]);char[]chars = new char[3];// [0,0,0]System.out.println((int)chars[0]);System.out.println((int)chars[2]);double[] scores = new double[80];// [0.0, 0.0]System.out.println(scores[0]);System.out.println(scores[79]);boolean[] flags = new boolean[100]; // [false, false]System.out.println(flags[0]);System.out.println(flags[99]);String[] names = new String[80];// [null, null]System.out.println(names[0]);System.out.println(names[79]);}
}
两种数组定义的方法各自适合什么业务场景?
- 动态初始化:适合开始不确定具体元素值,只知道元素个数的业务场景
- 静态初始化:适合一开始就知道要存入哪些元素值的业务场景
1.2.1 数组的案例
import java.util.Scanner;public class ArrayDemo4 {public static void main(String[] args) {// 目标:完成评委打分的案例。// 1、定义一个动态初始化的数组,负责后期存储6个评委的打分。double[] scores = new double[6];System.out.println(scores.length);double sum =0;Scanner sc = new Scanner(System.in);// 2、遍历数组中的每个位置,录入评委的分数,存入到数组中去for (int i=0;i<scores.length;i++){System.out.println("请输入第" +(i+1)+"位裁判的评分");double num = sc.nextDouble();scores[i] = num;}//3、遍历数组中的每个元素进行求和for (int j=0; j < scores.length;j++){sum += scores[j];}System.out.println("选手的平均分为" + sum / scores.length);}
}
1.3 数组的执行原理,Java程序的执行原理
- java程序在编译后会产生一个class文件
- Java程序运行时会把class文件放到内存中的JVM虚拟机中执行
- Java为了便于虚拟机运行class文件,将虚拟机中的内存区域进行了划分,划分成了方法区、栈、堆,本地方法栈、程序计数器
在这里插入代码片