黑马程序员-java中的数组

来源:互联网 发布:淘宝便宜的书店 编辑:程序博客网 时间:2024/05/17 21:42
---------------------- android培训、java培训、期待与您交流! ----------------------


数组:
 特点:
  1,是一个容器(可以存储数据(基本类型数据,引用类型数据))。
  2,该容器是固定长度。通过length属性可以获取其长度。
  3,存储的元素都是同一数据类型。
  4,该容器中的元素都有角标,从0编号开始。

 什么时候使用数组?
  当元素较多,并同一类型。就需要先先想要对其进行存储。然后在进行操作。

 
 格式:
  int[] arr = new int[3];
  int[] arr = {3,4,1};

 
 数组在操作时,容易出现的问题?
 1,当访问到数组中不存在的角标时,运行时期会发生 ArrayIndexOutOfBoundsException
 2,当引用型变量没有任何实体指向,还在使用该变量操作实体,会在运行时发生 NullPointerException
  注意:空指针异常,不仅仅发生在操作数组时,只要是引用数据类型,都有可能发生该异常。

 数组的常见操作:
 1,最值。
  public static int getMax(int[] arr)
  {
   int max = 0;
   for(int x=1; x<arr.length; x++)
   {
    if(arr[x]>arr[max])
     max = x;
   }
   return arr[max];
  }

 2,排序。
  
  选择排序:
   特点:内循环第一次结束,最值就出现在数组的0角标位。
   方式:从先指定一个角标位(比如0角标),然后用该角标位变化的元素和其他角标位进行比较。

   for(int x=0; x<arr.length-1; x++)
   {
    for(int y=x+1; y<arr.length; y++)
    {
     if(arr[x]>arr[y])
      swap(arr,x,y);
    }
   }
   
   优化:原理就是减少堆内存中位置置换的次数。用栈内存的变量记录需要换位的最值,
     在内循环结束一次后,换位一次。

   for(int x=0; x<arr.length; x++)
   {
    int index = x;
    int num = arr[x];
    for(int y=x+1; y<arr.length; y++)
    {
     if(num>arr[y])
     {
      num = arr[y];
      index = y;
     }
      
    }
    if(index!=x)
     swap(arr,index,x);
   }

  冒泡排序:
   特点:内循环第一次结束,最值出现在数组末角标位。
   方式:从0角标位开始,相邻两个元素进行比较。
   for(int x=0; x<arr.length-1; x++)//for(int x=arr.length-1; x>0; x--)
   {
    for(int y=0; y<arr.length-1-x; y++)//for(int y=0; y<x; y++)
    {
     if(arr[y]>arr[y+1])
      swap(arr,y,y+1);
    }
   }
   

   优化:

   
   int tempIndex = arr.length-1;
   //int tempNum = arr[tempIndex];
   for(int x=0; x<arr.length-1; x++)
   {
    int index = tempIndex;
    int num = arr[tempIndex];


    for(int y=0; y<arr.length-1-x; y++)
    {
     if(arr[y]>arr[y+1])
     {
      if(arr[y]>num)
      {
       index = y;
       num = arr[y];
      }
     }
      
    }

    if(index!=tempIndex)
     swap(arr,index,tempIndex);

    tempIndex--;
   }

 

 

   public static void swap(int[] arr,int x,int y)
   {
    int temp = arr[x];
    arr[x] = arr[y];
    arr[y] = temp;
   }
 3,查找。
  遍历查找。

  二分查找,必须要有前提,数组是有序的。
  
  public static int halfSearch(int[] arr,int key)
  {
   int min=0,max=arr.lenght-1,mid;

   while(min<=max)
   {
    mid=(max+min)>>1;

    if(key>arr[mid])
     min = mid + 1;
    else if(key<arr[mid])
     max = mid - 1;
    else
     return mid;
   }
   return -1;
  }
  


 二维数组:
  int[][] arr  = new int[3][];
  sop(arr);//[[I@哈希值
  sop(arr[0]);//null.


 ----------------------

 进制转换:

 查表法。

 public static String trans(int num,int base,int offset)
 {
  if(num==0)
   return "0";

  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;
  }

  return new String(arr,pos,arr.length-pos);
 }

 


 

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