1-17-Java基础学习(数组)
1.数组
1.概念
数组就是用来存储一批同种类型数据的内存区域(可以理解成容器)。
2.原理及定义
数组变量名中存储的是数组在内存中的地址,数组是引用类型。
// 定义的方式 两种方式可以选择
int[] array={30,20,50}; int anInt[]={30,20,50};
//Java是强类型语言
什么样类型的数组就只能存放对应数据类型的数据
//数组一旦定义以后 类型和长度就定义了
3.初始化
1.动态初始化
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
int [] array=new int [30];
double [] demo=new double[3];
demo[0]=300;
demo[1]=200;
//初始化的时候 数组里面会有默认值
2.静态初始化
//数组的定义
数组类型[] 数组名称=new 数组类型[]{数组里面的数据}
double [] scores= new double[]{20.3,20.26,3.02,20.36};
// 简化模式 去掉后面的 new 数组类型[]直在{}里面写对应的数组的数据
double[] demo={30.30,20,30};
3.注意事项
4.元素的访问
//访问
数组名称[索引]
int[] age = {30, 20, 60};
age[0]=200;
//数组的长度
age.length;
数组名称.length
//数组的最大索引
age.length-1;
数组名称.length-1
5.数组的遍历
//一个一个的访问数据
// 数组元素的遍历
int[] age = {30, 20, 60};
for (int i = 0; i <age.length ; i++) {
System.out.print(age[i]+" ");
}
}
6.经典习题
1.遍历求和
//需求:某部门5名员工的销售额分别是:16、26、36、6、100,请计算出他们部门的总销售额。
public static void main(String[] args) {
int[] array = {16, 32, 36, 6, 100};
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
System.out.println(sum);
}
2.数组最大值
//颜值:15 颜值:9000 颜值:10000 颜值:20000 颜值:9500 颜值:-5
public static void main(String[] args) {
// 定义数组
int[] demo = {15, 10000, 20000, 9500, -5};
int temp = demo[0];
for (int i = 0; i < demo.length; i++) {
if (demo[i] >= temp) {
temp = demo[i];
}
}
System.out.println(temp);
}
3.猜数字进阶
/*
开发一个幸运小游戏,游戏规则如下:
游戏后台随机生成1-20之间的5个数(无所谓是否重复),然后让大家来猜数字:
未猜中提示:“未命中”,并继续猜测
猜中提示:“运气不错,猜中了”,并输出该数据第一次出现的位置,且输出全部5个数据,最
终结束本游戏。
*/
public class ArrayDemoGuessNumber {
public static void main(String[] args) {
// 获取随机数
Random random = new Random();
int[] array = new int[5];
for (int i = 0; i < 5; i++) {
int number = random.nextInt(19) + 1;
for (int i1 = 0; i1 < array.length; i1++) {
array[i] = number;
}
}
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入你猜的数字");
int input = scanner.nextInt();
for (int i = 0; i < array.length; i++) {
if (input == array[i]) {
System.out.println(" 恭喜命中");
System.out.println("第一次命中的下标是"+i);
break;
} else {
System.out.println("没有命中");
}
}
}
}
}
4.随机排名
/*
某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。请先依次录入5名员工的工号,然后展示出一组随机的排名顺序。
22 33 35 13 88 ==>13 35 88 33 22
*/
int[] array = new int[5];
Scanner scanner = new Scanner(System.in);
//为数组的每一个元素赋值
for (int i = 0; i < array.length; i++) {
System.out.println("请输入工号");
int numbner = scanner.nextInt();
array[i] = numbner;
}
// 元素的交换
// 随机一个索引出来 遍历所有的元素 让该元素与随机索引位置的元素进行交换
Random random = new Random();
//遍历所有的元素
for (int i = 0; i < array.length; i++) {
//随机一个索引位置出来 array[index]
int index = random.nextInt(array.length);
//由于两个变量不能直接交换 需要定义一个临时变量存储index位置处的值
int temp = array[index];
array[index] = array[i];
array[i] = temp;
}
//遍历对应的数据
for (int i : array) {
System.out.print(i + "\t");
}
5.数组排序
//冒泡排序 每次从数组中找出最大值放在数组的最后面去
所比较的轮数:数组的长度
每一轮比较的次数:数组的长度-i(i为第几轮)
// 定义有个数组
int[] array = {30, 20, 59, 52, 30};
// 定义一个循环用来控制比较的轮数
for (int i = 0; i < array.length - 1; i++) {
//i=0 比较的次数3 j=0 1 2
// i=1 比较的次数2 j=0 1
for (int j = 0; j < array.length - i - 1; j++) {
// 将数据进行比较 并交换位置
if (array[j] > array[j + 1]) {
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
}
}
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
7.数组的内存分布
1.Java内存分配
2.数组内存分配
3.将两个变量指向同一数值
注意事项:
当两个数组变量指向同一个数组变量时 相当于Java的深拷贝 数组访问的是地址值 第一个改变 后面的赋值都会改变(以最先定义的为准)
8.数组使用的常见问题
1.数组索引越界
如果访问的元素位置超过最大索引 就会引起数组越界异常
2.空指针异常
如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现NullPointerException(空指针异常)