目录
2、动态初始化数组(定义数组的时候只确定数组的类型和长度,之后再存入具体的数据)
2、数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现空指针异常;
一、数组的定义
数组就是用来存储一批同类型数据的内存区域(可以理解为容器);
1、静态初始化数组(定义数组的时候直接给数组赋值)
格式:数据类型 数组名[ ] = {值1;值2……值n};
2、动态初始化数组(定义数组的时候只确定数组的类型和长度,之后再存入具体的数据)
格式:数据类型 数组名[ ] = new 数据类型[ n ];
动态初始化数组的元素默认值:
3、数组的访问(数组名称[索引])
数组长度:length;
数组的最大索引:length - 1;
4、数组的几个注意事项
“数据类型[ ] 数组名”也可以写成“数据类型 数组名[ ]”;
什么类型的数组存放什么类型的数据,否则报错;
数组一旦定下来了,程序执行过程中,数组类型,长度就固定了;
二、数组的遍历
1、定义
就是一个个的数据访问;
2、为什么要遍历?
搜索、数据统计等等都需要用到遍历;
三、数组的案例
1、数组元素求和
需求:某部门5名员工的销售额分别是:16、26、36、6、100,请计算出他们部门的总销售额。
public class Demo{
public static void main(String args[]){
//采用数组的静态初始化;
int[] arr = {16,26,36,6,100};
int sum = 0;
for(int i = 0;i < arr.length;i++){
sum += arr[i];
}
System.out.println("sum = " + sum);
}
}
2、数组求最大值
需求:某部门5名员工的销售额分别是:16、26、36、6、100,请找出销售额的最大值。
public class Demo{
public static void main(String args[]){
//采用数组的动态初始化;
int[] arr = new int[5];
arr[0] = 16;
arr[1] = 26;
arr[2] = 36;
arr[3] = 6;
arr[4] = 100;
int max = arr[0];
int maxIndex = 0;
for(int i = 1;i < arr.length;i++){
if(max < arr[i]){
int temp = arr[i];
arr[i] = max;
max = temp;
maxIndex = i;
}
}
System.out.println("第" + (maxIndex + 1) + "号员工的销售额最高,其销售额为:" + max);
}
}
3、猜数字游戏
需求:开发一个幸运小游戏,游戏规则如下:
游戏后台随机生成1-20之间的5个数(无所谓是否重复),然后让大家来猜数字:
>未猜中提示:“未命中”,并继续猜测;
>猜中提示:“运气不错,猜中了”,并输出该数据第一次出现的位置,且输出全部5个数据,最终结束本游戏。
import java.util.Random;
import java.util.Scanner;
public class Demo{
public static void main(String args[]){
//定义随机类对象和扫描器对象;
Random random = new Random();
Scanner scanner = new Scanner(System.in);
//用一个数组存放5个1-20之间的随机数
int[] arr = new int[5];
for(int i = 0;i < arr.length;i++){
arr[i] = random.nextInt(20);
}
OUT:
while(true){
System.out.println("请输入你要猜的数:");
int c = scanner.nextInt();
for(int i = 0;i < arr.length;i++){
if(c == arr[i]){
System.out.println("运气不错,猜中了,该数第一次出现的索引值为: " + i);
break OUT;
}
}
System.out.println("未命中,继续猜测");
}
//输出全部的5个数;
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + " ");
}
}
}
4、随机排名
需求:某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。
请先依次录入5名员工的工号,然后展示出一组随机的排名顺序。
import java.util.Scanner;
public class Demo{
public static void main(String args[]){
//用扫描器将5名员工工号存入数组中;
Scanner sc = new Scanner(System.in);
int[] arr = new int[5];
for(int i = 0;i < arr.length;i++){
System.out.println("请输入第" + (i + 1) + "位员工的工号:");
arr[i] = sc.nextInt();
}
//用Random类随机打乱数组;
for(int i = 0;i < arr.length;i++){
Random r = new Random();
int index = r.nextInt(5);
int temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
//输出打乱后的随机数组;
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + " ");
}
}
}
5、数组排序
- 就是对数组中的元素进行升序(由小到大)或降序(由大到小)的操作;
- 数组的排列技术;
- 冒泡排序法;
-
public class Demo{ public static void main(String args[]){ int[] arr = {8,6,24,23,12}; //排序前的数组; print(arr); for(int i = 0;i < arr.length - 1;i++){ for(int j = 0;j < arr.length - 1 - i;j++){ if(arr[j] > arr[j+1]){ int temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } } //排序后的数组; print(arr); } public static void print(int[] a){ for(int i = 0;i < a.length;i++){ System.out.print(a[i] + " "); } System.out.println(); } }
-
- 选择排序法;
- 快速排序法;
- 插入排序法;
- ……
- 冒泡排序法;
- 数组搜索的相关技术
- 二分搜索;
- 分块查找;
- 哈希表查找;
- ……
四、数组的内存图
1、Java内存分配、数组内存图
- 方法区:字节码加载时进入的内存;
- 栈内存:方法运行时进入的内存,变量也是在这里
- 堆内存:new出来的东西会在这片内存开辟空间并产生地址;
2、两个变量指向同一个数组
int[ ] arr1 = {8,23,24,81};
int[ ] arr2;
arr2 = arr1;
System.out.println(arr1[2]);
System.out.println(arr2[2]);
两条输出语句的结果都为“24",在执行arr2 = arr 1语句时,程序将arr1的地址复制给了arr2,所以在访问堆内存区域的数据时,索引值为2的对应值都为24。
五、数组使用的常见问题
1、访问元素位置超过最大索引,出现数组索引越界异常;
2、数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现空指针异常;
六、Debug工具的使用
1、Debug工具
IDEA自带的断点(调试)工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序的执行过程。
2、Debug工具基本使用步骤
在需要控制的代码左侧,点击一下,形成断点;
选择使用Debug方式启动程序,启动后程序会在断点暂停;
控制代码一行一行的往下执行;