1、数组的概念
1)什么是数组?
数组是有序的元素序列。组成数组的各个变量称为数组的分量,也称为数组的元素,也成为下标变量。用于区分数组的各个元素的数字编号称为下标。
2)js中和Java中数组对比:
js数组:数组没有数据类型限制,并且可以随意扩充
Java数组:将相同数据类型的数据进行存储的数据格式。定容,统一数据类型
两者数组下标都是从0开始。
3)Java数组的特点:
a. Java数组是一种引用数据类型
b. Java数组中的数据类型必须统一
c. Java数组的长度是定长的(长度一旦确定就不能变)
d. 数组的重新赋值,只能通过标准格式,不能使用简略格式赋值
e. 初始化数组时如果没有直接赋值,那么数组中的元素默认值如下
整数:0;浮点数:0.0;字符:'\u0000';布尔型:false;引用类型:null
f. 因为数组是定长的,如果像扩容,只能重新创建新的数组。
Arrays.copyOf(原始数组,长度)。
2、数组的定义
//定义有长度的数组
数据类型[] 数组变量 = new 数据类型[数组容量];
//定义有初始值的数组
数据类型[] 数组变量 = new 数据类型[]{数据1,数据2, ...};
//直接赋值创建(静态创建),定义和赋值必须写在一起
数据类型[] 数组变量 = {数据1,数据2, ...};
3、数组的使用
4、数组在内存中的存储方式
数组为引用数据类型,在堆中开辟一块连续的空间,数组变量在栈中定义,存储的是数组的起始地址。
5、数组的遍历
1)for+索引 遍历
2)for each 遍历
int[] nums = new int[5];
//for+索引 遍历
for(int i = 0; i < nums.length; i++){
System.out.println(nums[i]);
}
//for each 遍历
for(int n : nums){
System.out.println(n);
}
6、数组练习案例
public class Test4 {
public static void main(String[] args) {
//循环输入五个数,求和,平均值,最大值,最大值位置,最小值,最小值的位置
Scanner scanner = new Scanner(System.in);
int[] nums = new int[5];
for (int i = 0; i < nums.length; i++) {
System.out.println("请输入第"+(i+1)+"个数:");
nums[i] = scanner.nextInt();
}
int sum = 0;
int max = nums[0];
int maxpos = 0;
int min = nums[0];
int minpos = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (max < nums[i]){
max = nums[i];
maxpos = i;
}
if (min > nums[i]){
min = nums[i];
minpos = i;
}
}
System.out.println("最大值:"+max+";最大值所在位置:"+maxpos);
System.out.println("最小值:"+min+";最小值所在位置:"+minpos);
System.out.println("总和:"+sum+";平均值:"+(double)(sum / nums.length));
}
}
7、排序算法
1)冒泡排序:N元数组冒泡排序,两两相比小的向前移,外层循环从1开始,内层循环减去i
public class Maopao {
public static void main(String[] args) {
//冒泡排序:N元数组冒泡排序,两两相比小的向前移,外层循环从1开始,内层循环减去i
int[] nums = new int[]{12,23,10,67,24};
System.out.println("冒泡排序后的数组为:");
for (int n :
nums) {
System.out.print(n+"\t");
}
System.out.println();
//比较的轮数,从1开始
for (int i = 1; i < nums.length; i++) {
//nums.length-i为比较的次数
for (int j = 0; j < nums.length-i; j++) {
//比较
if (nums[j]>nums[j+1]){
//换位
int temp = 0;
temp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
}
}
}
System.out.println("冒泡排序后的数组为:");
for (int n :
nums) {
System.out.print(n+"\t");
}
}
}
2)选择排序:每轮排序都选择数据最小的那个元素(下标),与本轮排位第一的元素换位
public class Xuanze {
public static void main(String[] args) {
//选择排序:从小到大排序,每轮记录最小值的数组下标,使用数组下标将该位置上的元素与首位交换
int[] nums = new int[]{12,34,67,10,4};
System.out.println("选择排序前的数组为:");
for (int n : nums) {
System.out.print(n+"\t");
}
System.out.println();
//控制轮数,以及首位的位置
for (int i = 0; i < nums.length-1; i++) {
int k = i;
for (int j = k+1; j < nums.length; j++) {
//通过比较,记录最小值的位置
//如果k上的值比j上的大
if (nums[k] > nums[j]){
//把j的值赋值给k。k总是指向最小值
k = j;
}
}
//如果最小值的位置,和排位第一的位置不同,则换位
if (k!=i){
int temp = nums[i];
nums[i] = nums[k];
nums[k] = temp;
}
}
//System.out.println(k);
System.out.println("选择排序后的数组为:");
for (int n : nums) {
System.out.print(n+"\t");
}
}
}
8、Arrays工具类
1)Arrays.toString():将数组转成字符串输出,[数据1,数据2,……];
2)Arrays.sort():将数组进行排序,从小到大排序
3)Arrays.copyOf()数组扩容,数组是定长的,一旦确定,长度就不可变,若想改变数组长度,需要重新创建,copyOf将数组复制到一个新的数组中,可以增长也可以缩短,增长后的数组,剩余的数组元素内容为默认值。
9、对象数组
1)数组对象的创建:
创建一个长度为3的对象数组
Student[] stu = new Student[3];
2)对象数组的赋值:
stu[0] = new Student("name",age);
3)对象数组的遍历:
for+数组下标遍历
for each遍历
10、二维数组
1)二维数组的创建:
创建一个3行2列的二位数组
String[][] str = new String[3][2];
String[][] str = new String[][]{
{"张三","李四"},
{"王五","赵六"},
{"黑伞","迪克"}
};
2)二维数组的遍历输出
//二维数组的定义
String[][] str = {
{"张三","李四"},
{"王五","赵六"},
{"李维嘉","时代话"}
};
//二维数组的遍历输出
for(int i = 0;i<str.length;i++){
for(int j = 0;j<str[i].length;j++){
System.out.print(str[i][j]+" ");
}
System.out.println();
}