数组
数组就是用来存储一批同种类型数据的内存区域(可以理解为容器)
int[] arr = {20,10,60,80};
String[] names = {'a','b','c'};
定义数组&存储数据
静态初始化数组
静态初始化数组——定义数组的时候直接给数组赋值(已知存入的元素值)
数组变量名中存储的是数组在内存中的地址,数组是引用类型。具体的数据存放在堆内存中。
基本数据类型:数据是存储在自己的空间中
赋值给其他变量也是赋的真实值
eg:int a = 10;
int b = a; //此时的b=10
引用数据类型:数据值是存储在其他空间的,自己空间存储的是地址值
赋值给其他变量,赋的是地址值
eg:
Student s1 = new Student();
Student s2 = s1;
// 数据类型[] 数组名 = new 数据类型[] {元素1, 元素2, 元素3...};
// 完整格式
double[] scores = new double[]{84.9, 88.9,44.2};
int[] ages = new int[]{12,14,56};
// 简化格式
// 数据类型[] 数组名 = {元素1, 元素2, 元素3...};
int[] ages = {12,14,56};
数组的访问:数据名称[索引]
数组的长度:数组名称.length
数组最大索引:数组名.length-1
注意事项
- 数据类型[] 数组名 == 数据类型 数组名[]
- 什么类型的数组存放什么类型的数据
- 数据一旦定义出来,程序执行的过程中,长度、类型就固定了
int[] arr = {12,24,36};
// 取值
System.out.println(arr[0]};// 12
//赋值
arr[2] = 100;
System.out.println(arr[2]};// 100
// 数组的长度属性:length
// 获取数组的长度(就是数组元素的个数)
System.out.println(arr.length};// 3
// 数组的最大索引表示
// 数组名.length - 1 //元素的个数需要大于1
数组的动态初始化
定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据。
(不清楚存入的数据)
// 数据类型[] 数组名 = new 数据类型[长度];
int[] arr = new int[3];
//后赋值
arr[0] = 10;
System.out.println(arr[0]);//10
数组的遍历
遍历:就是一个一个数据的访问、
int[] ages = {20,40,59};
for (int i = 0; i <ages.length;i++) {
System.out.println(ages[i]);
}
实例
// 1. 数组元素求和
int[] money = {15,25,4,13,100};
int sum = 0;
for (int i = 0; i<money.length;i++){
sum+=money[i];
}
// 2. 数组求最值
int max = money[0];
for (int i = 0; i<money.length;i++){
if (money[i]>max){
max = money[i];
}
}
// 3. 猜数字游戏
// 游戏后台随机生成1-20之间的5个数(无所谓是否重复),然后让大家来猜数字
import java.util.Random;
import java.util.Scanner;
public class GuessNumber {
public static void main(String[] args) {
Random r = new Random();
// int right = r.nextInt(100);
int[] guess_num = new int[5]; // create an array for random number
for (int i = 0;i<5;i++){
guess_num[i] = r.nextInt(20);
System.out.println(guess_num[i]);
}
// boolean flag=true;
drop: while(true) {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
for (int i = 0;i<5;i++) {
if (number == guess_num[i]){
System.out.println("right!!! the index is : "+i);
// flag = false;
break drop;
}
// else{
// System.out.println("error");
// }
}
System.out.println("猜错了,继续猜吧");
// for (int i = 0;i<5;i++){
// if (number > guess_num[i]){
// System.out.println("过大了");
// }else if (number < guess_num[i]){
// System.out.println("过小了");
// }else{
// System.out.println("猜对了");
// break;
// }
// }
}
}
}
// 4. 随机排名
// 某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。
// 请先依次录入5名员工的工号,然后展示出一组随机的排名顺序
import java.util.Random;
import java.util.Scanner;
public class RandomRank {
public static void main(String[] args){
int[] workNums = new int[5];
Scanner sc = new Scanner(System.in);
// 录入工号
for (int i = 0; i < workNums.length; i++) {
System.out.println("请输入第" + (i+1) + "员工的工号: " );
int workNum = sc.nextInt();
workNums[i] = workNum;
}
// 输出排序前的工号
System.out.print("排序前:");
for (int i = 0; i < workNums.length; i++){
System.out.print(workNums[i] + "\t");
}
System.out.print("\n"+"随机排序以后的工号: ");
Random r = new Random();
int temp = 0; // 暂时存放
for (int i = 0; i < workNums.length; i++){
int index = r.nextInt(5);
temp = workNums[i];
workNums[i] = workNums[index];
workNums[index] = temp;
}
for (int i = 0; i < workNums.length; i++){
System.out.print(workNums[i] + "\t");
}
}
}
// 数组排序
// 对数组中的元素进行升序或者降序
// 常见技术
// 冒泡排序
// 选择排序
// 快速排序
// 插入排序
// 数组搜索相关技术
// 二分搜索
// 分块搜索
// 哈希表查找
内存内存原理
- 栈
方法运行时使用的内存,比如main方法运行,进入方法栈中执行 - 堆
存储对象或者数据,new来创建的,都存储在堆内存 - 方法区
字节码文件加载时进入的内存,存储可以运行的class文件 - 本地方法栈
JVM在使用操作系统功能的时候使用 - 寄存器
给CPU使用
数组使用注意
问题1:如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数组索引越界异常)
问题2:如果数组变量中没有存储数组的地址,而是null, 在访问数组信息时会出现NullPointerException(空指针异常)
3. 如果两个数组指向同一个小空间的时候(对应同一个地址),那么其中一个数组的对小空间的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果。