黑马程序员——Java基础语法(三)---数组

 

  本篇博文主要的内容是java语法的第三部分--数组,数组同一种类型数据的集合。其实,数组就是一个容器。数组可以自动给数组中的元素从0开始编号,方便操作这些元素。

一、数组的定义

  数组的格式一:元素类型[] 数组名 = new 元素类型[元素个数或数组长度];如:int[] arr=new int[5];

  数组定义的格式二:元素类型[]数组名=new元素类型[]{元素,元素,……};如:int[] arr=new int[]{1,2,3,4,5};这种方式还可以简写为int[] arr ={1,2,3,4,5};

  Java程序在运行时,需要在内存中分配空间。程序运行时数组在内存中分配空间的过程如下图所示:

  int[] arr=new int[4];

   

  程序运行的时候在堆内存中开辟存储四个整数的空间,将内存地址赋值给栈内存中的变量arr。

  为了提高运算效率,java对空间进行了不同区域的划分,对每一片区域都有特定的处理数据方式和内存管理方式。

  内存的划分:1、寄存器;2、方法区;3、本地方法区;4、栈内存;5、堆内存。

  这里重点介绍数组中用到的栈内存和堆内存,其他的内存在后面会详细的讲解。

  1、栈内存:用于存储局部变量,当变量所属的作用域一旦结束,所占空间会自动释放。

  2、堆内存:数组和对象,通过new建立的实例都存放在堆内存中。每一个实体都有内存地址值。实体中的变量都有默认初始化值,根据类型的不同而不同。整数类型是0,小数类型是0.0或0.0f,boolean类型是false,char类型是'u0000'。如果将数组的引用实体设置为null,也就是实体不再被使用,那么会在不确定的时间内被垃圾回收器回收。

二、数组的常见异常

  数组的常见异常分为两类:

  1、数组脚标越界异常(ArrayIndexOutOfBoundsException):访问到了数组中的不存在的脚标时发生。

  2、空指针异常(NullPointerException):当引用型变量没有指向任何实体时,用其操作实体,就会发生该异常。

  具体异常的例子见如下代码: 

 1 class  TestDemo
 2 {
 3     public static void main(String[] args) 
 4     {
 5         int[] arr=new int[5];
 6         System.out.println(arr[5]);//访问数组中不存在的脚标
 7 
 8         arr=null;
 9         System.out.println(arr[0]);//引用变量没有指向任何实体时访问具体元素。       
10     }
11 }

  在打印数组的时候,如果直接打印数组的引用变量,打印出来的结果是数组初始地址的哈希值。如:”[I@123fff“,[I表示int型的数组,123fff表示数组初始地址的哈希值。

三、数组的操作

  对数组的基本操作就是存和取。数组的存和取都是通过脚标来实现的。

  接下来就用遍历并打印数组的所有元素。

  

1 static void printArray()
2     {
3         int[] arr={12,33,44,55,66,77};
4         for(int i=0;i<arr.length;i++)
5         {
6             System.out.println("arr["+i+"] = "+arr[i]);
7         }
8     }

  打印的结果如下:

  

  数组的排序在另一篇博文中有详细的介绍,这里就不再赘述,本篇博文主要介绍数据的一个基本概念和操作。

四、二分查找法  

  这里介绍一下数组查找的经典方法--二分查找法。二分查找也称折半查找,是快速查找定位数据的一种算法,通常用来确定在给定一个有序的数组中插入数据的位置。如果往该数组中存储一个元素,并保证这个数组还是有序的,那么二分查找法返回的数值就是这个元素插入的脚标。

  在实际开发中,二分查找也不需要我们自己去写,JDK中已经提供了相关的API供调用。是Arrays.binarySearch(int[] arr,int num)。这里我们通过自己的代码实现一遍二分查找主要是熟悉一下这种算法的思路,学习这种算法解决问题的模式。

  那么具体的代码如下:

 1 static int binarySearch(int[] arr, int num)
 2     {
 3         int min=0,max=arr.length,mid=0;
 4         while(min<=max)
 5         {
 6             mid=(min+max)/2;//找到数组的中间位置
 7             if(arr[mid]>num)//如果目标值比中间值小,则数据在小的这边,将最大值的脚标变成中间值偏小一位。
 8                 max=mid-1;
 9             else if(arr[mid]<num)//如果目标值比中间值大,则数据在大的这一侧,将最小的脚标变成中间值加一。
10                 min=mid+1;
11             else
12                 return mid;//如果相等则说明找到了。
13         }
14         return min;//如果循环结束了程序还没有返回说明没有找到,则此时最小的脚标就是插入点的脚标。
15     }

  主函数中的代码为:

1 public static void main(String[] args) 
2     {
3         int[] arr =new int[]{12,13,14,55,57,76};;
4         System.out.println(binarySearch(arr,15));
5     }

  输出结果为:

 

 返回的是插入点的脚标是3,确实是15插入数组保证数组依然有序的位置。

五、二维数组

  二维数组可以理解为数组的数组。

  与普通数组一样,二维数组也有三种定义格式:

  格式一:

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

    二维数组中有三个一维数组,每个数组中有两个元素。

  格式二:

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

    二维数组中有3个一维数组,每个一维数组都是默认初始化值null,可以对这个三个一维数组分别进行初始化。

  格式三:

    int[][] arr={{1,2,3},{4,5},{6,7,8,9}};

    定义一个名称为arr的二维数组,二维数组中的有三个一维数组,每一个一维数组中具体元素也都已初始化。

  为了熟悉二维数组,我们也像一维数组一样,遍历打印一下所有的元素。

  具体代码如下:

 1 static void printArr()
 2     {
 3         int[][] arr={{1,2,3,4},{5,6,7},{8,9},{10}};
 4         for(int i=0;i<arr.length;i++)
 5         {
 6             for(int j=0;j<arr[i].length;j++)//双层循环遍历二维数组
 7             {
 8                 System.out.print("arr["+i+"]["+j+"] = "+arr[i][j]+"	");
 9             }
10             System.out.println();//每一维数组输出完成之后回车换行。
11         }
12     }

  输出结果为:

  

  至此数组的所有总结内容都已经整理完毕了。

  继续努力加油!为了明天更好的自己。

  

原文地址:https://www.cnblogs.com/dengzhenyu/p/4826192.html