数组
数组
1.存储相同数据类型的一组连续的数据
2.数组的特点
a.数组本身也是一个变量,既然是变量(局部变量),那么在栈区开辟空间,先声明再赋值再使用
b.数组的数据类型可以是八大基本数据类型和引用类型,数组本身是引用类型
c.创建数组我们需要使用到new,那么new出来的在堆区开辟,所以数组会同时在栈区和堆区开辟空间
d.如果一个数组没有指向堆区某块内存地址,这个时候数组变量为null,如果使用这个变量会出现空指针异常
e.如果一个数组访问了不存在的索引,会出现数组越界
3.格式
a.int[] arr = new int[5];
b.int arr[] = new int[5];
注意:int arr[] = new int[];是错误的
4.数组的初始化
a.静态初始化: 在定义数组的时候先给出元素,然后系统会根据元素的个数计算长度,这种初始化不会指定数组的长度
int[] arr = {11,22,33,44,55};
int[] arr = new int[]{11,22,33,44,55};
b.动态初始化: 在定义数组的时候默认值为堆区变量的默认值,需要给出数组的长度
int[] arr = new int[5]; 默认值是0
5.数组的内存分配
内存分为:
a.栈区: 先进后出,类似于子弹夹,一般用来给局部变量开辟空间
b.堆区: 用于存储new出来的对象
堆区创建出来的对象都会有地址值,而数组变量就是用来存放这个地址的
凡事new出来的对象都有默认值
byte short int long 0
float double 0.0
char ‘\u0000’
boolean false
引用类型 null
堆区一旦被赋值为null的时候,原来的内存空间不会被立刻回收,而是在垃圾回收器空闲的时候回收
int[] arr = new int[5];
arr = null;
c.方法区
静态区
常量池
6.数组的遍历
遍历: 获取数组中的每一个元素
public static void printArr(int[] arr){
for(int i= 0; i < arr.length; i++){
System.out.println(ar[i]);
}
}
7.数组的动态快速初始化 (键盘输入 + 数组的动态初始化 + 数组的遍历)
Scanner input = new Scanner(System.in);
System.out.println("请输入学生的人数:");
double num = input.nextDouble();
double[] arr = new double[num];
for(int i = 0; i < arr.length; i++){
System.out.print("请输入第" + (i+1) + "个学生的成绩");
arr[i] = input.nextDouble();
}
input.close();
8.数组的基本操作
1.数组的遍历 就是获取数组中的每一个元素
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
2.求和求平均值
double sum = 0.0;
for(int i = 0; i < arr.length; i++){
sum += arr[i];
}
double average = sum / arr.length;
3.求最值
最值思想: 假设第一个数为最大值max,遍历获取到数组的每一个元素
拿到每一个元素和这个max进行比较
如果比假定的最大值还要大,那么将该数赋值给最大值
public static int getMax(int[] arr){
int max = arr[0];
for(int i = 0; i < arr.length; i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
4.数组的倒置
public static void reverseArray(int[] arr){
for(int i = 0; i < arr.length / 2; i++){
int temp = 0;
temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
}
5.数组的排序
冒泡排序
public static void bubbleSort(int[] arr){
for(int i = 0; i < arr.length - 1; i++){
for(int j = 0; j < arr.length - 1 - i; j++){
if(arr[j] > arr[j+1]){
int temp = 0;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
选择排序
public static void selectSort(int[] arr){
for(int i = 0; i < arr.length; i++){
for(int j = i+1; j < arr.length; j++){
if(arr[j] > arr[i]){
int temp = 0;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
计算30个学生的平均分
我们了解数组的遍历,知道了如何获取数组的每一个元素
如何来通过键盘输入给数组赋值呢?
*/
import java.util.Scanner;
public class ArrayDemo06 {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int[] arr = new int[30];
for(int i = 0; i < arr.length; i++){
System.out.print("请输入第" + (i+1) + "个学生的成绩:");
arr[i] = input.nextInt();
}
// printArray(arr);
double averageScore = getAverageScore(arr);
System.out.println("全班的平均分为:" + averageScore);
}
public static void printArray(int[] arr){
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
/*
计算平均分
返回值类型: double
参数列表: int[] arr
方法名: getAverageScore
*/
public static double getAverageScore(int[] arr){
/*
1.遍历获取到每一个学生的分数
2.累加求和
3.求平均值
*/
// 1.遍历获取到每一个学生的分数
int sum = 0;
for(int i = 0; i < arr.length; i++){
// 2.累加求和
sum += arr[i];
}
// 3.求平均值
int average = sum / arr.length;
return average;
}
}