数组
一维数组
数组可以存放多个同一类型的数据。数组也是一种数据类型, 是引用类型。
快速入门
import java.util.Scanner;
public class hello{
public static void main(String[] args){
// 一个养鸡场有6只鸡,它们的体重分别是3kg, 5kg, 1kg,3.4kg,2kg,50kg。请问这只鸡的总体重是多少?平
// 均体重是多少?请你编一个程序。
double hen1=3;
double hen2=5;
double hen3=3.4;
double hen4=2;
double hen5=50;
double sum=hen1+hen2+hen3+hen4+hen5;
System.out.println("sum="+sum);
System.out.println("avg="+(sum/5));
}
}
运行结果
分析
过程太麻烦,如果数量翻一个数量级更麻烦,所以可以用数组解决。
数组解决
import java.util.Scanner;
public class hello{
public static void main(String[] args){
// 一个养鸡场有6只鸡,它们的体重分别是3kg, 5kg, 1kg,3.4kg,2kg,50kg。请问这只鸡的总体重是多少?平
// 均体重是多少?请你编一个程序。
double[] hens={3,5,1,3.4,2,50};
double sum=0;
for(int i=0;i<hens.length;i++){
sum+=hens[i];
}
System.out.println("sum="+sum);
System.out.println("avg="+(sum/5));
}
}
运行结果
定义语法
-
数据类型 数组名[]=new 数据类型[大小];
int a[]=new int[10];
-
数据类型 数组名[];或者数据类型[]数组名;
数组名=new数据类型[大小];
int a[];或者int[] a;
a=new int[10];
-
数据类型 数组名[]= {元素值,元素值…};
int a[]={2,5,6,7,8,89,90,34,56};
访问数组元素的方式
数组名[下标/索引] 比如:你要使用a数组的第3个数a[2]
代码演示
import java.util.Scanner;
public class hello{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
// 案例一:循环输入5个成绩,保存到double数组,并输出
//第一种定义方式
// double num[]=new double[5];
//第二种定义方式
double num[]; //或者 double[] num;
num =new double[5];
for(int i=0;i<num.length;i++){
num[i]=input.nextDouble();
}
for(int i=0;i<num.length;i++){
System.out.print(num[i]+"\t");
}
//第三种定义方式
double num1[]={1,2,3,4,5};
for(int i=0;i<num.length;i++){
System.out.print(num1[i]+"\t");
}
}
}
运行结果
使用细节
- 数组是多个相同类型数据的组合,实现对这些数据的统一管理
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
- 数组创建后不赋值默任值 int 0, short 0, byte 0, long 0, float 0.0,double 0.0, char \u0000,boolean false, String null
- 使用数组的步骤: 1.声明数组并开辟空间 2.给数组各个元素赋值 3. 使用数组
- 数组的下标是从0开始的。
- 数组下标必须在指定范围内使用,否则报:下标越界异常,比如int [] arr=new int[5];则有效下标为0-4
- 数组属引用类型,数组型数据是对象(object)
应用案例
import java.util.Scanner;
public class hello{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
// 案例一:创建一个char类型的26个元素的数组,分别放置'A'-'Z。使用for循环访问所有元素并打印出来。
// 提示: char类型数据运算'A'+ 1 - >B'
char charcters[]=new char[26];
for(int i=0;i<charcters.length;i++){
charcters[i]=(char)('A'+i);
}
for(int i=0;i<charcters.length;i++){
System.out.print(charcters[i]+"\t");
}
System.out.println();
// 案例二:请求出一个数组int[]的最大值{4,-1,9, 10,23},并得到对应的下标。
int nums[]={4,-1,9,10,23};
int max=nums[0],index=0;
for(int i=1;i<nums.length;i++){
if(nums[i]>max){
max=nums[i];
index=i;
}
}
System.out.println("max="+max+" index="+index);
}
}
运行结果
赋值机制
基本数据类型赋值,值改变两者相互不影响。数组在默认情况下是引用传递,赋的值是地址。会受影响。
代码演示
import java.util.Scanner;
public class hello{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int n1=100;
int n2=n1;
n2=50;
System.out.println(n1+"\t"+n2);
int n3[]={1,2,3};
int n4[]=n3;
n4[2]=100;
System.out.println(n3[2]+" "+n4[2]);
}
}
运行结果
应用案例
import java.util.Scanner;
public class hello{
public static void main(String[] args){
Scanner input =new Scanner(System.in);
// 案例一:数组拷贝
int num3[]={1,2,3};
int num4[]=new int[3];
for(int i=0;i<num3.length;i++){
num4[i]=num3[i];
}
for(int i=0;i<num4.length;i++){
System.out.print(num4[i]+"\t");
}
System.out.println();
// 案例二:数组反转
int num1[]={1,2,3};
for(int i=0;i<num1.length;i++){
System.out.print(num1[i]+"\t");
}
System.out.println();
int temp=0;
for(int i=0;i<num1.length;i++){
temp=num1[i];
num1[i]=num1[num1.length-1-i];
num1[num1.length-1-i]=temp;
}
for(int i=0;i<num1.length;i++){
System.out.print(num1[i]+"\t");
}
// 案例三:数组添加
while(true){
System.out.print("是否添加元素?(y/n):");
char choice=input.next().charAt(0);
if(choice=='y'){
System.out.print("请输入你要添加的元素:");
int newn=input.nextInt();
int newnum[]=new int[num1.length+1];
for(int i=0;i<num1.length;i++){
newnum[i]=num1[i];
}
newnum[num1.length]=newn;
num1=newnum;
}else{
for(int i=0;i<num1.length;i++){
System.out.print(num1[i]+"\t");
}
break;
}
}
}
}
运行结果
二维数组
快速入门
import java.util.Scanner;
public class hello{
public static void main(String[] args){
Scanner input =new Scanner(System.in);
// 请用二维数组输出如下图形
// 000000
// 001000
// 020300
// 000000
//
//什么是二维数组:
//1. 从定义形式上看int[][ ]
//2. 可以这样理解,相当于一维数组垒在了一起,每个一维数组的长度可以不一样。
int[][] arr = {{0,0,0,0,0,0},{0,0,1,0,0},{0,2,0,3,0,0},{0,0,0,0,0,0}};
//输出二维图形
for(int i = 0; i < arr.length; i++) {//遍历二维数组的每个元素
//遍历二维数组的每个元素(数组)
//1. arr[i] 表示二维数组的第i+1个元素比如arr[0] :二维数组的第一个元素
//2. arr[i].length 得到对应的每个一维数组的长度
for(int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]); //输出了一维数组
}
System.out.println();//换行
}
}
}
运行结果
定义语法
-
数据类型 数组名[] []=new 数据类型[大小] [大小];
int a[] []=new int[10] [10];
-
数据类型 数组名[] [];或者数据类型[] []数组名;
数组名=new数据类型[大小] [大小];
int a[] [];或者int[] [] a;
a=new int[10] [10];
-
数据类型 数组名[] []= {一维数组,一维数组…};
int a[] []={{2,5,6},{7,8,8},{9,90,3},{4,5,6}};
代码演示
import java.util.Scanner;
public class hello{
public static void main(String[] args){
Scanner input =new Scanner(System.in);
// 看一个需求:动态创建下面二维数组,并输出
// i=0:1
// i=1:2 2
// i=2:3 3 3
// 一个有三个一维数组,每个一维数组的元素是不一样的
int[][] arr= new int[3][]; //创建二维数组,但是只是确定维数组的个数
for(int i = 0; i < arr.length; i++) {//遍历arr每个一维数组
//给每个一维数组开空间new
//如果没有给一维数组new ,那么arr[i]就是null
arr[i] = new int[i + 1];
//遍历一维数组,并给一维数组的每个元素赋值
for(int j = 0; j < arr[i].length; j++) {
arr[i][j]=i+1;
}
}
}
}
内存图解
案例练习
import java.util.Scanner;
public class hello{
public static void main(String[] args){
// 案例一:int arr[][]={{4,6},{1,4,5,7},{-2}};遍历该维数组,并得到和
int arr[][]={{4,6},{1,4,5,7},{-2}};
int sum=0;
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
sum+=arr[i][j];
System.out.print(arr[i][j]+"\t");
}
}
System.out.println();
System.out.println(sum);
}
}
运行结果
杨辉三角
import java.util.Scanner;
public class hello{
public static void main(String[] args){
//打印杨辉三角
Scanner input =new Scanner(System.in);
System.out.print("请输入一个整数:");
int num=input.nextInt();
int[][] yangHui = new int[num][] ;
for(int i = 0; i < yangHui.length; i++) {//遍历yangHui的每个元素
//给每个一维数组(行)开空间
yangHui[i] = new int[i+1] ;
//给每个一维数组(行)赋值
for(int j = 0; j < yangHui[i].length; j++){
//每一行的第一个元素和最后一个元素都是1
if(j == 0||j == yangHui[i].length - 1) {
yangHui[i][j] = 1;
} else {//中间的元素
yangHui[i][j] = yangHui[i-1][j] + yangHui[i-1][j -1] ;
}
}
}
for(int i=0;i<yangHui.length;i++){
for(int j=0;j<yangHui[i].length;j++){
System.out.print(yangHui[i][j]+"\t");
}
System.out.println();
}
}
}
运行结果
课后练习
import java.util.Scanner;
public class hello{
public static void main(String[] args){
// 声明: int[] x,y[];以下选项允许通过编译的是():
// a) x[0] = y;//不允许
// b) y[0] = x;//允许
// c y[0][0] = X;//不允许
// d) x[0][0] = y;//不允许
// e) y[0][0] = x[0];//允许
// f)x =y; //不允许
}
}
使用细节
-
一维数组的声明方式有:
int[] x或者int x[]
二维数组的声明方式有:
int[][] y或者int[] y[] 或者int y[]I[]
-
二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。比如: map[][]是一个二维数组map[] [] = {{1,2},{3,4,5}},由map[0]是一个含有两个元素的一维数组,map[1]是一个含有三个元素的维数组构成,我们也称为列数不等的二维数组。
本章作业
import java.util.Scanner;
public class hello{
public static void main(String[] args){
// 1.下面数组定义正确的有 BD
// A. String strs[] = { 'a','b', 'c'};
// B. String[] strs = {"a","b","c"};
// C. String[] strs = new String{"a""b""c"};
// D. String strs[] = new String[]{"a","b","c"};
// E. String[] strs = new String[3]{"a","b","c"};
// 2.写出结果 blue
// String foo= "blue";
// boolean[] bar= new boolean[2];
// if(bar[0]){
// foo= "green";
// }
// System.out.println(foo);
// 3.以下Java代码的输出结果为:
// 1
// 3
// 5
// int num= 1;
// while(num < 10) {
// System.out.println(num);
// if(num>5) {
// break;
// }
// num+= 2;
// }
// 4.已知有个升序的数组,要求插入一个元素,该数组顺序依然是升序,比如:
// [10, 12,45,90],添加23后,数组为[10,12,23, 45,90]\
// int arr[]={10,12,45,90};
// Scanner input=new Scanner(System.in);
// System.out.print("请输入要插入的元素:");
// int num=input.nextInt();
// int newarr[]=new int[arr.length+1];
// int j=1;
// int x=0;
// for(int i=0;i<newarr.length;i++){
// if(num>arr[x]||j==0){
// newarr[i]=arr[x];
// x+=1;
// }else{
// newarr[i]=num;
// j-=1;
// }
// }
// arr=newarr;
// for(int i=0;i<arr.length;i++){
// System.out.print(arr[i]+"\t");
// }
// 5.随机生成1 0个整数(1100的范围)保存到数组,并倒序打印以及求平均值、求最大值和最大值的下标
// 并查找里面是否有8
int arr[]=new int[10];
for(int i=0;i<arr.length;i++){
arr[i]=(int)(Math.random()*100);
}
int maxindex=0;
int max=arr[0];
double sum=0;
int yes=0;
for(int i=arr.length-1;i>0;i--){
System.out.print(arr[i]+"\t");
sum+=arr[i];
if(arr[i]>max){
max=arr[i];
maxindex=i;
}
if(arr[i]==8){
yes=1;
}
}
System.out.println();
if(yes==1){
System.out.println("里面有8");
}
System.out.println("max="+max+"maxindex="+maxindex+"avg="+(sum/arr.length));
// 6.试写出以下代码的打印结果:a,a
// z,z
// 韩,韩
// c,c
// char[] arr1={'a','z','b','c'};
// char[] arr2=arr1;
// arr1[2]= '韩';
// for(int i=0;i < arr2.length; i++){
// System.out.println(arr1[i]+","+ arr2[i);
// }
}
}