Java数组

数组

数组是在内存中存储相同数据类型的连续的空间;
数组是相同类型的数据按顺序组成的一种引用数据类型;
声明一个数组就是在内存空间中划出一串连续的空间。

数组的规范
1、存放的数据是相同的数据类型
2、数组的长度在定义时就确定了大小,数组是不可变长度的,或者说叫定长
3、数组中可以存放任意的数据类型(包含基本数据类型、引用数据类型、数组)
4、数组本身是引用数据类型(在栈内存中会存储其在堆内存中的引用地址)
5、数组会在内存中开辟一块连续的内存空间

数组的定义
在这里插入图片描述
数组的初始化(创建)
在 Java 语言中,数组必须先被初始化,才能被使用。所谓的初始化,就是在内存中为数组元素分配空间,并为每个元素赋予初始值。

静态初始化:显式的指定每个数组元素的值,由系统来决定数组的大小;
动态初始化:只需要指定数组的长度,通过程序动态的给每个元素赋值(即由系统为每个数组元素分配初始值)。

静态初始化

语法:

type[] arrayName = {element1, element2,....}; // 比较常见
type[] arrayName = new type[]{element1, element2,...};
示例:

int[] arrs2;
arrs2 = new int[]{1, 2 ,3 ,4};

int[] arrs = {1, 2, 3, 4}; // 简写

该初始化方法,首先定义了数组的内容,同时也根据数组中内容的个数,决定了数组的长度。

动态初始化

语法:

数据类型[] 数组名= new 数据类型[数组长度];
示例:

int[] arr = new int[10];
int[] arr;
arr = new int[10];//表示我们创建了一个长度为10的整型数组

该初始化方法,首先定义了数组的长度,同时根据数据类型的默认值,来暂时确定了数组的内容。

数组在内存中存储

例子:

int[ ] arr = new int[3];

arr变量在栈中,new int[3]的数组是在堆中,分配了三个连续的内存,arr存储的是数组在堆中的首地址。

数组元素的引用

语法:

数组名[下标]

数组中的索引(下标),通过 arrayName[index] 获取指定位置的数据,index 从 0 开始,最大值为 length-1

数组的长度

语法:

数组名.length
示例:

int[] a = new int[5];
System.out.println(a.length);//输出5

循环与数组
普通循环:
可以通过循环来为数组进行赋值和取值。

通过数组索引方式对数组元素进行赋值时,使用数组**.length**属性作为 for 循环的条件。
在对数组元素进行操作时,一般使用 for 循环结构。

示例:
for (int i = 0; i < arrs3.length; i++) {
    arrs3[i] = (i+1) * 10;
}

for (int i = 0; i < arrs3.length; i++) {//注意不要犯数组越界的错误
    System.out.println(arrs3[i]);
}

增强型for循环

for (数据类型 变量名 : 数组名| 集合名) {
    element...
}
示例:

for(int a : arrs3) {
    System.out.println(a);
}

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。

思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。

第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较;

第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比较;

依次类推,每一趟比较次数-1;

……

举例说明:要排序数组:int[] arr={6,3,8,2,9,1};   

第一趟排序:

    第一次排序:63比较,6大于3,交换位置:  3  6  8  2  9  1

    第二次排序:68比较,6小于8,不交换位置:3  6  8  2  9  1

    第三次排序:82比较,8大于2,交换位置:  3  6  2  8  9  1

    第四次排序:89比较,8小于9,不交换位置:3  6  2  8  9  1

    第五次排序:91比较:9大于1,交换位置:  3  6  2  8  1  9

    第一趟总共进行了5次比较, 排序结果:      3  6  2  8  1  9

---------------------------------------------------------------------

第二趟排序:

    第一次排序:36比较,3小于6,不交换位置:3  6  2  8  1  9

    第二次排序:62比较,6大于2,交换位置:  3  2  6  8  1  9

    第三次排序:68比较,6大于8,不交换位置:3  2  6  8  1  9

    第四次排序:81比较,8大于1,交换位置:  3  2  6  1  8  9

    第二趟总共进行了4次比较, 排序结果:      3  2  6  1  8  9

---------------------------------------------------------------------

第三趟排序:

    第一次排序:32比较,3大于2,交换位置:  2  3  6  1  8  9

    第二次排序:36比较,3小于6,不交换位置:2  3  6  1  8  9

    第三次排序:61比较,6大于1,交换位置:  2  3  1  6  8  9

    第二趟总共进行了3次比较, 排序结果:         2  3  1  6  8  9

---------------------------------------------------------------------

第四趟排序:

    第一次排序:23比较,2小于3,不交换位置:2  3  1  6  8  9

    第二次排序:31比较,3大于1,交换位置:  2  1  3  6  8  9

    第二趟总共进行了2次比较, 排序结果:        2  1  3  6  8  9

---------------------------------------------------------------------

第五趟排序:

    第一次排序:21比较,2大于1,交换位置:  1  2  3  6  8  9

    第二趟总共进行了1次比较, 排序结果:  1  2  3  6  8  9

---------------------------------------------------------------------

最终结果:1  2  3  6  8  9

---------------------------------------------------------------------

由此可见:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即:

public class MaoPao {
	public static void main(String[] args){
		int[] arr = {34,53,12,32,56,17};
//		利用一个外部的大循环,去确定总共要执行多少组排序
//		6个元素要循环5次
		for(int i=1;i<arr.length;i++){
//			内部循环比较元素,每一次大循环结束后都有一个元素被确立为最大值,不参与比较
			for(int n=0;n<arr.length-1;n++){
				if(arr[n]>arr[n+1]){
//					如果排在前面的元素大于后面的元素,调换位置
					int temp;
//					设置中间变量,用于交换元素
					temp=arr[n];
					arr[n]=arr[n+1];
					arr[n+1]=temp;
				}
			}
		}
		System.out.println("冒泡排序后,元素的值为:");
		for(int t:arr){
//			获取数组arr中的元素,用t表示
			System.out.println(t);
		}
	}

}

二维数组

二维数组的声明与创建:

语法:

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

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]);
    }
}

(二维数组)示例如下:

package my_first_project.Arrays1;

public class ArrayTest1 {
	public static void main(String[] args){
//		二维数组的静态初始化
		int[][] arr ={
				{85,89,90},
				{75,65,85},
				{80,84,95},
				{99,78},
				{100,77,92,95}
		};
//		定义与初始化分开
		int[][] arr1;
		arr1 = new int[][]{{1,2},{2,2},{1}};
//		静态初始化数组的引用,同样借助索引
		System.out.println(arr.length);
//		二维数组长度,指二维数组内容包含了几个一维数组
		System.out.println(arr[4].length);
//		通过二维数组索引的形式,将得到二维数组中保存的对应的数组,并通过.length的形式得到保存的数组的长度
		System.out.println(arr[1][0]);
//		此处借助的是索引加索引的形式
		for(int i=0;i<arr.length;i++){
			System.out.println("保存的第"+(i+1)+"个数组中有元素为:");
			for(int t = 0;t<arr[i].length;t++){
				System.out.println(arr[i][t]);
			}
		}
//		二维数组的动态初始化
		int[][] arr3 = new int[3][3];
//		创建了一个三行三列的数组,其实指的是二维数组中会保存三个一维数组,每个一维数组都只能保存3个元素
		System.out.println(arr3[2][1]);
//		第三行第二列的数据
		arr3[1][2] = 9;
//		数组arr3第二行第三列的元素赋值9
		for(int i=0;i<arr3.length;i++){
			System.out.println("保存的第"+(i+1)+"个数组中有元素为:");
			for(int t=0;t<arr3[i].length;t++){
				System.out.println(arr3[i][t]);
			}
		}
	}
}

空指针错误

没有指定列数,对该数组取值会出现空指针错误;
以数组arr4为例,只定义了行数,没有定义列数:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值