文章目录
0.数组概述
-
数组是多个相同类型数据的组合,实现对这些数据的统一管理
-
数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量
-
数组中的元素可以是任何数据类型,包括基本类型和引用类型
1.一维数组
1.1一维数组声明创建对象
1.1.1声明方式
type var[] 或 type[] var
例如
int a[];
int[] a1;
double b[];
double[] c;
- 在java中声明数组不能指定其长度,例如
int a
[5] 是违法的
1.1.2 创建一维数组(定义及初始化)
①创建但不赋初值
int a[] = new int[5];//每个元素默认值为0
//错误示范
int a[3];
int a[3] = new int[];
int a[3] = new int[3];
②静态创建并初始化
int a[] = {1,2,3,4,5};
//等价于
a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;
③使用初始化列表动态创建并初始化
int a[] = new int[]{1,2,3,4,5};//等同于静态初始化
//错误示例
int a[] = new int[5]{1,2,3,4,5};
④指向已有数组
int a[] = new int[]{1,2,3,4,5};
int e[] = a;//指向已有数组对象
//错误示例
int a[];
int e[] = a;//指向未初始化引用
1.2一维数组内存排列
1.3 一维数组元素的引用
数组元素的引用方式: arrayName[index]
index
为数组元素 下标
数组元素下标从0开始;
长度为n的数组合法下标取值范围:0 ~ n-1;
每个数组都有一个属性length指明它的长度,例如:
a.length
指明数组a的长度(元素个数)。
- 访问单个元素
int a[] = new int[]{1,2,3,4,5};
a[0]=6;
a[1]=7;
a[3]=5;
- 遍历所有元素
for(int i=0;i<a.length;i++){
a[i] = xxx;
}
例子
1.定义一一个10个元素的数组a[10],要求手动从控制台输入每个元素的值,然后将每个元素的值统一 打印出来。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
// 定义一一个10个元素的数组a[10],要求手动从控制台输入每个元素的值,然后将每个元素的值统一 打印出来。
int[] a = new int[10];
Scanner sc = new Scanner(System.in);
for(int i=0;i<a.length;i++){
System.out.println("请输入a["+i+"]的值:");
a[i] = sc.nextInt();
}
System.out.println("输入完毕");
System.out.println("数组a的元素为");
for(int j = 0;j<a.length;j++){
System.out.print(a[j]+" ");
}
}
}
2.在上题的基础上,将程序修改为:分两批对数组进行赋值,第一次只赋值下标为0、2、4、6等偶数元素,第二次只赋值下标为1、3、5、7等奇数元素。然后分别打印出来,如:
下标为偶数的数组元素值为:
下标为0的元素值为XX。
下标为2的元素值为XX。
下标为4的元素值为XX。
…
下标为奇数的数组元素值为:
下标为1的元素值为XX。
下标为3的元素值为XX。
下标为5的元素值为XX。
提示:方法一、可以用for语句直接进行赋值(考虑下标一次增加多少? )。方法二、也可以用取模运算符“%”,判断哪些是偶数下标、哪些是奇数下标。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
// 定义一一个10个元素的数组a[10],要求手动从控制台输入每个元素的值,然后将每个元素的值统一 打印出来。
int[] a = new int[10];
Scanner sc = new Scanner(System.in);
for(int i=0;i<a.length;i+=2){
System.out.println("请输入a["+i+"]的值:");
a[i] = sc.nextInt();
}
for(int i=1;i<a.length;i+=2){
System.out.println("请输入a["+i+"]的值:");
a[i] = sc.nextInt();
}
System.out.println("输入完毕");
System.out.println("数组a的元素为");
for(int j = 0;j<a.length;j+=2){
System.out.println("下标为"+j+"的元组值为"+a[j]);
}
for(int i=1;i<a.length;i+=2){
System.out.println("下标为"+i+"的元组值为"+a[i]);
}
}
}
2.二维数组
2.1定义及初始化
2.2.1 定义
int a[][] = new int[3][];
跟一维数组类似,定义二维数组时,不能指定其第1维度(低维)的长度,但必须指定第2维( 高维)的长度:
对于java的二维数组,意为:‘“一维数组对象组成的数组,叫
做二维数组." 换句话说,就是二维数组中的每一个元素,是一个一维数组对象。
2.1.2 初始化
①创建但不赋值
int a[][] = new int[3][];//每个元素的值默认null;
//一下为错误示范
int a[3][] = new int[3][];//引用本身不能指定长度
int a[][] = new int[][];//必须指定第二维长度
int a[][] = new int[3][4];//低维指定长度不报错,但无意义
②静态创建并初始化
int a[][] = {{1,2,3},{4,5,6},{7,8,9}};
//等价于对高维每个元素分别赋值:
int a[][] = new int[3][];
a[0] = new int[]{1,2,3};
a[1] = new int[]{4,5,6};
a[2] = new int[]{7,8,9};
③使用初始化列表动态创建并初始化
int a[][] = new int[][]{new int[5],new int[5],new int[5]};
④指向已有数组
int a[][] = new int[3][];
int b[][] = a;//指向已有数组对象
⑤不定长二维数组
int a[][] = new int[][]{new int[3],new int[4],new int[5]};
在java中, 由于二维数组实际上是“一维数组对象组成的数组。"本质上其还是一个一维数组(只是它里面的每个元素也是一维数组),因此它内部只要是一维数组对象即可(并不一定非得长度相等)
2.2二维数组的引用
- 假设定义二维数组为:
int a[][] = new int[][]{new int[5],new int[5],new int[5}
//逻辑上的维度为3行5列(c语言中为int a[3][5])
- 访问单个元素
a[0][1]=30;a[1][2]=80;a[2][4]=62;
- 遍历所有元素
for(int i=0;i<a.length;i++)
for(int j=0;j<a[i].length;j++)
a[i][j]=xxx;
2.3二维数组内存布局(与c语言中的不同)
c语言中的二维数组,
实际上是由同长度的一维数组拼接而成的:内存是连续分布的
java中的二维数组
而java中的二维数组,其本身本质上是一一个一维数组,内存连续;但由于其每个元素本身是一个一维数组对象的引用(长度可以不相等)。因此其内存是由一段一段的一维数组“链接”而成。逻辑上是一个整体,但物理上并不连续:
int a[][] = new int[][]{new int[2],new int[4],new int[3]};
例子
1.设计一个N行N列的二维数组,将每个数组元素的值从N2
到1进行赋值,如a[0][0]= N^2
, a[0][1]= N^2- 1
,…a[N-1][N-1]=1
。 并将结果打印出来。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
// 1.设计一个N行N列的二维数组,将每个数组元素的值从N2
// 到1进行赋值,如`a[0][0]= N^2`, `a[0][1]= N^2- 1`,...`a[N-1][N-1]=1`。 并将结果打印出来。
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想创建的正方形二维数组的行数:");
int n = sc.nextInt();
int[][] a = new int[n][];
// 注意记得初始化
for(int i=0;i<n;i++){
a[i] = new int[n];
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a[i][j] = i*n+j;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}
2.求二维数组(3行3列)的对角线元素的和
10,12,13
14,15,16
17,18,19
public class Main{
public static void main(String[] args){
// 2.求二维数组(3行3列)的对角线元素的和
//10,12,13
//14,15,16
//17,18,19
int sum=0;
int[][] a = new int[][]{{10,12,13},{14,15,16},{17,18,19}};
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
if(i==j){
sum+=a[i][j];
}
}
}
System.out.println("对角线和为:"+sum);
}
}
3.求二维数组(3行3列)的顶部元素的和
4.求二维数组(3行3列)的左部元素的和
5.求二维数组(3行3列)的外部元素的和
public class Main{
public static void main(String[] args){
// 2.求二维数组(3行3列)的对角线元素的和
//10,12,13
//14,15,16
//17,18,19
// 3.求二维数组(3行3列)的顶部元素的和
// 4.求二维数组(3行3列)的左部元素的和
// 5.求二维数组(3行3列)的外部元素的和
int sum=0;
int[][] a = new int[][]{{10,12,13},{14,15,16},{17,18,19}};
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
if(i==j){
sum+=a[i][j];
}
}
}
System.out.println("对角线和为:"+sum);
System.out.println("上边和:"+sumup(a));
System.out.println("左边和:"+sumdown(a));
System.out.println("边上一圈和:"+sumout(a));
}
// 上边和
static int sumup(int[][] a){
int sumup1=0;
for(int i=0;i<a[0].length;i++){
sumup1+=a[0][i];
}
return sumup1;
}
//左边和
static int sumdown(int[][] a){
int sumdown1=0;
for(int i =0;i<a.length;i++){
sumdown1+=a[i][0];
}
return sumdown1;
}
//边上一圈和
static int sumout(int[][] a){
int sumout1=0;
for(int i=0;i<a.length;i++){
for(int j=0;j<a[0].length;j++){
if(i==0|j==0|i==a.length-1|j==a[0].length-1){
sumout1+=a[i][j];
}
}
}
return sumout1;
}
}
6.求二维数组(5行5列)中最大元素值及其行列号。
7.将二维数组(5行5列)的右上半部分置零。
public class Main{
public static void main(String[] args){
// 6.求二维数组(5行5列)中最大元素值及其行列号。
// 7.将二维数组(5行5列)的右上半部分置零。
int[][] a = new int[][]{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};
int temp = a[0][0];
int line=0,row=0;
for(int i=0;i<a.length;i++){
for(int j=0;j<a[0].length;j++){
if (temp<a[i][j]){
temp = a[i][j];
line = i+1;
row = j+1;
}
}
}
System.out.println("最大的元素是第"+line+"行第"+row+"列元素:"+temp);
//上半部分置零
for(int i=0;i<a.length;i++){
for(int j=i+1;j<a[0].length;j++){
a[i][j]=0;
}
}
for(int i=0;i<a.length;i++){
for(int j=0;j<a[0].length;j++) {
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}
总结:
Exception in thread "main" java.lang.NullPointerException
上面这个错误是未进行初始化。