`
sky_eye
  • 浏览: 4600 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

黑马程序员_java数组

阅读更多

                                      黑马程序员_java数组

 

 

                  ---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

 

 一、数组

       同一种类型数据的集合,数组就是一个容器。

       数组可以自动给数组中的元素开始编号,方便操作这些元素。

格式1:元素类型[ ]  数组名 =  new  元素类型[元素个数或者数组长度];

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

 new会在容器中产生一个可以存储数据的实体。数组类型数据引用数据类型。

表示数组中每个元素的具体位置格式为:数组名[位置数 ]   位置数是从零开始的

 

数组建立在内存中的流程:

      int  [ ]   x =  new   int[ ];

      int  [ ]  x    先会在栈内存中建立一个x,使用数组的时候,次值存在,数组使用完成后就是释放栈内存,就是说栈内存是一个临时性的内存空间。

    小知识:所有局部变量,都定义在栈内存中

      new  就是建立一个实体,实体包括数组和对象。只要运行new  就会在堆内存中分配空间。并且在其中每个元素都建立对应的角标,是从0开始的,一定要注意是从0开始的。

      每个内存都有一个地址值,是二进制的,此时就把数组在内存中的地址值赋给x ,此时是一个赋值动作。

        当数组建立的是,就会在内存中给默认初始化值,整型类0 ,布尔型为false。

null  空    ,只有引用类数据类型可以用这个关键字。如 x = null   就是把数组的地址值变为空,如果这样在程序里,就是得原数组没有地址值指向,所以,此时为垃圾,无效数据。

     堆内存中的特点:1)地址值  2)默认初始化值 3)垃圾回收机制

 其中垃圾回收机制,就是java里,本身会定期清理垃圾数据。

 

一个数组固定长度,比如3,当程序打印角标为3的时候,就会出错,但是程序编译的时候不会出错,语法上也没有错误。但程序一旦运行,就会显示角标出错。说明在编译程序的时候,数组并没有建立,程序开始运行的是数组才会建立起来。这个要注意。

 

二、数组的操作

        一般的数组操作都会用到遍历。数组中有一个属性可以直接获取到数组元素的个数,length,使用方法为    数组名.length    。

1、常见操作以:遍历

一下为一个遍历数组的函数:

 public static void printarr(int[] arr)     这是要获取一个元素为int型的数组
 {
  for (int x=0;x<arr.length ;x++ )               arr.length  为数组元素个数,牢记,数组部分常用
  {
   if(x!=arr.length-1)
    System.out.print(arr[x]+",");
   else
    System.out.print(arr[x]);
  }
 }

2、常见操作二:获取数组元素最大值

思路:1)获取最值需要进行比较,每一次比较都会有一个比较大的值,因为该值不确定,通过一个变量进行临时存储。

2)让数组中每一元素都与这个变量中的值进行比较,如果大于变量中的值,就用该变量记录较大的值。

3)当所有元素比较完,那么该变量中的存储的就是数组中的最大值了

 public static int arr(int[] arr)                      返回值类型是int型 
 {
  int max=arr[0];
  for (int x=1;x<arr.length ;x++ )            遍历数组
  {
   if (arr[x]>max)                                    相比较,记录最大值
   {
    max=arr[x];
   }
  }
  return max;                                         返回最大值,这个一定要注意,出去void型不需要返回值,其他都需
 }                                                            要

这个只是int类型的数组,对其他类型的数组,获取最值的方法是一样的,只是数组元素数据类型不一样,所以可以建立重载函数。

3、选择排序

思路:

1、以角标为0的元素开始,与角标为1的数组进行比较,如果1的较小,则两者互换,再以角标为的0的元素与2角标的比较,如果小,则两者互换,依次类推。

2、进行比较,要遍历数组

 public static void paiXuArr(int[] arr)
 {
  for (int x=0;x<arr.length-1 ;x++ )                      从0角标开始,到倒数第二个元素即可,最后一个自己不需要
  {                                                                          比较
   for (int y =x+1;y<arr.length ;y++ )                     从x+1角标开始到最后一个角标元素,每个角标与x角标比较
   {
    if (arr[y]<arr[x])
    {
     int temp =arr[x];                                                   如果小,两者换位置(此处用第三方变量换位)
     arr[x]=arr[y];
     arr[y]=temp;
    }
   }
  }
  printarr(arr);                                                          调用打印数组的函数
 }

4、冒泡排序

思路:相邻两个元素进行比较 ,具体来说,就是角标0与角标1的相比,小的排在前、大的排在后,然后角标1的和角标2的比较,也是小的排在前,大的排在后,依次排序。到数组的最后一定是最大的在最后面。当第二次比较开始时,最后的元素不参与比较,照上比较后,第二大的元素就会排出来,以此类推。程序为

 public static void maoPaoArr(int[] arr)
 {
  for (int x=0;x<arr.length-1 ;x++ ) ............................. 遍历数组元素,只需比较arr.length-1次
  {
   for (int y =0;y<arr.length-x-1 ;y++ ) ............................此处应注意y<arr.length-x-1   每次比较后比较的
   {                                                                  次数就会减少一次,就是减少x,所以-x是让每一次元素比较减
    if (arr[y]<arr[y+1])                                       少。如果元素个数为5,当y取到arr.length-1,即5-1=4时,y+
    {                                                                 1就是5,超出最大角标数4了,所以y最大只能取到3,所以
     int temp =arr[y];                                        y<arr.length-x-1。
     arr[y]=arr[y+1];
     arr[y+1]=temp;
     
    }
   }
  }
  printarr(arr);
 }

排序最快的为,希尔排序。

在以上程序中,要注意到共性的部分,比如位置置换,相对应的可以把这个功能单独写成一个函数,以待调用。

5、数组查找  折半查找

折半查找就是从中劈开,然后比较大小。所以,数组必须是有序的数组,注意是有序的数组。这种方法可以调高效率。具体程序例子:

public static int halfSearch(int[] arr,int key)
 {
  int min,max,mid;
  min=0;
  max=arr.length-1;
  mid=(min+max)/2;
  while(arr[mid]==key)
  {
   if (key>arr[mid])
    min=mid+1;
   else
    max=mid-1;
   if(min>max)
    return -1;
   mid=(min+max)/2;
   
  }
   return mid;
 }

这个程序也可以用于把一个数插入到这个有序的数组,还保证数组有序,获取的位置就是返回最小角标min为数值。

6、二维数组

格式     int[ ][ ]  arr = new int [3 ] [2 ];  此处定义了一个名为arr的二维数组,二维数组中有有3个一维数组,每个一维数组里有两个元素。两个一维数组角标为0和1,每个一维数组里的元素角标按一维数组来排。所以,要是想赋值给第二个二维数组中最后一个元素,写成:  arr[1][1]  = 90 

要是想初始化一个一维数组,写成  arr[1]=new int[1];

注意:在二维数组中

System.out.println(arr);      此时打印的是二维数组的地址值
System.out.println(arr[0]);    此时打印的是二维数组中第一个一维数组的地址值

 

int[ ][ ]  arr = new int [3 ] [ ];      此处第二个括号里不写值  此时在System.out.println(arr[0]);    结果是:null 。

 因为每个数组是引用数据类型,所以默认初始化值为null。在这之后如果初始化一维数组,那么就在内存中开辟空间存放一维数组,并把这个一维数组的地址值付给相对应arr[0]、arr[1]、arr[2],实质指向一维数组七、进制转换的联系

class ArrayTest7
{
 public static void main(String[] args)
 {
  toBin(-6);
  System.out.println();
  toBin(6);
  System.out.println();
  toHex(-60);
  System.out.println();
  toHex(60);
  System.out.println();
 }
 public static void toBin(int num) ............//二进制转换
 {
  trans(num,1,1);
 }
 public static void toHex(int num)...............//十六进制转换
 {
  trans(num ,15,4);
 }
 public static void trans(int num,int base,int offset)..........................转换进制的基本调用函数
 {
  //建表
  char[] chs = new char[]{'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]);
  }
 }
}

 

 

                     ---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics