数组

第1章 数组

3.1数组的概述

1.数组的理解

  • 数组(Array),是多个相同类型数据一定顺序排列的集合,并使用同一个名字命名,并通过编号的方式对这些数据进行统一管理.

2.数组常见的概念

  • 数组名

  • 下表(或索引)

  • 元素

  • 数组的长度

3.数组的特点

  • 数组本身是引用数据类型,而数组中的元素可以使任何数据类型,包括基本数据类型和引用数据类型
  • 创建数组对象会在内存中开辟一块连续的空间,而数组名引用的是这块连续空间的首地址
  • 数组的长度一旦确定,就不能修改
  • 我们可以直接通过下表(或索引)的方式吊应指定位置的元素,速度很快

4数组的分类

  • 按照维度:一维数组,二维数组,三维数组...
  • 按照元素的数据类型分:基本数据类型元素的数组,引用数据类型元素的数组(即对象数组)

3.2一维数组的使用

1.一维数组的声明和初始化

int num;//整数类型声明
num = 10;//初始化
int id = 1001;//声明+初始化

int[] ids;//声明
//1.1静态初始化:数组的初始化和数组元素的初始化同时进行
ids = new int[]{1001,1002,1003,1004}
//1.2动态初始化:数组的初始化和数组元素的初始化分开进行
String[] names = new String[5];

//错误的写法:
//int[] arr1= new int[];
//int[5] arr1= new int[5];
//int[] arr1= new int[3]{1,2,3};

//也是正确的写法(不建议使用)
String names[] = new String[5];
int[] arr4 = {1,2,3,4,5};//类型推断,省略new int[]
//总结:数组一旦初始化完成,其长度就确定了.

2.如何调用数组的指定位置的元素

//通过角标的方式调用
//数组的角标(或索引)从0开始,倒数租的长度-1结束
names[0] = "王";
names[1] = "王";
names[2] = "张";
names[3] = "孙";
names[4] = "王";//charAt(0)
//names[5] = "周";

3. 如何获取数组的长度

//属性:length
System.out.println(names.length)//5
System.out.println(ids.length)

4. 如何遍历数组的长度

/*
System.out.println(names[0]);
System.out.println(names[1]);
System.out.println(names[2]);
System.out.println(names[3]);
System.out.println(names[4]);
*/
//循环遍历数组
for(int i = 0; i < names.length;i++){
    System.out.println(names[i]);
}

5. 数组元素的默认初始化值

  • 数组元素是整型:0
  • 数组元素是浮点型:0.0
  • 数组元素是字符型:\u0000
  • 数组元素是布尔型:false
  • 数组元素是对象(引用数据类型):null
int[] arr = new int[4];
for(itn i = 0;i < arr.length;i++){
    System.out.println(arr[i]);//0
}
System.out.println("*********");

short[] arr1 = new short[4];
for(itn i = 0;i < arr1.length;i++){
    System.out.println(arr1[i]);//0
}
System.out.println("*********");

float[] arr2 = new float[4];
for(itn i = 0;i < arr2.length;i++){
    System.out.println(ar2r[i]);//0
}
System.out.println("*********");

char[] arr3 = new char[4];
for(itn i = 0;i < arr3.length;i++){
    System.out.println(arr3[i]);//0
}
System.out.println("*********");

6. 数组的内存解析

image-20220429122915925

image-20220429123007092

3.3多维数组的使用

1.理解

对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在.骑士,从数组底层的运行机制来看,其实没有多维数组.

2.二维数组的使用

1.二维数组的声明和初始化

int[] arr = new int[]{1,2,3};//一维数组的静态初始化
//静态初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
//动态初始化1
Stringp[][] arr2 = new String[3][2];
//动态初始化2
Stringp[][] arr3 = new String[3][];

//错误的情况
//String[][] arr4 = new String[][4];
//String[4][3] arr5 = new String[][];
//int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};

//也是正确的写法(不建议使用)
String[] arr4[] = new String[3][2];
String arr5[][] = new String[3][2];
int[][] arr6 = {{1,2,3},{4,5},{6,7,8}};//;类型推断

2.如何调用数组的指定位置的元素

System.out.println(arr1[0][1]);//2
System.out.println(arr2[1][1]);//null

arr3[1] = new String[4];
System.out.println(arr3[0][1]);//null

3.如何获取数组的长度

System.out.println(arr6.length);//3
System.out.println(arr6[0].length);//3
System.out.println(arr6[1].length);//2

4.如何遍历数组

for(int i = 0;i < arr6.length;i++){
    for(int j = ; j <arr6[i].length;j++){
        System.out.println(arr6[i][j] + " ");
    }
}

5.数组元素的默认初始化值

规定:二维数组分为外层数组的元素,内层数组的元素

//针对初始化方式一:比如:int[][] arr = new int[4][3];
//		外层元素的初始化值为:地址值
//		内层元素的初始化值为:与一维数组初始化情况相同
//针对初始化方式二:比如:int[][] arr = new int[4][];
//		外层元素的初始化值为:null
//		内层元素的初始化值为:不能调用,否则报错

itn[][] arr = new int[4][3];
System.out.println(arr[0]);//[I@15db9742,表示一维整型地址
System.out.println(arr[0][0]);//0
//System.out.println(arr);//[[I@6d06d69c,表示二维整型地址
System.out.println("*********");

float[][] arr1 = new float[4][3];
System.out.println(arr1[0]);//[F@6d06d69c,表示一维float型地址,将上一句注释掉,发现分配的内存地址一样
System.out.println(arr1[0][0]);//0.0
System.out.println("*********");

String[][] arr2 = new String[4][2];
System.out.println(arr2[1]);//[Ljava.lang.String;@7852e922,表示一维String型地址
System.out.println(arr2[1][1]);//null,空地址
System.out.println("*********");

double[][] arr3 = new double[4][];
System.out.println(arr3[1]);//null,空地址
System.out.println(arr3[1][0]);//报错,NullPointerException,空指针异常

6.二维数组的内存解析

image-20220429150110836

image-20220429150150368

image-20220429150304747

image-20220429150325188

3.4数组中涉及的常见算法

1.数组元素的复制(杨辉三角,回形数等)

package com.atguigu.exer;
//杨辉三角
public class YangHuiTest {

	public static void main(String[] args) {
		//1 声明二维数组,对外围数组初始化
		int[][] yanghui = new int[10][];
		//2 给二维数组赋值
		for(int i = 0;i < yanghui.length;i++) {
            //2.1 给二维数组的内围数组初始化
			yanghui[i] = new int[i + 1];
            //2.2 给首尾元素赋值
			yanghui[i][0] = yanghui[i][i] = 1;     
			for(int j = 1; j < yanghui[i].length - 1; j++) {
                //2.3 给非首尾元素赋值
				yanghui[i][j] = yanghui[i - 1][j - 1] + yanghui[i - 1][j];						
            }			
		}
		//3 遍历输出数组
		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();
		}
	}
}
package com.atguigu.exer;
/*
 *拓展
 *创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值.
 *同时,要求元素的值各不相同.
 */
public class ArrayExr {
	public static void main(String[] args) {
        //1 声明并初始化数组
		int[] arr = new int[6];
        //2 给数组元素赋值
		for(int i = 0;i < arr.length;i++){
            //2.1 随机生成[1,30)的数并赋值
			arr[i] = (int) (Math.random() * 29 + 1);
            //2.2循环比较生成的数是否已存在
			for(int j = 0;j < i;j++){
                //若存在
				if(arr[i] == arr[j]){
					i--;//数组下标(索引)回退,减一
					break;//跳出循环
				}				
			}		
		}
        //3 遍历数组
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i] + "\t");
		}
	}
}

package com.atguigu.exer;

import java.util.Scanner;
/*
 * 此题了解!!!
 * 
 * 回形数格式方阵的实现
 * 从键盘输入一个整数(1~20) 
 * 则以该数字为矩阵的大小,把 1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如: 输入数字2,则程序输出: 1 2 
 * 4 3 
 * 输入数字 3,则程序输出:1 2 3 
 * 8 9 4 
 * 7 6 5 
 * 输入数字 4, 则程序输出: 
 * 1   2   3   4
 * 12  13  14  5 
 * 11  16  15  6 
 * 10  9   8   7
 */
public class Huixing {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("输入一个数字:");
		int len = scanner.nextInt();
		int[][] arr = new int[len][len];
		int s = len * len;
		/*
		 * k = 1:向右 k = 2:向下 k = 3:向左 k = 4:向上
		 */
		int k = 1;
		int i = 0, j = 0;
		for (int m = 1; m <= s; m++) {
			if (k == 1) {
				if (j < len && arr[i][j] == 0) {
					arr[i][j++] = m;
				} else {
					k = 2;
					i++;
					j--;
					m--;
				}
			} else if (k == 2) {
				if (i < len && arr[i][j] == 0) {
					arr[i++][j] = m;
				} else {
					k = 3;
					i--;
					j--;
					m--;
				}
			} else if (k == 3) {
				if (j >= 0 && arr[i][j] == 0) {
					arr[i][j--] = m;
				} else {
					k = 4;
					i--;
					j++;
					m--;
				}
			} else if (k == 4) {
				if (i >= 0 && arr[i][j] == 0) {
					arr[i--][j] = m;
				} else {
					k = 1;
					i++;
					j++;
					m--;
				}
			}
		}
		// 遍历
		for (int m = 0; m < arr.length; m++) {
			for (int n = 0; n < arr[m].length; n++) {
				System.out.print(arr[m][n] + "\t");
			}
			System.out.println();
		}
	}
}

2.求数值型数组中元素的最大值,最小值,平均数,总和等

package com.atguigu.exer;

import java.util.Arrays;

public class ArraysTest1 {
	
	public static void main(String[] args) {
		
		int[] arr = new int[10];
		for(int i = 0;i < arr.length;i++){
			arr[i] = (int) (Math.random()*90 + 10);			
		}
		System.out.println(Arrays.toString(arr));
		System.out.println("*******************");
		
		//求数组元素最大值
		int maxValue  = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if(maxValue < arr[i]){
				maxValue = arr[i];
			}			
		}
		System.out.println("元素最大值:" + maxValue);
		
		//求数组元素最小值
		int minValue  = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if(minValue > arr[i]){
				minValue = arr[i];
			}			
		}
		System.out.println("元素最小值:" + minValue);
		
		//求数组元素的总和
		int sum = 0;
		for (int i = 0; i < arr.length; i++) {
			sum += arr[i];
		}
		System.out.println("元素总和:" + sum);
		
		//求数组元素的平均值
		int average = sum / arr.length;
		System.out.println("元素平均值:" + average);
	}

}

3.数组的复制,反转,查找(线性查找,二分法查找)

package com.atguigu.exer;

import java.util.Arrays;
/*
*数组的复制
*/
public class ArraysTest2 {
	public static void main(String[] args) {
		int[] arr1 = new int[]{2,3,5,7,11,13,17,19};
		int[] arr2;
		//打印arr1的元素
		System.out.println(Arrays.toString(arr1));
		//复制
		arr2 = arr1;//不是真正的复制
		
//      //复制		
//		arr2 = new int[arr1.length];//是真正的复制
//		for(int i =0;i < arr2.length;i++){
//			arr2[i] = arr1[i];
//		}
        
		//修改arr2的值
		for(int i = 0;i < arr2.length;i++){
			if(arr2[i] % 2 == 0){
				arr2[i] = i;
			}
		}
		//打印arr1的元素
		System.out.println(Arrays.toString(arr1));
		
	}
}

package com.atguigu.exer;

import java.util.Arrays;

import javax.xml.transform.Templates;
/*
 * 数组的反转
 */
public class ArraysTest3 {
	public static void main(String[] args) {
		String[] arr = new String[]{"AA","BB","CC","DD","EE"};
		System.out.println(Arrays.toString(arr));
		
		//反转
		//方法一
//		for(int i = 0; i < arr.length / 2;i++){
//			String temp = arr[i];
//			arr[i] = arr[arr.length - 1 - i];
//			arr[arr.length - 1 - i] = temp;
//		}
		//方法二
		for(int i = 0,j = arr.length - 1;i < j;i++,j--){
			String temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}
		
		System.out.println(Arrays.toString(arr));
		
	}
}

package com.atguigu.exer;

import java.util.Arrays;

import javax.print.attribute.standard.Destination;
/**
 * 数组的线性查找
 * @author Administrator
 *
 */
public class ArraysTest {
	public static void main(String[] args) {
		int[] arr = new int[100];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) (Math.random()*90 + 10);
		}
		System.out.println(Arrays.toString(arr));
		
		int dest = 20;
		boolean flag = false;
		for (int i = 0; i < arr.length; i++) {
			if(arr[i] == dest){
				System.out.println("找到指定元素,索引为" + i);
				flag = true;
			}
		}
		
		if(!flag){
			System.out.println("很遗憾,没有找到指定元素");
		}
	}
}

package com.atguigu.exer;

import java.awt.HeadlessException;

import javax.print.attribute.standard.Destination;
/**
 * 数组的二分查找法
 * @author Administrator
 *
 */
public class BinarSearchMethod {
	public static void main(String[] args) {
		int[] arr = new int[]{-42,-12,-4,0,12,45,56,77};
		
		int dest = 13;
		int head = 0;
		int end = arr.length - 1;
		while(head <= end){
			int mid = (head + end) / 2;
			if(arr[mid] == dest){
				System.out.println("找到指定元素,位置为:" + mid);
				break;
			}else if(arr[mid] > dest){
				end = mid - 1;
			}else{
				head = mid + 1;
			}
		}
		if(head > end){
			System.out.println("很遗憾,没有找到指定元素");
		}
	}
}

4.数组元素的排序算法

3.5Arrays工具类的使用

序号 方法名 描述
1 boolean equals(int[] a,int[] b) 判断两个数组是否相等
2 String to String(int[] a) 输出数组信息
3 void fill(int[] a,int[] val) 将指定值填充到数组之中
4 void sort(int[] a) 对数组进行排序
5 int binary Search(int[] a,int key) 对排序后的数组进行二分法检索指定的值
package com.atguigu.exer;

import java.util.Arrays;

public class ArrayTest {
	public static void main(String[] args) {
		//1.boolean equals(int[] a,int[] b)
		int[] arr1 = new int[]{1,2,3};
		int[] arr2 = new int[]{1,3,2};
		boolean isEquals = Arrays.equals(arr1,arr2);
		System.out.println(isEquals);
		
		//2.String toString(int[] a)
		System.out.println(Arrays.toString(arr1));
	
		//3.void fill(int[] a,int val)
		Arrays.fill(arr1, 10);
		System.out.println(Arrays.toString(arr1));
		
		//4.void sort(int[] a)
		Arrays.sort(arr2);
		System.out.println(Arrays.toString(arr2));
		
		//5.int binarySearch(int[] a, int key)
		int[] arr3 = new int[]{4,23,56,346,444,555};
		int index = Arrays.binarySearch(arr3,23);
		System.out.println(index);//1
		
	}

}

3.6数组中常见的异常

1.数组角标越界的异常:ArrayIndexOutOfBoundsException

int[] a = new int[]{1,2,3};
//越界访问例子
//a[-1];
//a[a.length];

2.空指针异常:NullPointerException

int[][] b = new int[4][];
//空指针异常例子
//b[0][0];
posted @ 2022-04-29 16:22  古玩乐  阅读(139)  评论(0)    收藏  举报