javase学习笔记------------数组

来源:互联网 发布:数控切割机套料软件 编辑:程序博客网 时间:2024/05/22 11:05

数组的定义:同一种类型数据的集合。其实数组就是一个容器。

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

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

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

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

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

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

    内存空间的划分:

    1,寄存器:

    2,本地方法区:

    3,方法区:

    4,栈内存:存储的都是局部变量。而且变量所属的作用域一旦结束,该变量就自动释放。

    5,堆内存:存储的都是数组和对象(其实数组就是对象)。凡是new建立的都在堆中。

       特点:1,每一个实体都有首地址。

            2,堆内存中的每一个变量都有默认初始化值。根据类型的不同而不同,整数是0,

              小数是0.0或者0.0f,boolean是false,char是'\u0000'。

            3,垃圾回收机制。

数组常见问题:

    1,当访问到数组中不存在的角标时,就会发生ArrayIndexOutOfBoundsException。

    2,当引用型变量没有任何实体指向时,还在用其操作实体,就会发生NullPointerException。

    3,当按格式1定义好一个数组,直接打印数组时返回的结果是包含数组类型的哈希值。

    4,需要一个容器,但是不明确容器的具体数据时,就用格式1。当需要一个容器,要存储已知的

      具体数据时,就用格式2。

数组常见操作:对数组操作最基本的动作就是存和取。核心思想:就是对角标的操作。

    获取整个数组中的全部元素,可以用for循环进行遍历。

    获取数组中的最大值。思路:

       1,需要进行比较,并定义变量记录住每次比较后的较大的值。

       2,对数组中的元素进行遍历取出,和变量中记录的元素进行比较。如果遍历到的元素大于

          变量中记录的元素,就用变量记录住该大的值。

       3,遍历结束,该变量记录就是最大值。

       定义一个功能来实现。

       明确一,结果。是数组中的元素,int。

       明确二,未知内容。是数组。

       public static int getMax(int[ ]arr){

           //定义一个变量记录较大的值。

           int maxElement = arr[0];

           for(intx=1;x<arr.length;x++){

              if(arr[x] >maxElement)

                  maxElement = arr[x];

           }

           return maxElement;

       }

       public static int getMax2(int[] arr){

           //定义一个变量记录较大的值。

           int maxIndex = 0;

           for(intx=1;x<arr.length;x++){

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

                  maxIndex = x;

           }

           return arr[maxIndex];

       }

       选择排序:

       public static void selectSort(int[] arr){

           for(int x=0;x<arr.length-1; x++){

              for(int y=x+1;y<arr.length; y++){

                  if(arr[x] >arr[y]){

                     int temp =arr[x];

                     arr[x] = arr[y];

                     arr[y] = temp;

                  }

              }

           }

       }

       遍历数组的功能:

       public static voidprintArray(int[ ] arr){

           System.out.println("[");

           for(intx=0;x<arr.length;x++){

              if(x!=arr.length-1)

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

              else

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

           }

       }

       冒泡排序:

       public static voidbubbleSort(int[ ] arr){

           for(int x=0;x<arr.length-1;x++){

              for(inty=0;y<arr.length-1-x;y++){//-1:防止角标越界,-x:为了让外

                  if(arr[y] >arr[y+1]){   //循环增加一次,内循环参数与比较的元素

                     int temp =arr[y];   //个数递减。

                     arr[y] =arr[y+1];

                     arr[y+1] = temp;

                  }

              }

           }

       }

       排序位置转换代码提取:

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

           int temp = arr[a];

           arr[a] = arr[b];

           arr[b] = temp;

       }

        数组排序的性能问题:

       public static voidselectSort2(int[ ] arr){

           for(intx=0;x<arr.length-1;x++){

              int num = arr[x];

              int index = x;

              for(int y=x+1;y<arr.length;y++){

                  if(num>arr[y]){

                     num = arr[y];

                     index = y;

                  }

              }

              if(index !=x)

                  swap(arr,x,index);

           }

       }

       数组常见功能:查找

       public static int getIndex(int[]arr,int key){

           for(intx=0;x<arr.length;x++){

              if(arr[x] == key)

                  return x;

           }

           return -1;

       }

       二分查找法:必须是从小到大,或者是从大到小顺序的数组才有效。

       public static inthalfSearch(int[ ]arr,int key){

           int min,max,mid;

           min = 0;

           max = arr.length-1;

           mid = (min + max)/2;

           while(mid != key){

              if(key>arr[mid])

                  min = mid + 1;

              else if(key<arr[mid])

                  max = mid - 1;

              if(max<min)

                  return -1;

              mid = (min + max)/2;

           }

           return mid;

       }

       public static inthalfSearch2(int[ ]arr,int key){

           int min,max,mid;

           min = 0;

           max = arr.length-1;

           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;

       }

面试题:给定一个有序的数组,如果往该数组中存储一个元素后,并保证这个数组还是有序的,那么

       这个元素的存储的角标位如何获取。

       public static int halfSearch2(int[ ]arr,int key){

           int min,max,mid;

           min = 0;

           max = arr.length-1;

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

       }

       java本身的二分查找法:Array.binarySearch(arr,key)如果存在,返回具体的角标位置,

       如果不存在,返回的是:-插入点-1。

什么时候使用数组呢?

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

    要想到数组的使用。就可以将这些数据存储到数组中。根据运算的结果作为角标直接去查数组中对

    应的元素即可。这种方式称为查表法。

    public static void toHex(int num){

       if(num == 0){

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

        intpos = arr.length;

        while(num!= 0){

           inttemp = num & 15;

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

           num= num >>> 4;

        }

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

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

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

       }

    }

    进制转换整合:

    public static void trans(intnum,int base,int offset){

       if(num == 0){

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

        intpos = arr.length;

        while(num!= 0){

           inttemp = num & base;

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

           num= num >>> offset;

        }

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

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

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

       }

    }

    public static void toHex(int num){

       trans(num,15,4);

    }

    public static void toOctal(intnum){

       trans(num,7,3);

    }

    public static void toBinary(intnum){

       trans(num,1,1);

    }

    使用查表法获取星期。

    public static String getWeek(intnum){

       if(num>7 || num<1){

           return "错误的星期";

       }

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

       return weeks[num];

    }

数组中的数组:二维数组。

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

    定义了名称为arr的二维数组。二维数组中有3个一维数组。每个一维数组中有2个元素。一维数组

    的名称分别为arr[0],arr[1],arr[2]。给第一个一维数组1脚标位赋值为78写法是:arr[0][1]=78;

格式2:int[ ][ ] arr = new int[3][];

    二维数组中有3个一维数组。每个一维数组都是默认初始化值null。可以对这三个一维数组分别进行

    初始化。

    arr[0] = new int[3];

    arr[1] = new int[1];

    arr[2] = new int[2];

0 0
原创粉丝点击