黑马程序员——Java学习笔记 数组

来源:互联网 发布:软件行业人才需求 编辑:程序博客网 时间:2024/05/07 20:32

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、数组的概述

    数组中的元素都是同一种类型。数组的长度在创建时确定,并且在创建后不变。如果需要建立存储不同类型数据的集合,或者要求这种数据存储结构的长度可以动态变化,可以使用Java.util包中的各种集合(collection)类。
    数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。

1、数组的创建与初始化

格式1:

    元素类型[] 数组名= new 元素类型[元素个数或数组长度];
    示例:int[] arr = new int[5];
    格式2:
    元素类型[] 数组名= new 元素类型[]{元素,元素,……};
    示例:int[] arr = new int[]{3,5,1,7};
    int[] arr = {3,5,1,7};
2、内存结构
    Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内 存管理方式。
    栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。
    堆内存:数组和对象,通过new建立的实例都存放在堆内存中。
    每一个实体都有内存地址值,实体中的变量都有默认初始化值,实体不在被使用,会在不确定的时间内被垃圾回收器回收,其他内存空间:方法区,本地方法区,寄存器。
3、数组操作常见问题
数组脚标越界异常(ArrayIndexOutOfBoundsException)
    int[] arr = new int[2];
    System.out.println(arr[3]);
    异常的原因:访问到了数组中的不存在的脚标时发生。
空指针异常(NullPointerException)
    int[] arr = null;
    System.out.println(arr[0]);
    异常的原因:arr引用没有指向实体,却在操作实体中的元素时
4、数组的长度
    Java中为所有数组设置了一个表示数组元素个数的特性变量length,它作为数组一部分存储起来。Java用该变量在运行时进行数组越界检查,应用程序也可以访问该变量获取数组的长度。使用方法:数组名称.length。
5、多维数组
    Java语言的多维数组可以看作是数组的数组,即n维数组是n-1维数组的数组。下面主要以二维数组为例进行说明。
创建多维数组:
格式1:
    int[][] arr = new int[3][2];
    定义了名称为arr的二维数组,二维数组中有3个一维数组,每一个一维数组中有2个元素,一维数组的名称分别为arr[0], arr[1], arr[2],给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
格式2:
    int[][] arr = new int[3][];
    在格式2创建了一个二维不规则数组,二维数组中有3个一维数组,每个一维数组都是默认初始化值null,可以对这个三个一维数组分别进行初始化。
    arr[0] = new int[3];
    arr[1] = new int[1];
    arr[2] = new int[2];
格式3:
    int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};
    定义一个名称为arr的二维数组,二维数组中的有三个一维数组,每一个一维数组中具体元素也都已初始化,第一个一维数组arr[0] = {3,8,2};第二个一维数组arr[1] = {2,7};第三个一维数组arr[2] = {9,0,1,6};第三个一维数组的长度表示方式:arr[2].length;
    注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。

二、数组的运用练习

1、数组的复制
    数组变量之间赋值是引用赋值,不能实现数组数据的复制,进行数组数据的复制要使用Java语言在java.lang.System类中提供的数组复制方法。该方法如下所示:
    public static void arraycopy(Object src
    int srcIndex,
    Object dest,
    int destIndex,
    int length)
    指定的位置开始,到目标数组的指定位置结束。从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于 length 参数。源数组中位置在 int srcIndex到 int srcIndex+length-1 之间的组件被分别复制到目标数组中的 destIndex到 destIndex+length-1 位置。
2、选择排序
原理:内循环结束一次,最值出现x角标位置上。
<span style="font-family:SimSun;font-size:14px;">    public static void selectSort(int[] arr)    {        for (int x=0; x<arr.length-1 ; x++)   //外循环共有length-1次        {            for(int y=x; y<arr.length-1; y++) //x角标位分别与其后的每个元素进行比较            {                if(arr[x]>arr[y])             //最小的数出现在x角标位置上              {                    int temp = arr[x];                    arr[x] = arr[y];                    arr[y]= temp;                }            }        }     }</span>
3、冒泡排序

    相邻两个元素比较,满足条件则换位。

<span style="font-family:SimSun;font-size:14px;">   public static void bubbleSort(int[] arr)    {        for(int x=0; x<arr.length-1; x++)        //外循环共有length-1次        {                for(int y=0; y<arr.length-x-1; y++)  //进行arr.length-x-1次比较            {                if(arr[y]<arr[y+1])              //相邻两个元素进行比较并将最小值后移                {                    int temp = arr[y];                    arr[y] = arr[y+1];                    arr[y+1] = temp;                }            }         }     }</span>
附:Arrays.sort(arr);    //java中已经定义好的一种排序方式。

4、折半查找
    折半查找:提高效率,但是必须要保证该数组是有序的数组。

折半的第一种方式:

    判断key值是否与角标中间值相等。  

<span style="font-family:SimSun;font-size:14px;">    public static int halfSearch_1(int[] arr,int key)    {        int min = 0,max= arr.length-1,mid;  //设置最大和最小角标        mid = (max+min)/2;                  //中间值角标        while(arr[mid]!=key)                //判断当角标中间值不等于key值        {            if(key>arr[mid])                //当key值大于角标中间值                min = mid + 1;              //更改最小值角标            else if(key<arr[mid])                max = mid - 1;            if(min>max)                     //当<span style="font-family:SimSun;font-size:14px;">角标最大值小于<span style="font-family:SimSun;font-size:14px;">角标</span>最小值</span>,key不存在                return -1;            mid = (max+min)/2;              //未找到key则重设角标中间值        }        return mid;                         //返回等于key的角标     }</span>

折半的第二种方式:

    在角标最大值大于等于角标最小值的情况下,判断key值是否与脚标中间值相等。

<span style="font-family:SimSun;font-size:14px;">    public static int halfSearch_2(int[] arr,int key)    {        int min = 0,max = arr.length-1,mid;        while(min<=max)                    //当<span style="font-family:SimSun;font-size:14px;">角标最大值大于等于角标最小值</span>        {            mid = (max+min)>>1;            //设置角标中间值            if(key>arr[mid])               //当key值大于中间值更改最小值角标                min = mid + 1;            else if(key<arr[mid])          //当key值小于中间值更改最大值角标                max = mid - 1;            else                return mid;                //返回等于key的角标        }        return -1;    }</span>
附:int x = Arrays.binarySearch(arr,190);  
    java提供好的一个进行折半查找的功能。开发时使用Arrays.binarySearch()
练习:有一个有序的数组,想要将一个元素插入到该数组中,还要保证该数组是有序的。如何获取该元素在数组中的位置。
答:mid的角标位或者min角标位。

5、进制转换:
查表法:
    将所有的元素临时存储起来,建立对应关系,例如十进制-->十六进制,调用public static void toHex(int num),每一次&15后的值作为索引去查建立好的表。就可以找对应的元素,这样比 -10+'a'简单的多。

<span style="font-family:SimSun;font-size:14px;">class ArrayTest7 {    public static void main(String[] args)     {        //toBin(-6);    }    /*    十进制-->二进制    */    public static void toBin(int num)    {        trans(num,1,1);    }    /*    十进制-->八进制    */    public static void toBa(int num)    {        trans(num,7,3);    }    /*    十进制-->十六进制    */    public static void toHex(int num)    {        trans(num,15,4);    }    public static void trans(int num,int base,int offset)  //定义函数    {        if(num==0)         //当数据等于零时。        {            System.out.println(0);            return ;        }        char[] chs = {'0','1','2','3'                     ,'4','5','6','7'                     ,'8','9','A','B'                     ,'C','D','E','F'};       //定义数组包含十六进制内所有数,作为进制转换表        char[] arr = new char[32];            //定义临时容器,存储转换结果。        int pos = arr.length;                 //获取数组长度        while(num!=0)                         //当最高位都是零时,停止循环。        {            int temp = num & base;            arr[--pos] = chs[temp];           //从数组最高位开始存储数据            num = num >>> offset;             //根据需要移位        }        for(int x=pos; x<arr.length; x++)     //输出数据        {            System.out.print(arr[x]);        }    }}</span>

6、对数组进行反转:
<span style="font-family:SimSun;font-size:14px;">               public static void reverseArray(int[] arr){for(int start=0,end=arr.length-1;start<end;start++,end--)//首角标自加,尾角标自减{int temp = arr[start];       //首尾元素进行交换arr[start] = arr[end];arr[end] = temp;}}</span>
0 0
原创粉丝点击