黑马程序员_数组

来源:互联网 发布:铃声编辑软件 编辑:程序博客网 时间:2024/04/25 12:38

数组

---------------------- android培训、java培训、期待与您交流! ----------------------

.定义

具有相同类型数据的集合。

注:在特殊情况下,可以不同的数据的集合,如下:

int[] iArr=new int[]{3,4,5,6,'a',7,'k'}

为什么会这样呢?

因为在ascll码中,每个字符都对应一个数值,所以也只有这种情况

 

.定义数组的形式

1.元素类型[]数组名= new元素类型[n];

2.元素类型[]数组名;

数组名=new元素类型[]{元素1,元素2......};

3.元素类型[]数组名={元素1,元素2......};

 

.栈内存

在栈内存中,一般都是存储局部变量的,这里局部变量都是定义在方法中,而且局部变量可以是基本数据类型和引用类型,所以局部变量要存入栈中的时候,要先给方法分配人口地址才能给变量分配存储空间。

 

.堆内存

堆内存都是用来存储数组和对象的,用new关键字新建出来的数组或者对象都是放在堆内存中。堆内存中的实体都有一个对应的首地址值,而且会给实体中的变量赋一个初始值,例如:int 0 ,char  '\u0000',double  0.0  ,float  0.0f等。

 

.数组在内存中的存储结构

例如:定义一个数组,int[] iArr=new int[]{3,4,5,6};

在内存的结构是:

 

.数组中的常见问题

1.数组角标越界,访问不到数组中不存在的角标。

2.空指针异常,如果引用变量没有任何实体指向是,还对其操作实体。

.数组的操作

 

class Arr

{

       public static void main(String[] args)

       {

              //int[] iArr=new int[]{3,1,55,8};

              //getElement(iArr);

              //System.out.println(getMax_Value(iArr));

              //selectSort(iArr);

       //System.out.println(halfSearch(iArr,55));

              //System.out.println(getHex(124));

              System.out.println(getWeek(6));

 

       }

       /*

需求:

打印出数组中的每一个元素

思想:

1.定义一个独立运行的类

2.定义打印数组元素的功能的方法

3.使用遍历可以实现此功能

4.在主函数中调用该功能

步骤:

1.定义类

2.定义main方法

3.定义得到元素的接收一个数组的方法

4.使用for循环得到数组中的元素

5.将得到的元素打印出来

*/

/*

在数组中,每一个元素都会有一个角标与之对应,如果要对这个元素操作,

那就直接操作这个角标,所以在下面的方法中,因为要得到数组中的元素,角标是依次递增的,

使用for循环不断从数组中去得元素。

 

*/

       public static void getElement(int[] iArr)

       {

              //遍历出数组中的元素

                     for(int i=0;i<iArr.length;i++)

              {

                            //不断的打印出数组中的元素

                            System.out.print(iArr[i]+" ");

              }

       }

       /*

       需求:

              获取最大值

       思想:

              1.定义一个获取最大值接收一个数组的方法

              2.因为要得到最大值,所以需要数组中的元素逐个进行比较,

              3.使用遍历得到数组中的每一个元素

              4。定义一个变量,用于存储每轮比较后得到的元素。

              5.返回最大值

       步骤:

        1.定义得到最大值接收数组的方法

              2.定义一个变量

              3.使用for语句遍历出数值中的元素

              4.使用判断表达式来求出最大值。

              5.返回最大值

       */

       //得到最大值的方法1

       public static int getMaxValue(int [] iArr)

       {

              //定义变量用来存储比较后的最大值

              int maxValue=iArr[0];

 

              for(int i=1;i<iArr.length;i++)

              {

                     //判断遍历数组中的元素是否大于最大值,最终得到最大值

                     if(iArr[i]>maxValue)

                     {

                            maxValue=iArr[i];

                     }

              }

              return maxValue;

       }

 

       //得到最大值的方法1

public static int getMax_Value(int [] iArr)

       {

              //定义一个索引变量

              int index=0;

 

              for(int i=1;i<iArr.length;i++)

              {

                     //判断遍历数组中的元素是否大于最大值,最终得到最大值

                     if(iArr[i]>iArr[index])

                     {

                            iArr[index]=iArr[i];

                     }

              }

              return iArr[index];

       }

       /*

排序

 

选择排序:

需求:

对数组进行排序

思想:

1.定义一个排序的方法

2.因为数组中有角标对应一个值,所以可以直接对角标操作

3.首先把角标0对应的值和后面的值逐一进行比较,不断取出最小的值房贷角标0

4.角标0就不参与比较,从第二个开始又逐个比较,直到比较完。

5.这里使用for循环完成此功能。

步骤:

a.定义完成此功能的方法

b。使用for语句的嵌套对该数组逐个比较

c.打印排序后的结果

d。在主函数中调用该方法

       */

       //方式1

 

       public static void  selectSort1(int [] iArr)

       {

             

              for(int i=0;i<iArr.length-1;i++)

              {

                     for(int y=i+1;y<iArr.length;y++)

                     {

                                   if(iArr[i]>iArr[y])

                            {

                                          int temp=iArr[i];

                                          iArr[i]=iArr[y];

                                          iArr[y]=temp;

                            }

                     }

                     System.out.println(iArr[i]+" ");

              }

       }

 

       /*

      二分查找法

       需求:

       在数组中是否存在某个值

       思想:

       1.定义查找方法

       2.定义三个变量,用于分别表示第一个,中间,最后一个角标。

       3.首先是将要比较的数值与中间角标对应的值进行比较,

       4.如果大于中间的值,则把移动第一个角标中间角标加1的位置。

       5.如果小于中间的值,则把最后一个角标移动到中间角标减1的位置。

       6.以此这样不断判断,直到第一个或者最后一个移动到中间对应值。否则这个数在数组中不存在。

       步骤:

       1.定义方法

       2.定义三个变量,并给与赋初始值。

       3.使用循环语句不断判断是否存在,如果存在,则返回对应的值

       4.如果不存在则返回-1

       */

       public static int halfSearch(int [] iArr,int key)

       {

              int min=0;

              int max=iArr.length;

              int mid=(max+min)/2;

              while(key!=iArr[mid])

              {

                     if(key>iArr[mid])

                     {

              min=mid+1;

                     }

                     else if(key<iArr[mid])

                     {

                     max=mid-1;

                     }

              if(max<min)

                     return -1;

              mid=(max+min)/2;

              }

              return mid;

       }

       /*

      进制的转换

       需求:

       分别把十进制转换成二进制、八进制、十六进制

       十进制转换成十六进制

       思想:

       1.定义两个数组,数组1是用来存储十六进制对应的字符的,数组2是用来存储转换后对应的数据

       2.判断如果这个数为0是,跳出语句。

       3.不断的判断这个数不为0时,把这个数与15相与

       4.把相与后的结果作为第一个数组角标,并把这个角标对应的值赋给第二个数组

       5.再把这个数右移4

       6.不断从数组2中得到数据

       */

       public static String getHex(int num)

       {

             

              char[] arr={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

              char[] arr1=new char[8];

              int pos=arr1.length;

              String str="";

              if(num==0)

              {

                     System.out.println("0");

                     return "";

              }

              while(num!=0)

              {

                     int temp=num&15;

                     arr1[--pos]=arr[temp];

                     num=num>>>4;

              }

              for(int i=pos;i<arr1.length;i++)

              {

                            str=str+arr1[i];

              }

              //System.out.println(str);

              return str;

       }

       /*

      查表法

       1.打印出星期

       2.定义打印星期的方法

       3.根据循环可以得到对应的值

       4.定义数组用于存储星期

       5遍历出星期

       */

       public static String getWeek(int index)

       {

              String str1=" ";

              if(0<=index&&index<=6)

              {

              String [] str={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

                    

                     for(int i=0;i<str.length;i++)

              {

                            str1=str[index];

              }

              }

              else

                     System.out.println("请输入06的整数");

              return str1;

       }

}

 

八.二维数组

就是一维数组中的数组,也就是一维数组中的元素存的也是数组。

定义格式:

元素类型[][] 数组名=new元素类型[][];

Int[][ ] arr=new int[][];

元素类型 [ ][ ] 数组名=new元素类型[ ][ ]{{},{},{}};

Int[] arr=new int[3][2]{{34,66},{34,,77},{87,23}}

九.二维数组的内存图

Int [][] arr=new [3][]{{3,4,5},{1,3},{1}}

这句话的含义是定义一个名为arr的二维数组类型,数组中的元素是int类型的,使用new关键字创建内存空间,这里是创建了三个一维数组,每个数组中不确定元素的个数。使用大括号括起来的元素指定了初始值。

图的表示

二维数组的存储过程:

1.       在堆内存中存储二维数组,首先会产生三个一维数组,用角标对应每个数组指向的值为null,因为还没有找到对应的地址,根据括号里的元素可以确定有三个一维数组,而且第一个一维数组中有三个元素,第二个有二个元素,第三个有1个元素,把这三个数组的首地址赋给对应数组变量,这时把null覆盖了。最后得到完整的二维数组后,又把这个二维数组的首地址赋给栈内存中的数组变量。

二维数组的操作

如果要找到Int [][] arr=new [3][]{{3,4,5},{1,3},{1}}中的5,那就是arr[0][2];

---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima