Java基础
一、数组
1.什么是数组
- 数组就是一个容器,用来存储多个数据类型相同的数据!
2.数组的动态初始化
- 动态初始化:创建数组的时候没有具体的数据。只给定数组的长度
- 格式 : 数据类型[] 数组名 = new 数据类型[长度];
例如
int[] arr1 = new int[3];//创建一个长度为3的int类型的数组
double[] arr2 = new double[3];//创建一个长度为3的double类型的数组
3.数组索引
- 索引:就是数组元素的编号,编号从0 开始
- 获取数组元素:数组名[索引];
例如
public class Demo {
public static void main(String[] args) {
int[] arr = new int[10];//创建了一个长度为10的int类型的数组
arr[0]=11;//给他第一个元素赋值
arr[1]=22;//给他第二个元素赋值
arr[2]=33;//给他第三个元素赋值
System.out.println(arr[0]);//输出数组中的第一个元素
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
4.数组动态初始化的默认值
整形 0
浮点 0.0
布尔 false
字符 ‘\u0000’(空)
字符串(引用类型) null
- 当数组动态初始化后,不给元素赋值,虚拟机会给他默认值
例如
public class Demo {
public static void main(String[] args) {
int[] arr1 = new int[3];//创建了一个长度为3的int类型的数组
System.out.println(arr1[0]);
char[] arr2 = new char[3];//创建了一个长度为3的char类型的数组
System.out.println(arr2[0]);
String[] arr3 = new String[3];//创建了一个长度为3的String类型的数组
System.out.println(arr3[0]);
double[] arr4 = new double[3];//创建了一个长度为3的double类型的数组
System.out.println(arr4[0]);
}
}
5.数组的静态初始化
- 静态初始化:在创建数组的时候就给他赋值
例如
public class Demo {
public static void main(String[] args) {
int[] arr = new int[]{11,22,33};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
6.数组的内存图
- Java中的内存分配
- 栈内存:方法运行时,进入的内存,局部变量都存放于这块内存当中
- 堆内存:new出来的内容都会进入堆内存,并且会存在地址值
- 方法区:字节码文件(.class文件)加载时进入的内存
- 本地方法栈:调用操作系统相关资源 (现阶段了解即可)
- 寄存器:交给CPU去使用(现阶段了解即可)
单个数组内存图
public class Demo {
public static void main(String[] args) {
int[] arr = new int[3];
arr[0]=11;
arr[1]=22;
arr[2]=33;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
方法执行完弹栈
多个数组内存图(理解了单个,多个与他相似)
public class Demo {
public static void main(String[] args) {
int[] arr1 = new int[3];
int[] arr2 = new int[3];
arr1[0]=11;
arr1[1]=22;
arr1[2]=33;
arr2[0]=44;
arr2[1]=55;
arr2[2]=66;
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println("-----------------");
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
多个数组变量指向相同的内存地址 的内存图
public class Demo {
public static void main(String[] args) {
int[] arr1 = new int[3];
arr1[0]=11;
arr1[1]=22;
arr1[2]=33;
int[] arr2 = arr1;
arr2[2] = 44;
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println("-----------------");
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
7.数组的常见问题
数组索引越界异常(ArrayIndexOutOfBoundsException)
- 当访问的数组元素超出索引范围会报错
public class Demo {
public static void main(String[] args) {
int[] arr = new int[3];//长度为3的数组
arr[0]=11;
arr[1]=22;
arr[2]=33;
//System.out.println(arr[3]);//索引值只有0 1 2 访问3 就会出现异常
}
}
空指针异常(NullPointerException)
- 当数组变量指向null就会出现空指针异常
public class Demo {
public static void main(String[] args) {
int[] arr = new int[3];
arr[0]=11;
arr[1]=22;
arr[2]=33;
arr=null;
// System.out.println(arr[0]);//此处访问就会报空指针异常
//System.out.println(arr[3]);
}
}
注意:当堆里的对象没有被指向的时候jvm会自动回收垃圾,释放内存。
8.数组常见的操作
- 数组的遍历
public class Demo {
public static void main(String[] args) {
int[] arr = new int[]{11,22,33,44,55};
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");//遍历数组是取出数组元素的过程可以用循环完成 i 代表数组的索引
}
}
}
- 求数组中的最大值
public class Demo {
public static void main(String[] args) {
int[] arr = new int[]{11,22,33,44,55};
int max=arr[0];//定义一个max用来存储最大值 先让他等于数组中的第一个元素
for (int i = 1; i < arr.length; i++) {
if (max<arr[i]){//用它和数组中的其他元素依次比较 如果比他大就把大的值赋给他
max=arr[i];
}
}
System.out.println(max);//55
}
}
- 给数组初始化,键盘录入数据赋值,然后求数组的和
public class Demo {
public static void main(String[] args) {
int[] arr = new int[5];
Random r = new Random();
int sum=0;//定义一个求和变量
for (int i = 0; i < arr.length; i++) {
arr[i]=r.nextInt(49)+1;//获取0-49的随机数
sum+=arr[i];//求和
}
System.out.println(sum);
}
}
- 查找元素索引
public class Demo {
public static void main(String[] args) {
int[] arr = new int[]{11,22,33,44,55};
Scanner sc = new Scanner(System.in);
System.out.println("请输入查询的数:");
int a = sc.nextInt();
int index=-1;//定义一个临时变量用来存储索引值,刚开始状态为没找到,所以给他赋值一个-1(因为数组元素从0 开始)
for (int i = 0; i < arr.length; i++) {
if (arr[i]==a){//如果有就把索引赋值给变量然后结束循环
index=i;
break;
}
}
System.out.println(index);//输出-1就代表不存在
}
}
注意:这个程序如果数组里有多个相同的数,只能找出第一个,可以再定义一个数组用来存储索引值,最后遍历。
综合案例(评委打分)
在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。 选手的最后得分为:去掉一个最高分和一 个最低分后 的4个评委平均值
(不考虑小数部分)。
public class Demo {
public static void main(String[] args) {
int[] arr = new int[6];
Scanner sc = new Scanner(System.in);
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入0-100之间的数据:");
int score = sc.nextInt();
if (score>=0&&score<=100){//判断输入的成绩是否在0-100之间 如果在则赋值
arr[i]=score;
}else {//如果不在就给出错误提示并且要重新输入 让他索引值减1 就能实现重新输入
System.out.println("您输入的数据有误,请重新输入");
i--;
}
}
//求最大值最小值 求和
int max=arr[0];
int min=arr[0];
int sum=0;
for (int i = 0; i < arr.length; i++) {
if (max<arr[i]){//求最大
max=arr[i];
}
if (min>arr[i]){//求最小
min=arr[i];
}
sum+=arr[i];
}
//去掉一个最高分和一 个最低分后 的4个评委平均值
System.out.println((sum-max-min)/4);
}
}