数组
数组的定义
数组的访问
数组名称[索引]
访问数组的长度
System.out.println(array.length);
数组的几个注意事项
数组名[] 数组名 可以写成 数据类型 数组名[]
什么类型的数组存放什么类型的数据,否则报错
数组一旦定义,程序执行的过程中,长度、类型就固定了
静态初始化数组
定义数组的时候直接给数组赋值
静态初始化数组的格式:
//完整格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
//简化格式
数据类型[] 数组名 = {元素1,元素2,元素3...};
注意
数组变量名中存储的是数组在内存中的地址,数组是引用类型
动态初始化数组
定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据
格式
数据类型[] 数组名 = new 数据类型[长度];
int[] arr = new int[3];
//后赋值
arr[0] = 10;
System.out.println(arr[0]);
区别
数据类型 | 明细 | 默认值 |
---|---|---|
基本类型 | byte,short,char,int,long | 0 |
基本类型 | float,double | 0.0 |
基本类型 | boolean | false |
引用类型 | 类,接口,数组,String | null |
当前已经知道存入的元素值,用静态初始化
当前还不清楚要存入哪些数据,用动态初始化
数组的遍历
遍历就是一个一个数据的访问
//终极数组遍历形式
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
数组的案例
求和
某个部门5名员工的销售额分别是:16、26、36、6、100,请计算出他们部门的总销售额
package com.cjcat.creat;
public class demo2 {
public static void main(String[] args) {
int sum = 0;
int[] money = {16, 26, 36, 6, 100};
for (int i = 0; i < money.length; i++) {
sum += money[i];
}
System.out.println(sum);
}
}
求最值
成绩求最值
package com.cjcat.creat;
public class demo2 {
public static void main(String[] args) {
int[] scores = {76, 56, 82, 77, 91, 60, 88};
int max = scores[0];
for (int i = 0; i < scores.length; i++) {
if (max <= scores[i]) {
max = scores[i];
}
}
System.out.println("最大值为:" + max);
}
}
猜数字游戏
一个幸运小游戏,随机生成1-20之间的5个数(无所谓是否重复),然后让大家来猜数字:未猜中提示:“未命中”,并继续猜测,猜中提示:‘运气不错猜中了“,并输出该数据第一次出现的位置,且输出全部5个数据,最终结束本游戏
package com.cjcat.creat;
import java.util.Random;
import java.util.Scanner;
public class demo2 {
public static void main(String[] args) {
//动态初始化数组,存入5个随机的1-20之间的数据
//定义一个死循环,不断的猜数据,遍历数组,判断数据是否在数组中,如果在,进行对应提示并结束死循环;如果没有猜中,提示继续
int[] num = new int[5];
Random r = new Random();
for (int i = 0; i < num.length; i++) {
num[i] = r.nextInt(1, 21);
}
Scanner sc = new Scanner(System.in);
OUT:
while (true) {
System.out.println("输入一个数字:");
int g = sc.nextInt();
for (int i = 0; i < num.length; i++) {
if (g == num[i]) {
System.out.println("运气不错,猜中了。该数据第一次出现的位置为" + i);
break OUT;
}
}
System.out.println("未猜中");
}
for (int i = 0; i < num.length; i++) {
System.out.print(num[i] + "\t");
}
}
}
随机排名
某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。请先依次录入5名员工的工号,然后展示出一组随机的排名顺序
package com.cjcat.creat;
import java.util.Random;
import java.util.Scanner;
public class demo1 {
public static void main(String[] args) {
//目的:键盘录入一组工号,最终要随机输出一组出来作为排名
//动态初始化一个数组,存储5个工号
int[] codes = new int[5];
//定义一个循环,循环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 c = r.nextInt(codes.length);
int temp = codes[c];
codes[c] = codes[i];
codes[i] = temp;
}
//遍历数组元素,输出
for (int i = 0; i < codes.length; i++) {
System.out.print(codes[i] + "\t");
}
}
}
数组排序
就是对数组中的元素,进行升序(由小到大)或者降序(由大到小)的操作
数组排序的技术
冒泡排序
选择排序
快速排序
插入排序
数组搜索相关的技术
二分查找
分块查找
哈希表查找
冒泡排序
每次从数组中找出最大值放在数组的后面去
步骤分析:
确定总共需要做几轮:数组的长度-1
每轮比较几次:数组的长度-i(轮数)
package com.cjcat.creat;
public class demo4 {
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.print(arr[i] + "\t");
}
}
}
Java内存分配
栈:栈内存:方法运行时所进入的内存变量也是在这里
堆:堆内存:new出来的东西会在这块内存中开辟空间并产生地址
方法区:字节码文件加载进入的内存
本地方法栈
寄存器
//两个变量指向同一个数组
package com.cjcat.creat;
public class demo5 {
public static void main(String[] args) {
int[] arr1 = {11, 22, 33};
int[] arr2 = arr1;
System.out.println(arr1);
System.out.println(arr2);
arr2[1] = 99;
System.out.println(arr1[1]);//99
System.out.println(arr2[1]);//99
}
}
数组使用的常见问题
问题一:如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数组索引越界异常)
问题二:如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现NullPointerException(空指针异常)