A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

©   /  2015-5-12 22:18  /  6174 人查看  /  50 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

笔记内容:数组
        笔记来源:毕向东Java基础视频第4天
        正文:
一:数组的定义:同一种类型数据的集合。其实数组就是一个容器。

         格式1:元素类型[] 数组名 = new 元素类型[元素长度或数组个数];
             实例:int[] arr = new int[5];
         格式2:元素类型[] 数组名 = new 元素类型[]{元素,元素,元素……};
             示例:int[] arr = new int[]{2,4,7,5};
                   int[] arr = {6,3,8,9};
二:内存结构:栈内存,堆内存,方法区,本地方法区,寄存器。
          栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。
          堆内存:1.数组和对象,通过new建立的实例都存放在堆内存中。
                       2.每一个实体都有内存地址值。
                       3.实体中的变量都有默认初始化值 (int:0 , double:0.0 , floot:0.0f  boolean:false)
                       4.实体不在被使用,会在不确定的时间内被垃圾回收器回收。  

           垃圾回收机制:数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个                                  不确定的时间被垃圾回收器释放掉。
三:静态初始化,常见问题.
           int[ ] arr =   和 int  arr[ ]      两种书写方式都正确。
           int[ ] arr = new int[ ]{3,7,4,8}  此时 [ ]中尽量不要写长度
           数组脚标越界异常(ArrayIndexOutOfBoundsException):
            int [ ] arr = new int [ 3 ];
            System.out.println(arr[3]);      可以编译成功,但是运行失败。  因为运行的时候,才会在堆内存中开辟空间
           操作数组时,访问到了数组中不存在的角标。
           空指针异常(NullPointerException):
           int[ ]  arr = null;
           System.out.println(arr[1]);
           arr引用没有指向实体,却在操作实体中的元素时。
四:遍历
         
  1. class ArrayDemo3
  2. {        public static void main(String[] args)
  3.         {
  4.                 //数组的操作
  5.                 //获取数组的元素,通常会用到遍历
  6.                 int arr[] = {9,4,56,19,7,5};
  7.                 printArray(arr);
  8.         }
  9.         // 定义一个功能:用于打印数组的元素。元素间用逗号隔开   1。没有结果 因为打印了 用void  2.有未知元素参与
  10.                 //数组中有一个元素可以直接获取数组的个数或者长度。 .length
  11.                 //int num = 0;
  12.                 //使用方式;数组名称.length =
  13.         public static void printArray(int[] arr)
  14.         {
  15.                 System.out.print("[");
  16.                 for(int x=0;x<arr.length;x++)
  17.                 {       
  18.                         //if(x<arr.length-1)
  19.                         if(x!=arr.length-1)
  20.                        
  21.                         System.out.print(arr[x]+",");
  22.                         else
  23.                        
  24.                         System.out.println(arr[x]+"]");

  25.                 }       
  26.                        
  27.         }
  28. }
复制代码
              需要注意的地方:
  1.                 System.out.println(arr);
  2.                 显示:[I@de6ced
  3.                 [ = 数组
  4.                 I = int
  5.                 de6ced = 数组内存存放地址  由哈希算法算出来的哈希值,十六进制数
复制代码
五:获取最值:
  1. /*
  2. 给定一个数组  {3,5,1,7,9,6} 打印出数组中的最大值

  3. */

  4. class ArrayTest
  5. {
  6.         public static void main(String[] args)
  7.         {
  8.                 int[] arr = new int[]{3,5,1,7,9,6};
  9.                 double[] arrd = new double[]{5.4,6.9,8.8,2.6,5.1};
  10.                 int max = getMax(arr);
  11.                 double maxd = getMax(arrd);
  12.                 System.out.println("Max = "+max);
  13.                 System.out.println("Max = "+maxd);
  14.         }


  15.         /*
  16.         给定一个数组  {3,5,1,7,9,6} 打印出数组中的最大值

  17.         步骤:
  18.         1,定义一个函数,遍历数组,先定义一个变量,赋值,可以为数组中的任何一个数值
  19.         2,其他数组值和改值进行比较,然后如果比该值大,那么就赋值给这个变量。
  20.         3,在主函数中调用这个函数,打印输出。

  21.         定义函数:
  22.         1.判断函数是否有返回值:有,返回int类型。
  23.         2.是否有未知参数:有,函数需要接受数组。定义参数类型为 int[]
  24.         */

  25.         //第一种方法。
  26.         //第二种方法:临时变量可以初值化为0吗?  答案是可以的,因为数组中的每一个元素都对应一个标号。
  27.         //所以 用临时变量储存标号即可。
  28.        
  29.         public static int getMax(int[] arr)
  30.         {
  31. //                int max = arr[0];
  32.                 int max = 0;
  33.                 for(int x=1;x<arr.length;x++)
  34.                 {
  35. //                        if(max<arr[x])
  36. //                        {
  37. //                                max = arr[x];
  38. //                        }
  39.                         if(arr[max]<arr[x])
  40.                         {
  41.                        
  42.                                 max = x;
  43.                         }
  44.                 }
  45.                 return arr[max];
  46.         }


  47.         //利用第二种方法,求出double类型的数组的最大值。
  48.         //此时我们可以定义一个 同名但是 有不同参数类型的 getMax进行重载操作
  49.         // 我们假设给定的数组为{5.4,6.9,8.8,2.6,5.1}
  50.         public static double getMax(double[] arr)
  51.         {
  52.                 int max = 0;
  53.                 for(int x=1;x<arr.length;x++)
  54.                 {
  55.                         if(arr[max]<arr[x])
  56.                         {
  57.                                 arr[max] = arr[x];
  58.                         }
  59.                 }
  60.                 return arr[max];
  61.         }

  62.        
  63. }
复制代码
六:选择排序和冒泡排序:
  1. import java.util.*;
  2. /*
  3. 选择排序  {8,5,1,9,4,7}
  4. 给定数组,按照从小大的顺序排列。

  5. */
  6. class  ArrayTest2
  7. {


  8.         public static void main(String[] args)
  9.         {
  10.                 int[] arr = new int[]{8,5,1,9,4,7};
  11.                 //排序前
  12.                 printArray(arr);
  13.                 //选择排序
  14. //                selectSort(arr);
  15.                 //冒泡排序
  16.                 bubbleSort(arr);
  17.                 //排序后
  18.                 printArray(arr);
  19.                
  20.                 //java中已经定义好的一种排序方式,开发中,对数组排序,要使用该局代码
  21.                 Arrays.sort(arr);
  22.                
  23.                

  24.         }

  25.         //冒泡排序
  26.         public static void bubbleSort(int[] arr)
  27.         {
  28.                 for (int x=0;x<arr.length-1;x++ )
  29.                 {
  30.                         for (int y=0;y<arr.length-x-1 ;y++ )
  31.                         {
  32.                                 if (arr[y]>arr[y+1])
  33.                                 {
  34.                                         /*
  35.                                         int temp = arr[y+1];
  36.                                         arr[y+1] = arr[y];
  37.                                         arr[y] = temp;
  38.                                         */
  39.                                         swap(arr,y,y+1);
  40.                                 }
  41.                         }
  42.                 }
  43.        


  44.         }
  45.        
  46.         //选择排序
  47.         //内循环结束一次,最值出现在头角标位置上。
  48.         public static void selectSort(int[] arr)
  49.         {
  50.                
  51.                 for (int x = 0;x<arr.length-1 ;x++ )
  52.                 {
  53.                         for (int y=x;y<arr.length-1 ;y++ )
  54.                         {
  55.                                 if (arr[x]>arr[y+1])
  56.                                 {
  57. //                                        int temp = arr[x];
  58. //                                        arr[x] = arr[y+1];
  59. //                                        arr[y+1] = temp;
  60.                                         swap(arr,x,y+1);  //自己在操作中误写成   swap(int[] arr,int x,int y+1); 需要注意
  61.                                 }
  62.                         }
  63.                 }
  64.         }

  65.         //不论什么排序都需要 对满足条件的元素进行位置的置换,所以可以将这部分代码单独的提取出来。单独封装成一个函数。
  66.         //该函数中应该有3个未知函数,因为在获取角标的前提是,先要确定数组。所以,需要定义三个参数, int[] arr,int a ,int b
  67.         //置换功能
  68.         public static void swap(int[] arr,int a,int b)
  69.         {
  70.                 int temp = arr[a];
  71.                 arr[a] = arr[b];
  72.                 arr[b] = temp;
  73.         }

  74.         //打印数组
  75.         public static void printArray(int[] arr)
  76.         {       
  77.                 System.out.print("数组为 "+"[ ");
  78.                 for (int x=0;x<arr.length ;x++ )
  79.                 {
  80.                         if (x!=arr.length-1)
  81.                                 System.out.print(arr[x]+"  ");
  82.                         else
  83.                                 System.out.println(arr[x]+" ]");
  84.                 }
  85.                
  86.         }
  87. }
复制代码
七:折半查找
  1. /*
  2. 折半查找
  3. 数组 {3,8,9,16,20,35}
  4. 折半查找 数组必须是有序的
  5. */


  6. class  ArrayTest4
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 //查找 20在元素中的位置
  11.                 int[] arr = new int[]{3,8,9,16,20,35};
  12. //                int index = getIndex(arr,35);
  13. //                int index = halfSearch(arr,35);
  14.                 int index = halfSearch_2(arr,35);
  15.                 System.out.println("index = "+index);
  16.         }


  17.         /*
  18.         步骤:
  19.         1,定义3个变量,记录每次比较实际的最大值,最小值和中间值的角标。max min mid
  20.         2,遍历数组,
  21.         3,使用mid的值,于需要查找的值比较,判断大小。
  22.         4,比较完大小之后,重新定义所查找的范围。使用循环语句,继续比较,知道查到改值。
  23.         5,如果改值不存在,那么返回 -1。

  24.         定义一个函数,方便该功能的复用性。
  25.         1,因为是返回数组中数值的角标,所以返回值类型为int
  26.         2,因为是查找某一数值,同时数组不确定,所以又两个参数, int[] arr,int x
  27.         */
  28.         //折半查找
  29.         public static int halfSearch(int[] arr,int key)
  30.         {
  31.                 int max = arr.length-1;
  32.                 int min = 0;
  33.                 int mid = (max+min)/2;
  34.                
  35.                 while(key!=arr[mid])  //写代码过程中,误将arr[mid]写成 mid   !!!!!
  36.                 {
  37.                         if(key<arr[mid])
  38.                                 max = mid-1;
  39.                         else if(key>arr[mid])
  40.                                 min = mid+1;       
  41.                         if(min>max)
  42.                                 return -1;
  43.                         mid = (max+min)/2;

  44.                 }
  45.                 return mid;
  46.         }

  47.         //折半查找的第二种方法。
  48.         public static int halfSearch_2(int[] arr,int key)
  49.         {
  50.                 int min,max,mid;
  51.                 min = 0;
  52.                 max = arr.length-1;
  53.                 while (min<max)            //第一次书写,min<max 正确写法是  min<=max  需要注意。
  54.                 {
  55.                         mid = (min+max)>>>1;
  56.                         if (key>arr[mid])
  57.                                 min = mid + 1;
  58.                         else if(key<arr[mid])
  59.                                 max = mid - 1;
  60.                         else
  61.                                 return mid;
  62.                 }
  63.                 return -1;
  64.         }
  65.        

  66.         //数组查找,给定一个数组,判断在数组中的位置
  67.         public static int getIndex(int[] arr,int key)
  68.         {
  69.                 for (int x=0;x<arr.length ;x++ )   //书写代码过程中,误将arr.length写成arr.length-1    !!!!!
  70.                 {
  71.                         if (key==arr[x])
  72.                         {
  73.                                 return x;
  74.                         }
  75.                 }
  76.                 return -1;
  77.        
  78.        
  79.         }
  80. }
复制代码



由于字数限制,分为两个来发帖了
回复 使用道具 举报
八:查表法二进制终结版本:
  1. class ArrayTest7
  2. {
  3. public static void main(String[] args)
  4. {
  5. toBin(0);
  6. toOct(60);
  7. toHex(-60);
  8. }

  9. //十进制转二进制
  10. public static void toBin(int num)
  11. {
  12. trans(num,1,1);
  13. }

  14. //十进制转八进制
  15. public static void toOct(int num)
  16. {
  17. trans(num,7,3);
  18. }
  19. //十进制转十六进制
  20. public static void toHex(int num)
  21. {
  22. trans(num,15,4);
  23. }
  24. //代码功能的提取。
  25. public static void trans(int num,int base,int offset)
  26. {

  27. //如果给的数值为0 的话,那么 整个函数就停止运转
  28. //所以要对0进行判断
  29. if (num == 0)
  30. {
  31. System.out.println(0);
  32. return;
  33. }
  34. char[] chs = {'0','1','2','3','4'
  35. ,'5','6','7','8','9'
  36. ,'A','B','C','D','E','F'};

  37. char[] arr = new char[32];

  38. int pos = arr.length;
  39. while (num!=0)
  40. {
  41. int temp = num & base;
  42. arr[--pos] = chs[temp];
  43. num = num >>> offset;
  44. }

  45. for (int x = pos;x <arr.length ; x++)
  46. {
  47. System.out.print(arr[x]);
  48. }
  49. System.out.println();
  50. }
  51. }
复制代码
九:二维数组:数组中的数组。

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

  •   定义了名称为arr的二维数组
  • 二维数组中有3个一维数组
  • 每一个一维数组中有4个元素
  • 一维数组的名称分别为arr[0], arr[1], arr[2]
  • 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 56;
                  格式2:int[][] arr = new int[3][];

                     二维数组中有3个一维数组
                     每个一维数组都是默认初始化值null
                     可以对这个三个一维数组分别进行初始化
                     arr[0] = new int[3];
                     arr[1] = new int[4];
                     arr[2] = new int[5];
                  格式3:int[][] arr = {{3,8,2,6},{2,7,8,3},{9,0,1,6}};  
         联系:一个公司有3个小组,求该公司一年中,所有小组,4个季度的业绩综合。
  1. class ArrayTest8
  2. {
  3. public static void main(String[] args)
  4. {
  5. int[][] arr ={{3,2,5,7},{9,1,6,3},{6,6,4,3}};
  6. int sum = getSum(arr);
  7. System.out.println("该公司3个小组,4个季度的业绩综合为 = " +sum);
  8. }

  9. //定义一个功能。计算该公司 3个小组,4个季度的业绩综合。
  10. public static int getSum(int[][] arr)
  11. {
  12. int sum = 0;
  13. for (int x=0;x<arr.length ;x++ )
  14. {
  15. for (int y=0;y<arr[x].length ;y++ )
  16. {
  17. sum += arr[x][y]; //书写过程中 ,写成arr[y],错误提醒,数组类型不能和int类型相加,顿悟。改为arr[x][y]
  18. }
  19. }
  20. return sum; //书写过程中 忘记写返回语句
  21. }
  22. }
复制代码


             注意    int[ ][ ] arr = new int[2][3];
                      System.out.println(arr);       ------->输出结果为   [[@de6ced   
                      System.out.println(arr[0]);    ------>输出结果为   [[@de7eca     要注意都是内存地址值
                       int[][]  arr = new int[3][];
                       System.out.println(arr);       ------->输出结果为   [[@de6ced
                       System.out.println(arr[0]);    ------->输出结果为    null
                      数组为引用数据类型,没有初始化,默认初始化值为 null     

评分

参与人数 1技术分 +3 黑马币 +4 收起 理由
温暖的小白 + 3 + 4

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马