黑马程序员java学习笔记——数组

来源:互联网 发布:阿里云ecs vpn 编辑:程序博客网 时间:2024/05/01 11:55
------- android培训java培训、期待与您交流! ----------

今天的内容主要是数组的特点和对数组的常见操作   

    一维数组 

    概念:数组就是存储同一种数据类型的集合,是一个容器,它可以对容器内的数据从0开始,进行编号,用于封装这些数据,是一个实体。

    格式

        元素类型[] 数组名 = new 元素类型[元素个数或者数组的长度];

        元素类型[] 数组名 = {元素1,元素2......};

        数组其实还有其他的形式,但上面两种最常用,对于其他格式,这里不在赘述。

    引入两个内存的知识点:栈内存和堆内存。

        栈内存:存储局部变量,数据使用完毕后,会自动释放。

        堆内存:内存每一个实体,数组和对象都在对内存中。

        堆内存的特点:1,内存地址值;

                      2,默认初始化值,int:0,float型:0.0f,double型:0.0,

                         boolean型:false;

                      3,垃圾回收机制:不定时自动回收。

    二维数组

    概念:

        其实就是将数组作为元素存到数组当中,构成的数组称为二维数组。

    格式

        格式一:int[][] arr= new int[5][6];

        代表这个数组中有5个一维数组,每一个一位数组中有6个元素,我们要表示某一个元素在数组中的位置可以写成:arr[0][1],这代表的是0角标上的一维数组1角标上的元素。

        格式二:int[][] arr= new int[5][];

        格式三:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};

        格式三是直接把一维数组中的元素都初始化了。

    数组中的常见操作

    遍历:获取数组中的元素通常都会用到遍历。

    数组中有一个属性,可以直接获取到数组中的元素个数:length,使用方式:数组名称.length

    但凡有数组通常都会用到for循环。

    

class ArrayDemo{public static void main(String[] args){int[] arr ={2,3,4,5,6,6,7,8,9,88};printArray(arr);//打印出来的结果是[2,3,4,5,6,6,7,8,9,88]。}//定义功能用于打印数组中的元素。元素间用逗号隔开。public static void printArray(int[] arr){System.out.print("[");for(int x = 0;x<arr.length;x++){if (x!=arr.length-1){System.out.print(arr[x]+", ");}elseSystem.out.println(arr[x]+"]");//这是最后一个元素。}System.out.println();//换行。}}

    运行的结果:

      

   获取数组中的最大值和最小值

   获取最值需要进行比较。每一比较都会有一个较大或者较小的值,因为该值不确定,可以通过一个变量进行临时存储让数组中的每一个元素都和这个值进行比较,当我们要获取最大值时,如果在数组中遍历到的值大于变量中的值,就用改变量记录较大的值;当所有的元素都比较完成,变量中存储的就是数组中的最大值,获取最小值同理。

   其实我们将这个变量定义成数组的一个角标,或者这个角标上所对应的值都可以,我选择其中一种方法,直接将变量定义成数组0角标上的值。

/*需求:获取数组中的最大最小值*/class ArrayDemo2{public static void main(String[] args){int[] arr ={2,1,3,6,4,7,9,6};int max = getMax(arr);int min = getMin(arr);System.out.println("min="+min);System.out.println("max="+max);}public static int getMax(int[] arr){int max = arr[0];//定义一个变量,并将数组中0角标的值赋给这个变量。for(int x = 1;x<arr.length;x++)     {if(max<arr[x])max=arr[x];//比较后,将较大的值赋给max变量。}return max;}public static int getMin(int[] arr){int min = arr[0];//定义一个变量,并将数组中0角标的值赋给这个变量。for(int x = 1;x<arr.length;x++){if(min>arr[x])min =arr[x];//比较后,将较小的值赋给min变量。}return arr[min];}}

    运行后的结果:

    
   
数组中的选择排序和冒泡排序

    选择排序:选择一个位置和其他位置比较,在选择下一个位置和剩下的位置比较,内循环结束一次最值出现在头角标位置上。

    我们用下边的一个例子来说明,这是我们要进行选择排序的数组:【49 38 65 97 76 13 27 49】

    第一次排序后 13 【38 65 97 76 49 27 49】

    第二次排序后 13 27 【65 97 76 49 38 49】

    第三次排序后 13 27 38 【97 76 49 65 49】

    第四排序后 13 27 38 49 【49 97 65 76】

    第五排序后 13 27 38 49 49 【97 97 76】

    第六排序后 13 27 38 49 49 76 【76 97】

    第七排序后 13 27 38 49 49 76 76【 97】

    这样就比较直观了,很明显是嵌套循环尖朝下的结构,所以我们可以改变内循环的初始化值,让初始化值随着外循环变化。

    冒泡排序:数组中相邻的两个元素进行比较,如果符合条件,换位,第一圈比较完后,最值出现在最后一位,第二圈比完后,最值出现在倒数第二位......,循环比较,除了每次比较完的最后一个,因为那一个已经是之前进行比较的一组的最值了,下次不需要在纳入比较的范围之内。

    学的时候就在想为什么要叫冒泡排序,原来是因为随着循环的对这些数进行位置置换,最值会慢慢的浮出来,所以才叫冒泡的吧。

    下面是冒泡排序和选择排序的代码:

/*需求:对数组进行选择排序和冒泡排序。上边已经详细的说过这两个排序,所以在代码里就不写思路和步骤了。*/class ArraySort{public static void main(String[] args){int[] arr = {12,345,21,3,13,34,2,1};printArray(arr);//偷个懒,遍历数组前边已经写了方法,这里直接用吧,在这打印排序前的数组。//int[] arr1 = selectSort(arr);//选择排序验证了,没有问题。int[] arr1 = bubbleSort(arr);printArray(arr1);}        //选择排序public static int[] 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]){swap(arr,x,y);}}}return arr;}//冒泡排序public static int[] bubbleSort(int[] arr){for(int x=0;x<arr.length-1;x++){for(int y=0;y<arr.length-x-1;y++)//-x:每次比较完,都会一个确定的值不用再参加下一次比较;-1:是为了防止角标越界。{if(arr[y]>arr[y+1]){swap(arr,y,y+1);}}}return arr;}public static void swap(int[] arr,int x,int y)//这个是位置置换功能。{int temp = arr[x];arr[x] = arr[y];arr[y] = temp;}}


    运行的结果:

    
    数组的查找操作

    折半查找:首先一定要保证要进行查找的数组是有序的,先定义两个变量,一个赋值为0角标,作为最小值,一个赋值为最后一个角标,作为最大值 再定义一个变量,存储最小值与最大值的一半,也就是数组的中间位置,然后将已知的值与中间位置元素的值进行比较,如果比中间元素的值大,则将最小值赋值为中间值加1,继续取最小值与最大值的中间值元素与已知元素进行比较,如果比中间元素的值小,则将最大值赋值为中间值减1,继续取最小值与最大值的中间值元素与已知元素进行比较,如果比较到最后最小值已经大于最大值了,说明这个元素在数组中不存在,这时我们返回-1。

    代码如下:我把两个方法都写进去,其实都是差不多的。

/*折半查找*/class ArrayBinarySearch{public static void main(String[] args){int[] arr = {3,11,23,34,45,56,76,87};//注意,这个数组一定要是有序的。int num = binarySearch(arr,23);System.out.println("num="+num);}public static int binarySearch(int[] arr,int key){//方法一/*int min,max,mid;max = arr.length-1;min = 0;mid = (max+min)/2;while(arr[mid]!=key){if(key>arr[mid])min = mid+1;else if(key<arr[mid])max = mid-1;if(min>max)return -1;//这种情况说明这个数没找到。mid = (max+min)/2;}return mid;*///方法二int min,max,mid;min = 0;max = arr.length-1;while(min<=max){mid = (max+min)/2;if(key>arr[mid])min = mid+1;else if(key<arr[mid])max = mid-1;elsereturn mid;}return -1;//如果我们要把一个数插入到数组中,把这里改成return min;就可以了。}}


    运行后的结果:

     

    进制转换

    直接上查表法吧:将所有的元素临时存储起来,建立对应关系,将每次做完&运算的值(&的值根据你要转换的进制而定,&15是转16进制,&7是转8进制,&1是转二进制)作为索引去查表,就可以查到对应的元素,然后再将这个值右移(位数由你要转的进制而定,16进制4位,8进制3位,2进制1位)。下面是代码:

/*查表法十进制----十六进制*/class ToHexDemo{public static void main(String[] args){toHexCha(45,15,4);}public static void toHexCha(int num,int yushu,int weiyi){char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//方法一 直接查表打印/*for(int x=0;x<8;x++){int temp = num & yuShu;System.out.print(chs[temp]);num = num>>>weiyi;}*///方法二 StringBuilder容器/*StringBuilder sb = new StringBuilder();for(int x=0;x<8;x++){int temp = num & yushu;num = num>>>weiyi;sb.append(chs[temp]);}System.out.println(sb.reverse());*///方法三 存到数组中char[] arr = new char[8];int pos = arr.length-1;//arr.length;while(num!=0){int temp = num & yushu;num = num>>>weiyi;arr[pos--] = chs[temp];//arr[--pos];}for(int x=pos+1;x<arr.length;x++)//x=pos;{System.out.print(arr[x]);}}}


    运行结果是:

    
    以上就是今天的所有内容!

   
















0 0