Java——数组
文章目录
- 数组
- 1. 数组的定义
-
- 1.1 静态初始化数组
- 1.2 动态初始化数组
- 1.3 元素默认值规则
- 2. 数组的遍历
- 3. 数组案例
-
- 3.1 数组元素求和
- 3.2 数组求最值
- 3.3 猜数字游戏
- 3.4 随机排名
- 3.5 数组排序
- 4. 数组的内存图
-
- 4.1 内存分配介绍
- 4.2 数组使用常见问题
- 5. Debug工具
数组
1. 数组的定义
1.1 静态初始化数组
- 定义数组的时侯直接给数组赋值
- 数组属于
引用数据类型
,存储的是数组在内存中的地址信息
//完整格式//数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...}double[] scores = new double[]{89.5,44.3,65.2};int[] ages = new int[]{12,14,17};//简化格式//数据类型[] 数组名 = {元素1,元素2,元素3...}int[] age = {12,14,17}; System.out.println(age); // [I@d8355a8 // [ 表示数组; I 表示int数据类型; @ 后面加16进制的地址int[] age = {12,14,17};//取值System.out.println(age[1]);//赋值age[2] = 10;System.out.println(age[2]);//访问数组长度System.out.println(age.length);
注意事项:
- “数据类型[] 数组名” 也可以写成 “数据类型 数组名[]”
- 什么类型的数组存放什么类型的数据,否则报错
- 数组一旦定义出来,程序执行的过程中,长度、类型就固定了
1.2 动态初始化数组
//数据类型[] 数组名 = new 数据类型[长度]int[] arr = new int[3];//后赋值arr[0] = 10;System.out.println(arr[0]);
两种数组对比:
- 当前已经知道存入的元素值——静态初始化
- 当前还不清楚要存入哪些数据——动态初始化
- 两种格式的写法独立,不可混用
1.3 元素默认值规则
数据类型 | 明细 | 默认值 |
---|---|---|
基本类型 | byte 、short 、char 、int 、long |
0 |
基本类型 | float 、double |
0.0 |
基本类型 | boolean |
false |
引用类型 | 类、接口、数据、String |
null |
2. 数组的遍历
- 一个一个地把数组元素访问一边
//数组元素的遍历int[] arr = {12,34,45,25};for (int i = 0; i < arr.length ; i++) { System.out.println(arr[i]);}
3. 数组案例
3.1 数组元素求和
int[] money = {13,54,23,65,78};int sum = 0;for (int i = 0; i < money.length ; i++) { sum += money[i];}System.out.println("数组元素和是:"+ sum); //233
3.2 数组求最值
//数组求最值int[] fox ={25,56,78,99,65,21};int max = fox[0]; //建议使用第一个元素作为参照for (int i = 1; i <fox.length ; i++) { //遍历元素,依次比较 if(fox[i] > max){ max = fox[i]; }}System.out.println("数组最大值为:" + max); //99
3.3 猜数字游戏
import java.util.Random;import java.util.Scanner;public class NoteDemo { public static void main(String[] args) { //猜数字游戏:5个1-20之间的随机数,用户猜测 //猜中:提示猜中并输出该数据在数组中第一次出现地索引,还要打印数组内容 //未猜中:继续游戏直至猜中 int[] data = new int[5]; Random r = new Random(); for (int i = 0; i < data.length ; i++) { data[i] = r.nextInt(20) + 1; } //使用死循环 Scanner sc = new Scanner(System.in); OUT: while(true){ System.out.println("输入:"); int guessData = sc.nextInt(); //遍历每个数据 for (int i = 0; i < data.length; i++) { if(guessData == data[i]){ System.out.println("已猜中,数据索引是" + i); break OUT; //结束整个死循环 } } System.out.println("未猜中,请继续!"); } //输出数组全部元素 for (int i = 0; i < data.length; i++) { System.out.print(data[i] + "\t"); } }}
3.4 随机排名
import java.util.Random;import java.util.Scanner;public class NoteDemo { public static void main(String[] args) { //键盘输入一组工号,最终随机数出一组作为排名 int[] codes = new int[5]; //定义一个循环,一次录入一个工号的存入对应的位置 Scanner sc = new Scanner(System.in); for (int i = 0; i < codes.length; i++) { System.out.println("请输入第" + (i+1) +"个员工地工号"); int code = sc.nextInt(); codes[i] = code; } //遍历每个元素,随机一个索引并交换 Random r = new Random(); for (int i = 0; i < codes.length; i++) { //随机索引一个位置 int index = r.nextInt(codes.length); //定义一个临时变量 int temp = codes[index]; codes[index] = codes[i]; codes[i] = temp; } //遍历数组元素 for (int i = 0; i < codes.length; i++) { System.out.print(codes[i] + "\t"); } }}
3.5 数组排序
冒泡排序:每次从数组中找出最大值放在数组的后面
public class NoteDemo { public static void main(String[] args) { int[] arr={5,2,3,1}; for (int i = 0; i < arr.length-1; i++) { for (int j = 0; j < arr.length-i-1; j++) { if (arr[j] > arr[j+1]){ int temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i] + "\t"); } }}
4. 数组的内存图
4.1 内存分配介绍
方法区: 字节码文件加载时进入的内存
栈: 方法运行时所进入的内存;变量也是在这里
堆: new出来的东西会在这块内存中开辟空间并产生地址
4.2 数组使用常见问题
- 如果访问的元素位置超过最大索引,执行时会出现
ArrayIndexOutOfBoundsException
(数组索引越界异常) - 如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现
NullPointerException
(空指针异常)
5. Debug工具
- IDEA自带的断点调试(排错)工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况
- Debug工具基本使用步骤
- 在需要控制的代码行左侧,点击一下,形成断点
- 选择使用Debug方式启动程序,启动后程序会在断点暂停
- 控制代码一行一行的往下执行