数组

概念:同一种类型数据的集合,其实就是一个容器。

好处:自动从0开始编号,方便操作。

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

    示例:int[] arr = newint[5];

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

    示例:int[] arr = newint[]{3,5,1,7};

           int[]arr = {1,3,5,7,};

注意:数组建立是必须明确长度。

Java内存空间的划分一共分为5块:

寄存器:CPU负责处理。

本地方法区:与所在系统相关,运行本地系统平台上的内容。

方法区:加载类中的方法,变量等。

栈内存:运行方法。

堆内存:对象的存放,有地址引用。

特点:

(1)每一个实体都有一个首地址。

(2)堆内存中的每一个变量都有默认的初始化值,根据类型的不同而不同,整数是0,小数是0.0或0.0f,boolean是false,char是’\u0000’。

(3)垃圾回收机制(释放堆内存)。

数组-常见问题

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

    System.out.println(arrp[3]);

报错:ArrayIndexOutOfBoundsException;

当访问到数组不存在的角标时,就会产生这个异常。

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

    arr= null;

    System.out.println(arr[0]);

报错:NullPointerException

当引用变量没有任何实体指向时,还在用其操作实体,就会产生该异常。

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

    System.out.println(arr);

打印出:[I@C17164

其中:

[:这个代表的是这个实体是一个数组。

I:代表这个数组的元素的类型是int型。

@:源码中用@作为连接两部分的符号。

17164:由windows用哈希算法算出的数组地址值,把二进制的值用十六进制表示。

数组的常见操作-遍历

1,对数组最基本的操作就是存和取。

存取的核心思想:对角标的操作。

2,用 数组名.length 属性获取数组的长度。

3,对数组的遍历用循环语句,例如

int[] arr = {1,2,3,4};  

System.out.println("length:" + arr.length);  

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

{  

 System.out.println("arr[" + x + "] = " + arr[i]);  

}  

数组-最值:

class ArrayDemo

{  

                public static void main(String[] args)

                 {  

                          int[] arr = {34,19,11,109,3,56};  

                           int maxElement = getMax(arr);  

                      System.out.println("max=" + maxElement);  

                 }  

}
获取数组中的最大值
思路:1,需要进行比较,并定义变量记录住每次比较后的较大的值
            2,对数组中的元素进行遍历取出,和变量中记录的元素进行比较,如果遍历到的元素大于变量中记录的元素,就用变量记录住最大的值。
             3,遍历结束,该变量记录就是最大值
定义一个功能来实现
明确一:结果——是数组中的元素,int
明确二:未知内容——数组

//方法一:通过与数组中的第一个元素比较   

    public static int getMax(int[] arr)

 {  

                  int maxElement = arr[0];  

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

                  {

                                 if(arr[i] > maxElement)

                                { 

                                                  maxElement = arr[i];  

                                }  

                    }

                            return maxElement;  

  }  

   //方法二:通过角标比较   

    public static int getMax_2(int[] arr) 

{  

              int maxIndex = 0;  

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

            {  

                                if(arr[i] > arr[maxIndex]) 

                               {  

                                             maxIndex = i;  

                               }  

              }  

   return arr[maxIndex];  

  }  

}

选择排序;

第一轮比较{34,19,11,109,3,56}

34比19大,这两个换位置,变为{19,34,11,109,3,56};

继续用第一个数比较,19比11大,换位置,变为{11,19,34,109,3,56};

继续用第一个数比较,11比109小,位置不变,{11,19,34,109,3,56};

继续用第一个数比较,11比2大,交换位置,变为{3,11,19,34,109,56};

继续用第一个数比较,3比56小,不变;

比较到了数组的最后一个元素,所以这次循环结束,下一次循环从第二个元素11遍历,找出最小的放到第二位上,如此往复,排序完成。

  1. class ArrayDemo
  2. {  
  3.             //自定义打印数组的方法   
  4.              public static void printArray(int[] arr)
  5.               {  
  6.                                System.out.print("[");  
  7.                               for(int i=0;i<arr.length;i++)
  8.                                {  
  9.                                                      if(i != arr.length - 1)
  10.                                                       {  
  11.                                                                        System.out.print(arr[i] + ",");  
  12.                                                          } 
  13.                                                     else
  14.                                                       {  
  15.                                                                       System.out.print(arr[i] + "]");  
  16.                                                        }  
  17.                }  
  18.     }  
  19.     //主函数   
  20.     public static void main(String[] args)
  21.    {  
  22.                        int[] arr = {34,19,11,109,3,56};  
  23.                        //未排序时打印一遍数组   
  24.                         printArray(arr);  
  25.                        //调用选择排序方法   
  26.                           selectSort(arr);  
  27.                           //排序后打印数组   
  28.                         printArray(arr);  
  29.     }  
  30.     //选择排序   
  31.     public static void selectSort(int[] arr)
  32.   {  
  33.                     for(int x=0;x<arr.length-1;x++) 
  34.                     {  
  35.                                    for(int y=x+1;y<arr.length;y++)
  36.                                    {  
  37.                                                   if(arr[x] > arr[y]) 
  38.                                                   {  
  39.                                                             //交换位置   
  40.                                                            int temp = arr[x];  
  41.                                                              arr[x] = arr[y];  
  42.                                                               arr[y] = temp;  
  43.                                                   }  
  44.                                      }  
  45.                    }  
  46.     }  
  47. }  

冒泡排序:

  1. class ArraySortDemo 
  2. {  
  3.                    //主函数   
  4.                     public static void main(String[] args) 
  5.                     {  
  6.                                    int[] arr = {34,19,11,109,2,56};  
  7.                                    //未排序时打印一遍数组   
  8.                                     printArray(arr);  
  9.                                     //调用选择排序方法   
  10.                                     selectSort(arr);  
  11.                               //排序后打印数组   
  12.                                    printArray(arr);  
  13.                       }  
  14.     //自定义打印数组的方法   
  15.     public static void printArray(int[] arr)
  16.    {  
  17.                          System.out.print("[");  
  18.                          for(int i=0;i<arr.length;i++)
  19.                         {  
  20.                                        if(i != arr.length - 1
  21.                                       {  
  22.                                                     System.out.print(arr[i] + ",");  
  23.                                       } 
  24.                                       else 
  25.                                       {  
  26.                                                    System.out.print(arr[i] + "]");  
  27.                                      }  
  28.                       }  
  29.     }  
  30.     //方法一:   
  31.     public static void bubbleSort(int[] arr) 
  32.     {  
  33.                       for(int x=0;x<arr.length-1;x++)
  34.                       {  
  35.                                                   for(int y=0;y<arr.length-1-x;y++) 
  36.                                                   {  
  37.                                                                       if(arr[y] > arr[y+1])
  38.                                                                        {
  39.                                                                                     int temp = arr[y];  
  40.                                                                                      arr[y] = arr[y+1];  
  41.                                                                                      arr[y+1] = temp;  
  42.                                                                          }  
  43.                                                  }  
  44.                       }  
  45.     }  
  46.     //方法二:   
  47.     public static void bubbleSort_2(int[] arr)
  48.    {  
  49.                          for(int x=arr.length-1;x>0;x--) 
  50.                         {  
  51.                                             for(int y=0;y<x;y++) 
  52.                                             {  
  53.                                                                if(arr[y] > arr[y+1]) 
  54.                                                                {  
  55.                                                                             int temp = arr[y];  
  56.                                                                             arr[y] = arr[y+1];  
  57.                                                                             arr[y+1] = temp;  
  58.                                                                  }  
  59.                                             }  
  60.                            }  
  61.     }  
  62. }  

方法一中:

-1是为了避免角标越界。

-x是为了让外循环增加一次,内循环参数与比较的元素个数递减。

注意:用Arrays.sort(arr);语句直接可以将arr数组排序,在实际开发时使用这种方式

排序位置置换代码提取

由于要排序的数组是不确定的,数组中要交换的两个元素也是不确定的,所以这里定义了三个形参。

public static void swap(int[] arr,int a,int b)
 {  

                   int temp = arr[a];  

                   arr[a] = arr[b];  

                   arr[b] temp;  

}

排序性能问题

此方法可以在排序时减少换位操作,提高效率。

  1. for(int x=0;x<arr.length-1;x++)
  2.  {  
  3.              int num = arr[x];  
  4.               int index = x;  
  5.               for(int y=x+1;y<arr.length;y++) {  
  6.             /* 
  7.             若前一个数比后一个数大,则把后一个数的值记录到num, 
  8.            把角标记录到index,第一轮内循环结束后,执行一次交换。 
  9.             */  
  10.         if(num > arr[y])
  11.          {  
  12.                      num = arr[y];  
  13.                       index = y;  
  14.         }  
  15.     }  
  16.     if(index != x)
  17.    {  
  18.                         //调用上面的换位操作   
  19.                         swap(arr,x,index);  
  20.     }  

数组-查找

查找数组中的指定元素,返回索引。

  1. class ArrayDemo
  2.  {  
  3.                public static void main(String[] args) 
  4.                 {  
  5.                              int[] arr = {4,1,5,7,3,8,2};  
  6.                              int index = getIndex(arr,8);  
  7.                              System.out.println("index = " + index);  
  8.               }  
  9. /*
  10. 数组常见功能:查找
  11. */
  12.     public static int getIndex(int[] arr,int key)
  13.    {  
  14.                   for(int x=0;x<arr.length;x++) 
  15.                   {  
  16.                                   if(arr[x] == key)  
  17.                                  return x;  
  18.                  }  
  19.         return -1;  
  20.     }  
  21. }  
折半查找

折半查找的前提是数组有序,无序数组只能用一般方法。

13          15               19                     28                          33                  45                       78              106

0            1                   2                     3                                 4                  5                        6                     7

min                                                      mid                                                                                                 max

mid=(0+7)/2=3;

arr[mid]==key  false

if (key>arr[mid]

          min=mid+1;

if(key<arr[mid]

          max=mid_1;

         mid=(max+min)/2=(4+7)/2=5;

  1. //方法一   
  2. public static int halfSearch(int[] arr,int key) 
  3. {  
  4.               int max,min,mid;  
  5.               min = 0;  
  6.             max = arr.length - 1;  
  7.             while(min <= max) 
  8.             {  
  9.                         mid = (max + min) >> 1;  
  10.                         if(key > arr[mid])  
  11.                                        min = mid + 1;  
  12.                        else if(key < arr[mid])  
  13.                                        max = mid - 1;  
  14.                        if(max < min)  
  15.                                          return -1;  
  16.                                             mid = (max + min) / 2;  
  17.              }  
  18.     return mid;  
  19. }  
  20.   
  21. //方法二   
  22. public static int halfSearch_2(int[] arr,int key) 
  23.  {  
  24.                     int max,mid,min;  
  25.                     min = 0;  
  26.                      max = arr.length - 1;  
  27.                     while(min <= max) 
  28.                     {  
  29.                                       mid = (max + min) >> 1;  
  30.                                       if(key > arr[mid])  
  31.                                                  min = mid + 1;  
  32.                                     else if(key < arr[mid])  
  33.                                                     max = mid - 1;  
  34.                                     else   
  35.                                                  return mid  
  36.                     }  
  37.     return -1;  
  38. }  

进制转换(10-16进制) 

  1. public static void toHex(int num)
  2.  {  
  3.              //因为每个数由4*8个二进制位组成,所以这里小于8   
  4.              for(int x=0;x<8;x++) 
  5.               {  
  6.                                       //15的二进制为1111,num&15能把最后的4个二进制位得出来   
  7.                                      int temp = num & 15;  
  8.                                        if(temp > 9)  
  9.                                                  System.out.print((char)(temp - 10 + 'A'));  
  10.                                         else  
  11.                                                      System.out.print(temp);  
  12.             //整体右移4位,使下四个二进制位移到最后   
  13.           num = num >>> 4;  
  14.             }  
  15. }  
进制转换-查表法

1,什么时候使用数组?

如果数组出现了对应关系,而且对应关系的一方是有序的数字编号,并作为角标使用。这时就必须要想到数组的使用。

可以将这些数据存到数组中,根据运算的结果作为角标直接去查数组中对应的元素即可。

这种方式可以称为查表法。

public static void toHex_2(int num) 

{  

         if(num == 0

                 {  

                         //如果是0,则后面的程序没有输出结果,直接return就可以。   

                         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[8];  

                    //pos作为指针,指向最后一个元素的位置   

                     int pos = arr.length;  

                   while(num != 0

                      {  

                                           int temp = num & 15;  

                                          //把算 出的值从数组的最后一个元素位置开始倒着存   

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

                                               num = num >>> 4;  

                      }  

                     System.out.println("pos = " + pos);  

                   //从pos指针位置开始输出,避免前面出现太多空格   

                       for(int x = pos; x<arr.length;x++)

                      {  

                                   System.out.println(arr[x]);  

                     }  

}  

进制转换-整合

写一个程序,实现十进制到各种进制的转换。

  1. class ArrayTest
  2. {  
  3.             public static void main(String[] args)
  4.             {  
  5.                   toHex(26);  
  6.                    toBinary(26);  
  7.                   toOctal(26);  
  8.                  System.out.println(Integer.toBinaryString(-6));  
  9.             }  
  10.     //十进制-->十六进制   
  11.     public static void toHex(int num) 
  12.     {  
  13.                trans(num,15,4);  
  14.     }  
  15.     //十进制-->二进制   
  16.     public static void toBinary(int num) 
  17.     {  
  18.                 trans(num,1,1);  
  19.     }  
  20.     //十进制-->八进制   
  21.     public static void toOctal(int num)
  22.     {  
  23.            trans(num,7,3);  
  24.     }  
  25.     public static void trans(int num,int base,int offset)
  26.      {  
  27.         if(num == 0
  28.          {  
  29.                   System.out.println("0");  
  30.                    return;  
  31.         }  
  32.         char[] chs ={'0','1','2','3'  ,'4','5','6','7'   ,'8','9','A','B'    ,'C','D','E','F'
  33.                                   
  34.         char[] arr = new char[32];  
  35.         int pos = arr.length;  
  36.         while(num != 0)
  37.         {  
  38.                    i nt temp = num & base;  
  39.                    arr[--pos] = char[temp];  
  40.                     num = num >>> offset;  
  41.         }  
  42.         for(int x=pos;x<arr.length;x++)
  43.        {  
  44.                   System.out.println(arr[x]);  
  45.         }  
  46.          System.out.println();  
  47.     }  
  48. }  

查表法练习

使用查表法表示星期。

  1. class ArrayTest
  2. {  
  3.     public static void main(String[] args) 
  4.    {  
  5.         String week = getWeek(4);  
  6.         System.out.println(week);  
  7.     }  
  8. /*使用查表法
  9. 星期
  10. strings="abc";
  11. int x=4;
  12. */
  13.     public static String getWeek(int num)
  14.     {  
  15.         if(num > 7 || num < 1
  16.         {  
  17.             return "错误的星期";  
  18.         }  
  19.         String[] weeks = {"","星期一","星期二","星期三"  ,"星期四","星期五","星期六","星期日",};  
  20.         return weeks[num];  
  21.     }  
  22. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值