目录
一、数组概述
数组的定义:数组就是用来存储一批同种类型数据的内存区域(可以理解为容器)
结论:数组适合做一批同种类型数据的存储
二、数组的定义
1.静态初始化数组
定义数组的时候直接给数组赋值
静态数组初始化完整格式:数据类型[ ] 数组名 = new 数据类型[ ]{元素1,元素2,元素3...};
静态数组初始化简化格式:数据类型[ ] 数组名 = {元素1,元素2,元素3...};
package com.pikaqiu.create;
public class ArrayDemo1 {
public static void main(String[] args) {
//完整格式: 数据类型[ ] 数组名 = new 数据类型[ ]{元素1,元素2,元素3...};
//double[] scores = new double[] {99.5,88.0,75.5};
//简化格式: 数据类型[ ] 数组名 = {元素1,元素2,元素3...};
double[] scores = {99.5,88.0,75.5};
//int[] ages = new int[] {12,21,33};
int[] ages = {12,21,33};
//String[] names = new String[] {"张三","李四","王五"};
String[] names = {"张三","李四","王五"};
//打印数组的首地址
System.out.println(scores);
}
}
1.1数组的访问
格式:数组名称[索引]
数组的长度属性: length
package com.pikaqiu.create;
public class ArrayDemo2 {
public static void main(String[] args) {
//定义一个数组
int[] ages = {12,24,36};
//取值: 数组名称[索引]
System.out.println(ages[0]);
System.out.println(ages[1]);
System.out.println(ages[2]);
System.out.println("-------------------------");
//赋值: 数组名称[索引] = 数据;
ages[2] = 100;
System.out.println(ages[2]);
System.out.println("-------------------------");
//访问数组的长度
System.out.println(ages.length);
System.out.println("-------------------------");
//数组的最大索引 数组名.length - 1 (前提:元素个数大于0)
System.out.println(ages.length-1);
}
}
1.2数组的几个注意事项
1."数据类型[ ] 数组名" 也可以写成 "数据类型 数组名[ ]"
2.什么类型的数组必须存放什么类型的数据,否则会报错
3.数组一旦定义出来后,类型和长度就固定了
package com.pikaqiu.create;
public class ArrayDemo3 {
public static void main(String[] args) {
//数组的注意事项
//1."数据类型[ ] 数组名" 也可以写成 "数据类型 数组名[ ]"
int[] ages = {10,20,30};
//int ages1[] = {10,20,30};
//2.什么类型的数组必须存放什么类型的数据,否则会报错
//String[] names = {"张三","李四",23}; //错误的
//3.数组一旦定义出来后,类型和长度就固定了
int ages2[] = {10,20,30};
//System.out.println(ages2[3]); //报错,长度固定为3,无法访问第四个元素
}
}
2.动态初始化数组
定义数组的时候只确定元素的类型和数组的长度,之后再存入具体的数据
数组的动态初始化格式:数据类型[ ] 数组名 = new 数据类型[长度];
静态初始化数组和动态初始化数组的区别:当前已经知道存入的元素值,用静态初始化;当前还不清楚要存入那些数据,用动态初始化
package com.pikaqiu.create;
public class ArrayDemo4 {
public static void main(String[] args) {
//定义动态数组
//格式: 数据类型[ ] 数组名 = new 数据类型[长度];
double[] scores = new double[3]; //默认值[0.0,0.0,0.0]
//赋值
scores[0] = 99.5;
System.out.println(scores[0]); //99.5
System.out.println(scores[2]); //0.0
System.out.println("--------------------");
String[] names = new String[90]; //引用类型的默认值是null
names[0] = "皮卡丘";
names[2] = "妙蛙种子";
System.out.println(names[0]); //皮卡丘
System.out.println(names[1]); //null
System.out.println(names[2]); //妙蛙种子
}
}
2.1动态初始化数组的元素默认值
两种初始化的使用场景总结、注意事项说明:1.动态初始化:只指定数组长度,后期赋值,适合开始知道数据的数量,但不确定具体元素值的业务场景;2.开始就存入元素值,适合一开始就确定元素值的业务场景;3.两种格式的写法是独立的,不可以混用
package com.pikaqiu.create;
public class ArrayDemo5 {
public static void main(String[] args) {
//1.整型数组的元素默认值都是0
int[] arr = new int[10];
System.out.println(arr[0]); //0
System.out.println(arr[9]); //0
System.out.println("--------------------");
//2.字符数组的元素默认值也是0
char[] ch = new char[100];
System.out.println((int)ch[0]); //0
System.out.println((int)ch[99]); //0
System.out.println("--------------------");
//3.浮点型数组的元素默认值是0.0
double[] scores = new double[80];
System.out.println(scores[0]); //0.0
System.out.println(scores[79]); //0.0
System.out.println("--------------------");
//4.布尔类型的数组元素默认值是false
boolean[] rs = new boolean[100];
System.out.println(rs[0]); //false
System.out.println(rs[99]); //false
System.out.println("--------------------");
//引用类型的数组元素默认值是null
String[] names = new String[50];
System.out.println(names[0]); //null
System.out.println(names[49]); //null
}
}
三、数组的遍历
遍历:就是一个一个数据的访问
遍历的作用:搜索、数据统计等等都要用到遍历
package com.pikaqiu.traverse;
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = {12,24,12,48,98};
//原始遍历方式
// System.out.print(arr[0] + " ");
// System.out.print(arr[1] + " ");
// System.out.print(arr[2] + " ");
// System.out.print(arr[3] + " ");
// System.out.print(arr[4] + " ");
// System.out.println(); //换行
System.out.println("--------------------");
//采用循环的方法
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
四、数组的案例
1.数组元素求和
需求:某部门5名员工的销售额分别是:16、26、36、6、100,请计算他们部门的总销售额
package com.pikaqiu.demo;
public class Demo1 {
public static void main(String[] args) {
//1.用数组存放数据
int[] money = {16,26,36,6,100};
//2.遍历数组并求和
int sum = 0;
for(int i = 0;i < money.length;i++){
sum += money[i];
}
System.out.println("总销售额为: " + sum);
}
}
2.数组求最值
package com.pikaqiu.demo;
public class Demo2 {
public static void main(String[] args) {
int[] scores = {15,90,100,200,95,5};
int max = scores[0];
for (int i = 1; i < scores.length; i++) {
if(max < scores[i]){
max = scores[i];
}
}
System.out.println("这组元素中的最大值为:" + max);
}
}
3.猜数字游戏
需求:游戏后台随机生成1-20之间的5个数(无所谓是否重复),然后让大家来猜数字:未猜中提示:未命中,并继续猜测;猜中提示:"猜中了",并输出该数据第一次出现的位置,且输出全部5个数据,最终结束游戏
package com.pikaqiu.demo;
import java.util.Random;
import java.util.Scanner;
public class Dmeo3 {
public static void main(String[] args) {
//1.获取5个随机数
int[] luckNumber = new int[5];
Random r = new Random();
for (int i = 0;i < luckNumber.length;i++) {
luckNumber[i] = r.nextInt(20) + 1;
}
//2.利用死循环让大家猜数字,直到猜对
Scanner sc = new Scanner(System.in);
OUT:
while(true){
System.out.println("请输入您猜测的数字(1-20):");
int number = sc.nextInt();
for (int i = 0; i < luckNumber.length; i++) {
if(number == luckNumber[i]){
System.out.println("恭喜你,猜对了!" + "该数字首次出现的位置是:" + (i+1));
break OUT; //结束这个死循环,代表游戏结束
}
}
System.out.println("未猜对,请重新猜测");
}
System.out.println("--------------------------");
//打印这五个随机数
System.out.println("这五个幸运数字为:");
for (int k = 0; k < luckNumber.length; k++) {
System.out.print(luckNumber[k] + " ");
}
System.out.println(); // 换行
}
}
4.随机排名
需求:某公司开发部5名开发人员,要演讲,现在采取随机排名后进行汇报,请先依次录入员工的工号,然后展示出一组随机的排名顺序
import java.util.Scanner;
public class Demo4 {
public static void main(String[] args) {
//1.动态初始化一个数组,存储5个工号
int[] codes = new int[5];
//2.使用循环,录入工号
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;
}
//3.遍历数组中的每个元素,然后随机一个索引,让元素与随机索引处的元素进行交换
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;
}
//4.打印最后的顺序
System.out.println("员工演讲顺序为:");
for (int i = 0; i < codes.length; i++) {
System.out.print(codes[i] + " ");
}
System.out.println(); //换行
}
}
5.数组排序
需求:用冒泡排序的方法对一个数组排序
package com.pikaqiu.demo;
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
//1.定义一个动态数组
int[] number = new int[10];
//2.利用循环得到10个数
Scanner sc = new Scanner(System.in);
for (int i = 0; i < number.length; i++) {
System.out.println("请输入第" + (i+1) + "个数:");
int data = sc.nextInt();
number[i] = data;
}
//3.利用冒泡排序对数组进行排序
for (int i = 0; i < number.length - 1; i++) {
for(int j = 0; j < number.length - i -1; j++){
if(number[j] > number[j+1]){
int temp = number[j+1];
number[j+1] = number[j];
number[j] = temp;
}
}
}
//4.打印输出最后排序的结果
System.out.println("最后排序的结果为:");
for (int i = 0; i < number.length; i++) {
System.out.print(number[i] + " ");
}
}
}
五、数组的内存图
1.Java内存分配、数组内存图
栈:方法运行时所进入的内存,变量也是在这里
堆:new出来的东西会在这块内存中开辟空间并产生地址
方法区:字节码文件加载时进入的内存
本地方法栈
寄存器
package com.pikaqiu.memory;
public class ArrayDemo1 {
public static void main(String[] args) {
int a = 15;
System.out.println(a); //输出数据本身
int[] arr = new int[]{10,20,30};
System.out.println(arr); //输出数组首地址
arr[0] = 40;
arr[1] = 50;
arr[2] = 60;
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
2.两个变量指向同一个数组
package com.pikaqiu.memory;
public class ArrayDemo2 {
public static void main(String[] args) {
int[] arr1 = {11,22,33};
//把数组arr1变量赋值给int类型的数组变量arr2
int[] arr2 = arr1; //此时arr1和arr2地址一样
System.out.println(arr1);
System.out.println(arr2);
arr2[1] = 99;
System.out.println(arr1[1]); //99
System.out.println(arr2[0]); //11
System.out.println(arr2[1]); //99
System.out.println(arr2[2]); //33
}
}
六、数组使用的常见问题
1.如果访问的元素超过最大索引,执行时会出现数组索引越界异常
2.如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现空指针异常
package com.pikaqiu.attention;
public class Test1 {
public static void main(String[] args) {
//问题1:如果访问的元素超过最大索引,执行时会出现数组索引越界异常
int[] arr = {10,20,30};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//System.out.println(arr[3]); //超过最大索引,程序出现异常
//System.out.println("程序结束~~~");
System.out.println("--------------------");
//问题2:如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现空指针异常
arr = null;
System.out.println(arr);
//System.out.println(arr.length); //空指针异常
//System.out.println(arr[0]); //空指针异常
System.out.println("程序结束~~~");
}
}
七、Debug工具的使用
Debug工具:IDEA自带的断点调试(排错)工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况
Debug工具基本使用步骤:1.在需要控制的代码行左侧,点击一下,形成断点;2.选择使用Debug方式启动程序,启动之后程序会在断点暂停;3.控制代码一行一行的往下执行