Java数组知识总结+题目练习

 

Java数组


1、数组的概述


数组是相同类型数据的有序集合。

数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。

其中每一个数据称作一个数组元素,每个数组元素都可以通过一个下标来访问他们。

使用数组可以让我们的程序变的简单,避免定义多个重复的变量。

2、数组的声明创建


首先必须声明数组变量,才能在程序中使用该数组,下面是声明数组变量的语法:


Java语言使用new关键字来创建数组,语法如下:

dataType[] array = new dataType[size];
int[] nums = new int[10]; // 定义了一个长度为 10 的整型数组

// 给数组中的元素赋值
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
nums[3] = 4;
nums[4] = 5;
nums[5] = 6;
nums[6] = 7;
nums[7] = 8;
nums[8] = 9;
nums[9] = 10;

// 通过数组的下标来取值
System.out.println(nums[1]) // 输出:2


数组的元素是通过索引来访问的,数组索引是从0开始的。

获取数组的长度:array.length

数组动态初始化:

int data[] = new int[3]; /*开辟了一个长度为3的数组*/
data[0] = 10; // 第一个元素
data[1] = 20; // 第二个元素
data[2] = 30; // 第三个元素
for(int x = 0; x < data.length; x++) {
    System.out.println(data[x]); //通过循环控制索引
}

 

我们上面定义的数组都有一个特点:先给数组开辟内存空间,然后再用索引进行数据的赋值,这种做法就叫做:动态初始化。

如果数组在定义的时候就可以同时出现设置的数据内容,那么就可以采用静态初始化来完成。

格式: 数据类型 数组名称 = new 数据类型[] {值, 值,…}

如:

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = {1, 3, 4, 55, 11, 32, 121, 33}; // 静态初始化int型数组
		for(int i = 0; i < data.length; i++) {
			System.out.println(data[i]);
		}
	}
}

一维数组的静态初始化

越界异常


3、数组的使用


数组属于引用数据类型,所以会发生引用传递。而引用传递的本质是:同一块堆内存空间可以被不同的栈内存所指向。

public class ArrayDemo02 {
	public static void main(String args[]) {
		int data[] = null;
		data = new int[3]; //开辟一个长度为3的数组
		int temp[] = null; //声明int型数组对象:temp
		data[0] = 10;
		data[1] = 20;
		data[2] = 30;
		temp = data;  //int temp[] = data;
		temp[0] = 99;
		for(int i = 0; i < temp.length; i++) {
			System.out.println(data[i]);
		}
	}
}

å¨è¿éæå¥å¾çæè¿°


4、二维数组

输出

elements:1,2,3,4,5,6

hold:1,2,3,4,5,6,4,3,2,1


在之前所使用的数组发现只需要一个索引就可以进行访问,那么这样的数组实际上非常像一个数据行的概念 。

现在痛过一个索引就可以取得唯一的一个记录。所以这样的数组可以简单理解为一维数组,而二维数组本质上指的是行列集合,也如果要确定某一个数据需要行索引和列索引来进行定位 。

那么对二维数组的定义有两种声明形式:

数组的动态初始化:数据类型 对象数组[][] = new 数据类型 [行个数] [列个数];
数组的静态初始化:数据类型 对象数组[][] = new 数据类型 [行个数] [列个数]{{值, 值,…}, {值, 值,…},…};

 

int[][] arr2 = new int[][]{{10,20,30},{40,50,60},{70,80,90}};

二维数组

在之前的课程中,我们也提到数组中可以放置基本数据类型和引用数据类型,尤其是数组中也可以放置数组。

二维数组的声明与创建

语法:

三种形式:
数据类型[][] 数组名
数据类型 数组名[][]
数据类型[] 数组名[]

示例:

int[][] arr;
int arr[][];
int[] arr[];

二维数组的初始化与引用

在学习二维数组的时候,我们需要知道二维数组存放的是什么样的数据;
如图:

想要保存该类数据,就需要使用二维数组了。
所以,我们可以将二维数组看做一个几行几列的表格这样一个形式。
如果我们想要表示上述表格中的数据,就可以采用如下的方式
语法:

数据类型[][] 数组名;//先声明一个数组
数组名 = new 数据类型[长度][长度];//对数组进行初始化
或
数据类型[][] 数组名 = new 数据类型[长度][长度];//对数组声明的同时进行初始化

示例:

int[][] arr = new int[3][3];

//想要输出第三行第二列的数据:
System.out.println("arr[2][1]");
//为第二行第三列的数据赋值为9:
arr[1][2] = 9;

// 创建float类型的数组,只指定行数
// 注意:只指定行数的写法是可行的,但只指定列数和全不指定的写法是错误的
float arr1 = new float[3][];
// 因为没有指定列数,对该数组取值会出现空指针错误
//System.out.println(arr1[0][0]);
// 针对于该二维数组进行创建行
arr1[0] = new  float[3];//第一行有三列,这样的写法可以指定每行有着不同的列
arr1[1] = new  float[2];//第二行有二列
arr1[2] = new  float[1];//第三行有一列
System.out.println(arr1[0][0]);//0.0
System.out.println(arr1[0][3]);//数组下标越界

以上使用的属于动态的初始化创建,接下来我们来看看静态的初始化创建。
语法:

数据类型[][] 数组名 = {{x,,x,x},{x,x},{x,x,x,x},...,{x}};

示例:

int[][] arr = {{1,2,3},{1,2,3},{1,2,3}};//三行三列的数组
或
int[][] arr = {{1},{1,2},{1,2,3}};//三行不同列的数组

引用:

System.out.println(arr[0][1]);//arr数组第一行第二列的元素
System.out.println(arr.length);//arr数组的长度
System.out.println(arr[0].length);//arr数组第一行的长度
//循环输出二维数组的内容
for(int i = 0; i < arr.length; i++) {
    for(int t = 0; t < arr[i].length; t++) {
        System.out.println(arr[i][t]);
    }
}

练习

一、选择

  1. 下列数组声明的语法格式不正确的是()    C
    A. int[] array;
    B. int array[];
    C. char[];
    D. String[] strArray;
    
  2. 已知一个长度为10的数组b,数组b的第三个元素表示为?         C
    A. b[3]  B. b(3)  C. b[2]  D. b(2)
    
  3. 当数组下标越界时,会发生()        ACD
    A. 系统崩溃
    B. 直接跳过
    C. 抛出异常
    D. 中止程序
       当程序发生异常时,程序会被系统的异常指令流停止运行  所以这道题应该是个多选题
  4. 下面代码的运行结果为:( A
    A. 55,8,5,  B. 5,8,55,  C. 8,5,55  D. 5,8,55
    
  5. 下面代码的运行结果为:(   D )
    A. 4  B. 12  C. 0  D. 13
    
  6. 下面程序的运行结果是? A   
    A. 30  B. 60  C. 50  D. 20
    
  7. 以下关于二维数组创建对象的语法,错误的是?(多选)   AD
    A. char[][] ch=new char[][] ;
    B. char ch[][]=new char[3][5];
    C. char[] ch[]=new char[3][];
    D. char[][] ch=new char[][5];
    
  8. 下列哪个选项是给二维数组的第一行第一列的元素赋值的。   D
    A. sum[][] = 3;
    B. num[1][] = 3;
    C. num[1][1] = 3;
    D. sum[0][0] = 3;
    
  9.  以下代码的输出结果为   ?    A  
    A. 2 4  B. 3 4  C. 3 3  D. 4 4   System.out.print();//方法不换行显示
    
  10.  下列数组有几行几列(  D )
    A. 三行五列
    B. 五行五列
    C. 三行三列
    D. 五行三列
    

二、编程

  1. 求数组中能被3整除的元素并打印输出。
    数组内容:
    public class Opp4 {
        public static void main(String[] args) {
    		//定义一个整型数组,并初始化
    		int arr[] ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    
    		//循环遍历数组,找出能被3整除的元素并打印输出
            for(int i = 0; i < arr.length ; i++)
                if (arr[i] % 3 == 0){
    		    System.out.println(nums[i]);
            }
    	}
    }
    
  2. 在一个二维数组中存放了三名学生的语文和数学的成绩,分别求语文和数学的总成绩及平均分并输出。
    public class Opp5 {
    	    public static void main(String[] args) {
    	    	       //定义一个三行两列的整型二维数组intArray
    	    	int intArray[][] = new int[3][2];
    
    	    	       //自定义并保存三个学生的语文与数学成绩
    	    	intArray[0][0] =(99);
    	    	intArray[0][1] =(99);
    	    	intArray[1][0] =(88);
    	    	intArray[1][1] =(88);
    	    	intArray[2][0] =(77);
    	    	intArray[2][1] =(77);
    
    	    	       //求语文的总成绩和平均分
    	    	int Chinese = 0;
    	    	double ChineseStr = 0;
    	    	
    	    	for(int i = 0;i < intArray.length; i++){
    	    		Chinese += intArray[i][0];//第i++行的第一列的成绩循环相加
    	    	}
    	    	ChineseStr = Chinese / intArray.length;
    			System.out.println("语文总分:" + Chinese); //语文总分:264
    			System.out.println("语文平均分:" + ChineseStr);  //语文平均分:88.0
    
    	    	       //求数学的总成绩和平均分
    	    	int Mathematics = 0;
    	    	double MathematicsStr = 0;
    	    	
    	    	for(int i = 0;i < intArray.length; i++){
    	    		Mathematics += intArray[i][1];//第i++行的第二列的成绩循环相加
    	    	}
    	    	MathematicsStr = Mathematics / intArray.length;
    			System.out.println("数学总分:" + Mathematics); //数学总分:264
    			System.out.println("数学平均分:" + MathematicsStr);  //数学平均分:88.0
    
    		}
    	}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值