Java学习笔记-Day07 Java数组
一、数组的介绍
1、数组的概念
- 数组是一组类型相同的数据的集合。
- 数组中可以存储多个数据,但是这些数据的类型必须相同。
- 数组能够作为数据的容器使用,把多个数据集中存储。
- 当需要同时保存多个类型相同的变量并进行处理时,可以考虑用数组。
2、数组的元素
- 数组中存储的数据称为数组的元素(Element)。
- 数组的元素都有相应的索引值(下标),索引值从0开始,最大的索引值为数组长度-1。数组中的数据可以通过索引方便获取或修改。
- 数组元素通过索引表示: 数组变量名[索引值] 例如:array[0] 。
3、数组的长度
- 在创建数组的时候,一定要确定数组的长度。
- 数组的长度将在初始化数组元素的时候,同时初始化到内存中。
- 数组的长度: 数组变量名.length 例如:array.length 。
4、数组的数据类型
数组本身是引用类型,但是数组中的元素可以是基本数据类型,也可以是引用类型。
5、数组的区分
一维数组的元素都是单个数据,二维数组的元素都是一维数组,三维数组的元素都是二维数组,依次类推。
6、数组的特点
优点:数组在内存中是连续分配,所以读取速度快。
缺点:Java的数组长度一经确定不能改变。
二、一维数组的声明
-
语法1: 数组元素类型[ ] 变量名称; 例如:int[] a; 或 String[] s;
-
语法2: 数组元素类型 变量名称[ ] ; 例如:int a[]; 或 String s[];
不论数组中元素是什么类型,以上声明形式都适用。
三、一维数组的初始化
1、数组的初始化有两种方式
(1)动态初始化:初始化时我们只指定数组长度,由系统为数组元素分配初始值。
语法:数组元素类型[ ] 变量名称=new 数组元素类型[数组长度];
//a1的长度为5,元素的值为默认值0
int[] a1=new int[5];
(2)静态初始化:初始化时由我们显式指定每个数组元素的初始值,由系统决定数组长度。
语法1:数组元素类型[ ] 变量名称=new 数组元素类型[]{用逗号隔开元素的具体值};
//a2的长度为3,元素的值为1,4,10
int[] a2=new int[]{1,4,10};
语法2:数组元素类型[ ] 变量名称= {用逗号隔开元素的具体值};
//a3的长度为4,元素的值为34,23,4,10
int[] a3={34,23,4,10};
不管采用哪种方式初始化Java 数组,一旦初始化完成,该数组的长度就不可改变。
2、数组的元素如果没有赋值,则为其数据类型的默认值。
- 数组元素的类型是基本类型中的整数类型(byte 、short、int 和long ),则数组元素的值是0 。
- 数组元素的类型是基本类型中的浮点类型(float 、double ),则数组元素的值是0.0。
- 数组元素的类型是基本类型中的字符类型(char ,则数组元素的值是’\u0000’。
- 数组元素的类型是基本类型中的布尔类型(boolean),则数组元素的值是false 。
- 数组元素的类型是引用类型(类、接口和数组),则数组元素的值是null 。
3、Java 的 数组变量 是一种 引用类型 的变量,存储在栈内存中,但数组变量并不是数组本身。而 数组变量的值 是数组的首地址,它指向存储在堆内存中的数组具体内容。
四、一维数组的遍历
将数组中的元素一个一个取出来使用,这个过程叫遍历。通过循环语句实现遍历,使用数组的长度控制循环的次数。
(1)for循环遍历:可以用于操作和输出数组的元素。
int[] a=new int[]{1,2,10};
//使用for循环遍历
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
(2)增强for循环遍历:只能用于输出数组的元素。
int[] a=new int[]{1,2,10};
//使用增强for循环遍历
for(int n:a){
System.out.println(n);
}
注意:
ArrayIndexOutOfBoundException 为 数组索引超出范围异常。
NullPointerException 为 空指针异常。
五、通过控制台输入给一维数组赋值
通过控制台输入给一维数组赋值。
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
// 创建Scanner对象
Scanner input = new Scanner(System.in);
// 定义数组score
double[] score = new double[10];
// for循环给数组 score 的元素赋值
for (int i = 0; i < score.length; i++) {
System.out.println("请输入数据:");
// 接收数据
score[i] = input.nextDouble();
}
// 关闭输入的流
input.close();
}
}
六、冒泡排序
冒泡排序主要的思想是进行相邻的两个元素之间比较并且交换,有利于利用原有元素在集合中的位置优势,冒泡排序的原则是大的下沉、小的上浮。
- 冒泡排序(从小到大排序)
/**
* 冒泡排序(从小到大排序)
*
* @author Administrator
*
*/
public class Demo{
public static void main(String[] args) {
int[] array = {-1,10,5,1,50,45,20,50};
// for循环遍历输出排序前的数组
System.out.println("排序前");
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
// 使数组array从小到大排序
// 外循环控制数组元素比较的轮数
for (int i = 0; i < array.length-1; i++) {
// 内循环控制每一轮比较的次数
for (int j = 0; j < array.length-i-1; j++) {
// 判断array[j] > array[j+1]是否满足
// 满足就相互交换位置,将比较小的数放在前面,比较大的数放在后面
// j为内循环变量
if(array[j] > array[j+1]) {
// 两个变量交换位置
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
// for循环遍历输出排序后的数组
System.out.println("排序后");
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
2. 冒泡排序(从大到小排序)
/**
* 冒泡排序(从大到小排序)
*
* @author Administrator
*
*/
public class Demo {
public static void main(String[] args) {
int[] array = {-1,10,5,1,50,45,20,50};
// for循环遍历输出排序前的数组
System.out.println("排序前");
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
// 使数组array从大到小排序
// 外循环控制数组元素比较的轮数
for (int i = 0; i < array.length-1; i++) {
// 内循环控制每一轮比较的次数
for (int j = 0; j < array.length-i-1; j++) {
// 判断array[j] > array[j+1]是否满足
// 满足就相互交换位置
// 将比较大的数放在前面,比较小的数放在后面
// j为内循环变量
if(array[j] > array[j+1]) {
// 两个变量交换位置
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
// for循环遍历输出排序后的数组
System.out.println("排序后");
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
七、题目
控制台接收10个学生成绩,存放在数组中,输出学生成绩的最高分、最低分、总分、平均分。
import java.util.Scanner;
/**
* 控制台接收10个学生成绩,存放在数组中,输出最高分和最低分,和,平均分。
*
* @author Administrator
*
*/
public class Demo_Array3 {
public static void main(String[] args) {
// 创建Scanner对象
Scanner input = new Scanner(System.in);
// 定义score数组,用于接收学生们的成绩
double[] score = new double[10];
// for循环给数组的元素赋值
for (int i = 0; i < score.length; i++) {
System.out.println("请输入第" + (i + 1) + "个学生的成绩:");
// 接收学生的成绩
score[i] = input.nextDouble();
}
// 关闭输入的流
input.close();
// ‘假设’数组的第一个元素是最大值,将其赋值给保存最高分的变量max
double max = score[0];
// ‘假设’数组的第一个元素是最小值,将其赋值给保存最低分的变量min
double min = score[0];
// 使用循环来比较,从而得到最大值和最小值
for (int i = 1; i < score.length; i++) {
// 将数组的其余元素与max进行比较
// 如果那个数组元素比max大,说明max不是最大值,将那个数组元素赋值给max
if (score[i] > max) {
max = score[i];
}
// 将数组的其余元素与min进行比较
// 如果那个数组元素比min小,说明min不是最小值,将那个数组元素赋值给min
if (score[i] < min) {
min = score[i];
}
}
// 输出最高分 max
System.out.println("max is:" + max);
// 输出最低分 min
System.out.println("min is:" + min);
// 学生成绩的和
double sum = 0.0;
// 学生成绩的平均值
double averge = 0.0;
// 使用循环来对数组元素进行累加求和
for (int i = 0; i < score.length; i++) {
sum += score[i];
}
// 学生成绩的平均值=学生成绩的和/数组的长度
averge = sum / score.length;
System.out.println("sum is:" + sum);
System.out.println("averge is:" + averge);
System.out.printf("平均值 %.2f", averge);
}
}