第3章 数组

目录

一、数组的概述

 1.数组的理解

 2.数组相关的概念

 3.数组的特点

 4.数组的分类

二、一维数组的使用

 ①一维数组的声明和初始化

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

③如何获取数组的长度 

④如何遍历数组       

⑤数组元素的默认初始化值

⑥数组的内存解析

 三、二维数组的使用

1.理解

2.二维数组的使用

①二维数组的声明和初始化

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

③如何获取数组的长度

④如何遍历二维数组

 ⑤数组元素的默认初始化值

⑥数组的内存解析

​四、 数组中常见的异常

 1.数组角标越界的异常

  2.空指针异常

五、算法

六、java.util.Arrays


一、数组的概述

1.数组的理解

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

2.数组相关的概念

 >数组名
 >元素
 >角标、下标、索引
 >数组的长度

3.数组的特点

1)数组是有序排列的
 2)数组属于引用数据类型的变量。数组的元素既可以是基本数据类型,也可以是引用数据类型
 3)创建数组对象会在内存中开辟一整块连续的空间
 4)数组的长度一旦确定,就不能修改

4.数组的分类

①按照维数:一维数组、二维数组……
②按照数组元素的类型:基本数据类型元素的数组、引用数据类型的数组

二、一维数组的使用 

①一维数组的声明和初始化

静态初始化:数组的初始化和数组元素的赋值操作同时进行 int[] arr = new int[] {1,2,3};

动态初始化:数组的初始化和数组元素的赋值操作分开进行 String[] names = new String[5];                      //也是正确的写法
        int[] arr4 = {1,2,3,4,5};//类型推断

总结:数组一旦初始化完成,其长度就确定了。

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

通过角标(下标、索引)的方式调用;        例:        names[0] = "聂风"; 

数组的角标(下标、索引)从0 开始,到数组的长度-1结束。

③如何获取数组的长度 

 属性:length         例:      System.out.println(names.length);                                      

④如何遍历数组       

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

⑤数组元素的默认初始化值

   >数组元素是整型:0
   >数组元素是浮点型:0.0
   >数组元素是char型:0或'\u0000',而非'0'
   >数组元素是boolean型:false
   >数组元素是引用数据类型:null

⑥数组的内存解析

 三、二维数组的使用

1.理解

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

2.二维数组的使用

①二维数组的声明和初始化

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

        //也是正确的:
        int[] arr4[] = new int[][] {{1,2,3},{4,5,9,10},{6,7,8}};
        int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};

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

        例:   System.out.println(arr1[0][1]);

③如何获取数组的长度

        System.out.println(arr4.length);                System.out.println(arr4[0].length);

④如何遍历二维数组

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

  规定:二维数组分为外层数组的元素,内层数组的元素
       int[][] arr = new int[4][3];       外层元素:arr[0],arr[1]等      内层元素:arr[0][0],arr[1][2]等

 ⑤数组元素的默认初始化值

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

⑥数组的内存解析

四、 数组中常见的异常

1.数组角标越界的异常

        ArrayIndexOutOfBoundsExcetion

2.空指针异常

        NullPointerException 

五、算法

数据结构:

1.数据与数据之间的逻辑关系:集合、一对一、一对多、多对多

2.数据的存储结构:

        ①线性表:顺序表(比如:数组)、链表、栈、队列

        ②树形结构:二叉树

        ③图形结构:

算法:排序算法 \  搜索算法

数组中涉及的常见算法:

        1.数组元素的赋值(杨辉三角、回形树等)

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

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

        4.数组元素的排序算法  

/*
 * 算法的考察:求数值型数组中元素的最大值、最小值、平均数、总和等
 * 
 * 定义一个int型的一维数组,包含10个元素,分别赋予一些随机整数,然后求出所有元素的最大值,最小值,和值,平均值。
 * 要求:所有随机数都是两位数。
 * 
 * [10,99] 公式:(int)(Math.random() * (99 - 10 + 1) + 10)
 */
public class ArrayTest1 {
	public static void main(String[] args) {
		int[] arr = new int[10];
		
		for(int i = 0;i < arr.length;i++) {
			arr[i] = (int)(Math.random() * (99 - 10 + 1) + 10);
		}
		
		//遍历
		for(int i = 0;i < arr.length;i++) {
			System.out.print(arr[i] + "\t");
		}
		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 = 1;i < arr.length;i++) {
				sum += arr[i];
		}
		System.out.println("总和为:" + sum);
		
		//求数组元素的平均数
		int avgValue = sum / arr.length;
		System.out.println("平均数为:" + avgValue);
	}
}
/*
 * 算法的考察:数组的复制、反转、查找(线性查找、二分法查找)
 */
public class ArrayTest2 {
	public static void main(String[] args) {
		
		String[] arr = new String[] {"DD","WW","RR","GG","YY","HH"};
		
		//数组的复制(区别于数组变量的赋值:arr1 = arr)
		String[] arr1 = new String[arr.length];
		for(int i = 0;i < arr1.length;i++) {
			arr1[i] = arr[i];
		}
		
		
		//数组的反转
		//方法一
		/*for(int i = 0;i < arr.length / 2;i++) {
			String temp = arr[i];
			arr[i] = arr[arr.length - i - 1];
			arr[arr.length - i - 1] = temp;
		}*/
		
		/*//方法二:
		for(int i = 0,j = arr.length - 1;i < j;i++,j--) {
			String temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}*/
		
		//遍历
		for(int i = 0;i < arr.length;i++) {
			System.out.print(arr[i] + "\t");
		}
		
		System.out.println();
		//查找(或搜索)
		//线性查找
		String dest = "RR";
		boolean isFlag = true;
		for(int i = 0;i < arr.length;i++) {
			if(dest.equals(arr[i])) {
				System.out.println("找到了指定的元素,位置为:" + i);
				isFlag = false;
				break;
			}
		}
		if(isFlag) {
			System.out.println("很遗憾,没有找到!");
		}
		
		//二分法查找
		//前提:所要查找的数组必须有序
		int[] arr2 = new int[] {-98,-34,2,34,54,66,79,105,210,333};
		
		int dest1 =  -34;
		int head = 0;//初始的首索引
		int end = arr.length - 1;//初始的末索引
		boolean isFlag1 = true;
		while(head <= end) {
			int middle = (head + end) / 2;
			if(dest1 == arr2[middle]) {
				System.out.println("找到了指定位置,位置为:" + middle);
				isFlag1 = false;
				break;
			}else if(arr2[middle] > dest1) {
				end = middle - 1;
			}else {//arr2[middle < dest1
				head = middle + 1;
			}
		}
		if(isFlag1) {
			System.out.println("很遗憾,没有找到!");
		}
	}
}

十大内部排序算法

选择排序:直接选择排序、堆排序

交换排序:冒泡排序快速排序

插入排序:直接插入排序、折半插入排序、Shell排序

归并排序

桶式排序

基数排序 

/*
 * 数组的冒泡排序的实现
 * 
 */
public class BubbleSortTest {
	public static void main(String[] args) {
		int[] arr =  new int[] {43,32,76,-98,0,64,33,-21,32,99};
		
		//冒泡排序
		for(int i = 0;i < arr.length - 1;i++) {//例:8个元素就是7轮
			for(int j = 0;j < arr.length - 1 - i;j++) {
				
				if(arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		for(int i = 0;i < arr.length;i++) {
			System.out.print(arr[i] + "\t");
		}
	}
}

六、java.util.Arrays

/*
 * 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,4};
		int[] arr2 = new int[] {1,3,2,4};
		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[] {-98,-34,2,34,54,66,79,105,210,333};
		int index = Arrays.binarySearch(arr3, 211);
		if(index >= 0) {
			System.out.println(index);
		}else {
			System.out.println("未找到");
		}
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值