黑马程序员————java基础----数组

来源:互联网 发布:stc15w204s数据手册 编辑:程序博客网 时间:2024/05/17 09:19

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


数组

一、数组介绍

       数组就相当于一个容器,里面存放相同数据类型的数据。和集合的最大区别是:数组长度固定

二、数组初始化格式

        ①int[] arr=new int[3];//表示该数组存放了3个int类型的数据

           这会有默认初始化值,均为0;String类型的为null

        ③int[] arr=new int[]{3,5,6};//该数组存了3个int类型值。

        ②int[] arr={1,2,4,6};//表示数组里面有4个int类型是值,分别是1,2,4,6

           注意:要么指明数组的大小,要么指明数组的值,长度和值不能同时出现。


          数组越界问题:

                   int[] arr=new arr[3];

                   system.out.println(arr[3]);

                  当数组下标超过数组长度减1(arr.length()-1)时,编译不会出错,但是当运行时,要为数组分配空间,这

                  时数组并不存在该角标的值,会报告ArrayIndexOutOfBoundsException异常

          空指针异常:

                    int[] arr=null;

                    system.out.println(arr[1]);

               这时报告空指针NullPointException异常.

               原因在于:引用没有指向任何值,但却还在操作实体。

                 

三、数组遍历

         数组的长度:int length= arr.length();数组的角标都是从0开始,因此数组最后一个值的角标是length-1。

         

class Demo{public void printArray(){//   int[] arr=new int[]{1,2,4};int[] arr=null;   //对数组进行遍历,采用for循环   for(int x=0;x<arr.length;x++)   {  //获取数组中每一个元素  System.out.println("arr["+x+"]="+arr[x]);   }}}

四、数组常见操作

      a. 打印:system.out.println(arr);

       打印结果:[I@de6ced

       分析结果:这代表是数组类型的引用,你面存放int型数据。de6ced表示哈希值,即数组存放的内存地址。

       

       b.获取数组中元素的最值

           思路:1.获取最值,需要进行比较,由于最值不知道,因此定义一个临时变量max赋值上0角标或者是数组第一                          个元素。

                      2.遍历数组,取得数组中每一个值,然后和max进行比较,若大于max ,那么将max赋上新值,否则                              max不变。

                      3.数组元素都比较完了最后的max 就是该数组最大值。

                      

               

五、数组排序

        a.选择排序

      

           图例: 


                 

                      

                  

             特点:先取得数组中第一个元素和后面所有元素进行比较,如大于后面的数,就互换位置。

                      再取第二个元素和数组后面所有元素比较

                      每一轮比较完后,都会产生一个最小值在数组头角标上。

                      这是一个嵌套循环

             代码实现:

 public void selectSort(){//选择排序int arr[]={2,1,5,3,7};for(int x=0;x<arr.length-1;x++)//遍历数组{//arr.length-1数组最后一个元素不用再比较,否则数组越界,因为没有arr[length]这个元素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;}}}}


            b.冒泡排序

                    图例:

             

                   特点:相邻两个元素进行比较,如果符合条件,就进行换位。

                              小值往前,大值往后

                              一圈完成后,最大值在最后,所有第二圈最后一值可以不参加比较。

                   代码实现:

public void buffleSort(){//冒泡排序int[] arr={1,3,2,8,5,0};for(int x=0;x<arr.length-1;x++)//控制外循环,比较的圈数。{//每次进行比较时,都是第一个元素和第二个元素比较。for(int y=0;y<arr.length-x-1;y++){//arr.length-x内循环在逐渐减小,所以后面的元素不用笔记if(arr[y]>arr[y+1]){int temp=arr[y];arr[y]=arr[y+1];arr[y+1]=temp;}}}}
                     补充:a.排序最快的是希尔排序。

                                b.当数组元素较多时,要考虑排序的效率和性能。

                                c.在堆内存中换位置是比较消耗资源。因此做好是先把要换位置的元素角标在栈内存中记录下来,当比较完后,最后在换位置。

                                d.不管是选择排序还是冒泡排序,都用到了位置置换,那么可以把此功能封装函数,以便复用。

               


六、进制转换

                a.十进制-二进制

                    原理:除2模2的过程

                    结果是要倒叙的,才符合二进制。

                    代码体现:

public void toBin(int num){//十进制转换二进制//用StringBuffer存储结果,再将其反转,就是所求数的二进制StringBuffer sb=new StringBuffer();while(num>0){   sb.append(num%2);//取的模2的值   num=num/2;//不断除2,然后再模2}sb.reverse();//最后将其反转,得到二进制}
         

                     b.十进制-十六进制

                          原理:先拿数与上15,然后进行右移4的操作。(无符号右移>>>高位补上0)

                          图例:

                        

                         代码体现:

public void toHex(int num){   //十进制转换十六进制//用StringBuffer存储结果,再将其反转,就是所求数的十六进制StringBuffer sb=new StringBuffer();for(int x=0;x<8;x++){////4字节总共32位,十六进制是4位一组,因此是8    int temp=num & 15;//先进行与比较,存到临时变量中    if(temp>9)        //十六进制在9之后的数用字母表示。    sb.append((char)(temp-10+'A'));    //12-10=2+‘A’=67转换成字母就是C    else    sb.append(temp);    num=num>>>4;//右移4位}    sb.reverse();}

                  c.查表法

                     原理:将所有元素临时存储起来,并建立好联系。每次与上15之后的值作为索引取查之前建立好的表,然后获得对应的元素。

                      补充:字符数组初始化的值是"\u0000",就是一个空格。

                       代码体现:

public void toHex2(int num){char[] ch={'0','1','2','3',   '4','5','6','7',   '8','9','A','B',   'c','D','E','F'};//建立起表的对应关系//定义一个临时容器char[] arr=new char[8];//4字节总共32位,十六进制是4位一组,因此是8组int pos=arr.length;//定义一个指针while(num!=0)//这个判断可以除去0值。只取有效位。{int temp=num & 15;arr[--pos]=ch[temp];//将与上的数最为角标查表,倒着存num=num>>>4;}}


                    d.封装函数(进制转换)

public void trans(int num,int base,int offset){//base是要相与的数     offset是要移位的数if(num==0)return ;char[] ch={'0','1','2','3',   '4','5','6','7',   '8','9','A','B',   'c','D','E','F'};//建立起表的对应关系char[] arr=new char[32];//int型元素是4字节32位int pos=arr.length;while(num!=0){int temp=num & base;arr[--pos]=ch[temp];num=num>>>offset;}}

七、二维数组

                 概述:二维数组可以看出是一维数组,只不过该数组中存放的元素是数组。

                 初始化:int[][] arr=new int[2][];//数组的行数一定要指定,能省略的是列数。

                 原理:二维数组存放的是数组的引用。每个实体都有地址值

                 图例:

 

                       


0 0
原创粉丝点击