目录
- 前言
- 数组
- 1.静态初始化数组
- 2.动态初始化数组
- 3.动态初始化数组的元素默认值
- 4.数组的几个注意事项
- 【数组案例1】猜数字游戏
- 【数组案例2】随机排序
- 【数组案例3】冒泡排序(改进版)
- 5.Java内存分配
- 6.数组内存分配
- 7.两个数组变量指向同一个数组对象内存分配
- 8.数组常见异常
数组
- 数组是用来存储一批同种类型数据的内存区域
1.静态初始化数组
- 定义数组时直接给数组赋值
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...}; // 完整格式
数据类型[] 数组名 = {元素1,元素2,元素3...}; // 简化格式
2.动态初始化数组
- 定义数组时只确定元素的类型和数组长度,之后再存入具体数据
数据类型[] 数组名 = new 数据类型[长度];
3.动态初始化数组的元素默认值
数据类型 | 明细 | 默认值 |
基本类型 | byte,short,char,int,long | 0 |
float,double | 0.0 | |
boolean | false | |
引用类型 | 类,接口,数据,String | null |
4.数组的几个注意事项
- “数据类型[] 数组名“也可以写成“数据类型 数组名[]”
- 数组只能存储相同类型的数据
- 定义一个数组后,程序执行的过程中,该数组长度和类型无法修改
- 在IDEA中,【数组名.fori】快速生成遍历数组语句
【数组案例1】猜数字游戏
- 游戏后台随机生成1-20之间的5个数字(可以重复),用户猜数字,猜中后输出该数字第一次出现的位置,并输出全部5个数字
import java.util.Random;
import java.util.Scanner;
public class ArrayDemo1 {
public static void main(String[] args) {
// 定义一个动态初始化的数组data,存储1-20之间随机生成的5个数字
int[] data = new int[5];
Random r = new Random();
// 随机生成1-20之间的5个数字,并存入data数组中
for (int i = 0; i < 5; i++) {
data[i] = r.nextInt(20) + 1;
}
Scanner sc = new Scanner(System.in);
OUT:
// break跳出循环标记点
while (true) {
System.out.print("请输入一个1-20之间的整数进行猜测:");
int guessData = sc.nextInt();
// 遍历data数组,与用户猜测的数字guessData比较
for (int i = 0; i < data.length; i++) {
if (guessData == data[i]) {
System.out.println("恭喜您猜中了!您猜中的数字在第" + (i + 1) + "个位置");
// 结束while循环
break OUT;
}
}
System.out.println("抱歉!" + guessData + "不正确!");
}
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "\t");
}
}
}
请输入一个1-20之间的整数进行猜测:1
抱歉!1不正确!
请输入一个1-20之间的整数进行猜测:3
恭喜您猜中了!您猜中的数字在第2个位置
13 3 15 6 18
【数组案例2】随机排序
- 将一个长度为5的数组中的数据进行随机排序并输出
public class ArrayDemo2 {
public static void main(String[] args) {
// 定义一个静态初始化的数组codes,并赋值
int[] codes = {12, 36, 28, 45, 99};
System.out.print("原序列:");
for (int i = 0; i < codes.length; i++) {
System.out.print(codes[i] + "\t");
}
Random r = new Random();
for (int i = 0; i < codes.length; i++) {
// 随机生成当前数字将移动到的索引位置
int index = r.nextInt(codes.length);
// 随机生成的索引位置与当前数字的位置一样,不作交换
if (index != i) {
// 当前数字与索引位置的数字交换
int temp = codes[index];
codes[index] = codes[i];
codes[i] = temp;
}
}
System.out.print("\n新序列:");
for (int i = 0; i < codes.length; i++) {
System.out.print(codes[i] + "\t");
}
}
}
原序列:12 36 28 45 99
新序列:36 45 28 99 12
【数组案例3】冒泡排序(改进版)
- 第一点是加入了一个布尔值,判断第二层循环中的调换有没有执行,如果没有进行两两调换,说明后面都已经排好序了,已经不需要再循环了,直接跳出循环,排序结束
- 第二点是第二层循环不再循环到arr.length - 1,因为外面的 i
改进后,测试结果发现提升并不大,这是正常的。因为改进后省略的是排序成功后的判断步骤,就算没改进,排序成功后也只不过是对数组进行遍历而已,没有进行数据更新操作,而数组是读取快更新慢,所以和普通版本相比看起来提升不算大
public int[] bubbleSort(int[] array) {
if (array != null && array.length > 1) {
for (int i = 0; i < array.length - 1; i++) {
boolean flag = false; // 是否发生交换标记位
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag = true; // 发生交换
}
}
// 当前循环未发生交换,说明数组已完成排序,不需要再继续
if (!flag) {
break;
}
}
}
return array;
}
5.Java内存分配
6.数组内存分配
- 数组变量名中存储的是数组在内存中的地址,数组是引用类型
7.两个数组变量指向同一个数组对象内存分配
8.数组常见异常
- 访问的元素位置超过最大索引,执行时出现:ArrayIndexOutOfBoundsException(数组索引越界异常)
- 数组变量中没有存储数组的地址,而是null,在访问数组信息时出现:NullPointerException(空指针异常)