开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
数组
数组
数组介绍:数组可以存放多个同一类型的数据,数组也是一种数据类型,是引用类型,即:数(数据)组(一组)就是一组数据
数组快速入门:Array01.java
public class Array01 {
public static void main(String[] args) {
//有六只鸡,它们的体重分别是3,5,1,3.4,2,50kg
//请问这六只鸡得到总体重是多少?平均体重是多少
// 思路分析
// 1.定义六个变量,double,求和
//传统实现的方式问题,6->600-566很麻烦
// double hen1 = 3;
// double hen2 = 5;
// double hen3 = 1;
// double hen4 = 3.4;
// double hen5 = 2;
// double hen6 = 50;
// double totalWeight = hen1 + ... +
//定义一个数组
//1.double[]表示是double类型的数组,数组名hens
//2.{3,5,1,3.4,2,50}表示数组的值、元素,一次表示数组的第几个元素
double[] hens = {3,5,1,3.4,2,50};
// 遍历数组得到数组的元素的和,使用for
//使用一个变量将各个元素累计
//可以通过 数组名.length 得到数组的大小/长度
double totalWeight = 0;
for (int i = 0; i < 6; i++){
totalWeight += hens[i];
}
System.out.println("总体重为" + totalWeight + "kg");
System.out.println("平均体重为" + totalWeight / 6);
}
}
有六只鸡,它们的体重分别是3,5,1,3.4,2,50kg,请问这六只鸡得到总体重是多少?平均体重是多少
比如,我们可以用数组解决上一个问题
数组的使用
- 使用方式一--动态初始化
数组的定义
数据类型 数组名[] = new 数据类型[大小]
int a[] = new int[5];//创建了一个数组,名字a,存放5个int
说明:这是定义数组的一种方法
数组的引用
数组名[下标/索引]比如要使用a数组中的第三个数 a[2];
快速入门案例Array02.java
import java.util.Scanner;
public class Array02 {
public static void main(String[] args) {
//演示 数据类型 数组名[] = new 数据类型[大小]
//循环输入5个成绩,保存到double数组,并输出
Scanner scanner = new Scanner(System.in);
// double scores[] = new double[5];
double scores[]; //声明数组,这时scores是null
scores = new double[5]; //分配内存空间,可以存放数据
for (int i = 0; i < scores.length; i++){
System.out.println("请输入第" + (i+1) + "个数");
scores[i] = scanner.nextDouble();
}
for (int i = 0; i < scores.length; i++){
System.out.println(scores[i]);
}
}
}
循环输入5个成绩,保存到double数组,并输出
- 使用方式二--动态初始化(先声明数组再分配空间)
先声明数组 //在内存中还没有分配空间
语法:数据类型 数组名[]; 也可以 数据类型[] 数组名;
int a[];
int[] a;
创建数组
语法:数组名 = new 数据类型[大小]; //此时才进行分配空间
a = new int[10];
案例演示:
前面的修改即可
- 使用方式三--静态初始化
初始化数组
语法:数组类型 数组名[] = {元素值,元素值,……}
int a[] = {2,5,6,7,8,89,90,34,56};
//如果知道数组有多少元素,具体值,上面的用法相当于
int a[] = new int[9];
a[0] = 2;………………
快速入门案例【养鸡场】
Array01.java
使用细节
-
数组就是多个相同类型数据的组合,实现对这些数据的统一管理
-
数组中的元素可以是任何类型的数据,包括基本类型和引用类型,但是不能混用
-
数组创建后,如果没有赋值,有默认值
int 0; short 0; byte 0; long 0; float 0.0f; double 0.0; char \u0000; boolean false; String null; -
使用数组的步骤
- 声明数组并开辟空间
- 给数组各个元素赋值
- 使用数组
-
数组的下标是从零开始的
-
数组下标必须在指定范围内使用,否则报:下标越界异常,比如:
int [] arr = new int[5];//有效下标是0-4 -
数组属于引用类型,数组型数据是对象(object)
数组应用案例
-
创建一个char类型的26个元素的数组,分别放置'A'-'Z'使for循环访问所有元素并打印出来:ArrarExercise01.java
public class ArrarExercise01 { public static void main(String[] args) { // 创建一个char类型的26个元素的数组 // 分别放置'A'-'Z'使for循环访问所有元素并打印出来 char array[];//声明数组 array = new char[26]; char c = 'A'; for (int i = 0; i < array.length; i++){ array[i] = c; c++; } for (int j = 0; j < array.length; j++){ System.out.println(array[j]); } } } -
请求出一个数组int[]的最大值{4,-1,9,10,23}并得到对应的下标ArrarExercise02.java
public class ArrarExercise02 { public static void main(String[] args) { //请求出一个数组int[]的最大值{4,-1,9,10,23}并得到对应的下标 // int num[]; // num = new int[1]; int[] num = {4,-1,9,10,23}; int max = num[0]; int xiabiao = 0; for (int i = 0; i < num.length; i++) { if (max < num[i]) { max = num[i]; xiabiao = i; } } System.out.println(max); System.out.println(xiabiao); } } -
请求出一个数组的和和平均值
数组赋值机制
-
基本数据类型赋值,这个值就是具体的数据,而且相互不影响
int n1 = 2; int n2 = n1; -
数组在默认情况下是引用传递,赋的值是地址,看一个案例(重点)ArrayAssign.java
public class ArrayAssign { public static void main(String[] args) { //基本数据类型赋值,赋值方式为值拷贝 //n2的变化,不会影响n1的值 // int n1 = 10; // int n2 = n1; // // n2 = 80; // System.out.println("n1 = " + n1); // System.out.println("n2 = " + n2); //数组在默认情况下是引用传递,赋的值是地址,赋值的方式为引用赋值 //是一个地址,arr2变化会影响到arr1 int[] arr1 = {1,2,3}; int[] arr2 = arr1; arr2[0] = 5; for (int i = 0; i < arr1.length; i++){ System.out.println(arr1[i] + " " + arr2[i]); } } } int arr1 = {1,2,3}; int arr2 = arr1;
数组拷贝
编写代码实现数组拷贝(内容复制)ArrCopy.java
public class ArrayCopy {
public static void main(String[] args) {
//拷贝到arr2数组,要求数据空间是独立的
int[] arr1 = {10,20,30};
//先创建一个新的数组,arr2,开辟新的数据空间
//大小等于arr1.length
int[] arr2 = new int[arr1.length];
//遍历arr1,把每个元素拷贝到对应位置
for (int i = 0; i < arr1.length; i++){
arr2[i] = arr1[i];
}
}
}
将
int[] arr1 = {10,20,30};
//拷贝到arr2数组
数组反转
要求把数组的元素内容反转。ArrayReverse.java
public class ArrayReverse {
public static void main(String[] args) {
//定义数组
int[] arr = {11,22,33,44,55,66};
int[] arr1 = new int[arr.length];
for (int i = arr.length - 1,j = 0; i >= 0; i--,j++){
//逆序遍历arr再正着赋给arr1
arr1[j] = arr[i];
}
//把arr指向arr1
//原本arr的地址指向的内存会被当成垃圾进行销毁
arr = arr1;
for (int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
}
arr{11,22,33,44,55,66}->{66,555,44,33,22,11}
思考:
方式一:通过找规律反转
方式二:通过逆序赋值方式
数组扩容
要求:实现动态的给数组添加元素效果,实现对数组扩容ArrayAdd.java
public class ArrayAdd {
public static void main(String[] args) {
//定义初始数组int[] arr = {1,2,3}
//将原数组拷贝到新数组,新数组的长度是arr.length + 1
int[] arr = {1,2,3};//原数组
int[] arrNew = new int[arr.length + 1];//新数组
for (int i = 0; i < arr.length; i++){//将原数组的值赋给新数组
arrNew[i] = arr[i];
}
arrNew[arrNew.length - 1] = 4;//把4赋给新数组的最后一个值
arr = arrNew;//将原数组指向新数组,原数组内存空间将会被垃圾回收处理
for (int i = 0; i < arr.length; i++){//遍历arr
System.out.println(arr[i]);
}
}
}
原始数组使用静态分配
int[] arr = {1,2,3};
增加的元素,直接放在数组的最后 arr = {1,2,3,4}
arrNew = {1,2,3,4}
用户可以通过如下方法来决定是否继续添加,添加成功,是否继续y/n
课后练习:ArrReduce.java
import java.util.Scanner;
public class ArrayReduce {
public static void main(String[] args) {
//数组缩减
//有一个数组{1,2,3,4,5}可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后那个元素,当只剩下最后一个元素时,提示:不能再缩减
/*
思路分析
1.原数组
2.创建一个新数组,长度为原数组减一,将原数组除了最后一个元素外拷贝到新数组
3.将原数组指向新数组
*/
Scanner scanner = new Scanner(System.in);
int[] arr = {1,2,3,4,5};//原数组
do {
if (arr.length <= 1){
System.out.println("就剩一个元素啦,不能再缩减了哦");
break;
}
//定义一个新数组,将新数组拷贝到新数组中
int[] arr2 = new int[arr.length - 1];
//拷贝
for (int i = 0; i < arr.length - 1; i++){
arr2[i] = arr[i];
}
//指向新数组
arr = arr2;
for (int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
System.out.println("请问是否继续缩减 y/n");
char c = scanner.next().charAt(0);
if (c == 'n'){
break;
}
}while(true);
}
}
有一个数组{1,2,3,4,5},可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后的元素,当只剩下最后一个元素,提示不再缩减