黑马程序员_Java基础04天日志

来源:互联网 发布:艾森豪威尔总统 知乎 编辑:程序博客网 时间:2024/05/19 13:28

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



1.   数组(静态初始化常见问题)


问题1:ArrayIndexOutOfBoundsException:x:操作数组时,访问到了数组中不存在的角标


例:int [] arr=new int[3];  arr[3];


问题2:NullPointerException:空指针异常:当引用没有任何指向值为null的情况,该引用还在用于操作实体.


例:int[] arr; arr=null; arr[1];


2.   数组(常见操作-遍历)


2.1        数组中有一个属性可以直接获取数组长度。使用方式:.length


2.2        实例: for(int i=0;i<arry.length.i++)


2.3        输出数组地址:System.out.println(arr);


例:若输出值为 [I@de6ced   “[” 代表是数组 “ I” 代表是int 类型的数组 “@”后为地址  其意思为,这是一个int类型数组,de6ced是它的地址。


3.   获取数组中的最值


3.1        思路:

    1.获取最值需要进行比较。每次比较都会有一个比较大的值,因为该值不确定,通过一个变量进行临时储存。

    2.让数组中的每一个元素都和这个变量中的值进行比较。如果大于该变量中的值,就用该变量记录较大值。

    3.当所有元素都比较完成,那么该变量中储存的就是数组中的最大值了。

     3.2     代码:



4.   选择排序

4.1        原理:假如是升序排序,从数组的第一位开始循环,把第一位依次与后面的所有数进行比较,比第一位小的数就与它交换,一次循环结束后,就能把最小的那个数排到第一位,然后在从第二位数开始,依次与其后面的数进行比较。循环结束后第二小的数就排到了第二位,依次类推,就可以把所有数进行顺序排序了。降序排序的原理也是一样。

4.2        代码:

升序排序


降序排序

 

5.   冒泡排序

5.1        原理:相邻的两个元素进行比较,如果符合条件就换位。跟选择排序差不多,只不过每次比较的元素是相邻的元素。还有一点不同,就是每次的最大值或最小值都排在最后位。

5.2        代码:

  升序排序

 

降序排序

 

6.   折半查找

6.1        要求和优点:可以提高效率,但必须保证数组是有序数组。

6.2        原理:对一个有序数组进行折半分开,把需要查找的元素与数组中间元素比较大小,若查找的元素比中间元素大,则继续把数组往大的方向进行折半,若比中间元素小,则把数组往小的方向进行折半。再继续用查找的元素比较折半后数组的中间元素。依次类推,若存在该元素,则总有一个中间元素与其相等。然后返回该中间元素下标。

6.3        实例:

方法1:

 

public static intgetIndex(int[] arr,intnum){       intmin,max,mid;       min=0;       max=arr.length-1;       mid=(min+max)/2;             while(min<=max){           if(num<arr[mid]){              max=mid-1;           }else if(num>arr[mid]){              min=mid+1;           }else{              return mid;           }           mid=(min+max)/2;       }       return -1;  } 


方法2:

 

  

  public static intgetIndex_2(int[] arr,intnum){       intmin=0,max=arr.length,mid=(min+max)/2;             while(arr[mid]!=num){           if(num<arr[mid]){              max=mid-1;           }else if(num>arr[mid]){              min=mid+1;           }           if(min>max){              return -1;           }           mid=(min+max)/2;       }       return mid;  } 

 

 

7.   用代码实现十进制转换为二进制

7.1原理:每次除以2取余。

7.2代码:

      

public static voidtoBin(int num)    {       StringBuffer sb = newStringBuffer();        while(num>0)       {           //System.out.println(num%2);           sb.append(num%2);           num = num / 2;       }        System.out.println(sb.reverse());    }

8.   用代码实现十进制转换为十六进制

8.1 原理:四个二进制位就是一个八进制位。用&算法得到后面的四个二进制位再转换相应的十六进制,每次运算完后,把数右移4位再继续循环。原因:因为通过&算法已经得到了后面的4位,所以要把它们去掉,再把它们前面的4位取出来,依次可得全部的有效位。

8.2 代码实现:

public static voidtoHex(int num)    {        StringBuffer sb = newStringBuffer();        for(int x=0;x<8; x++)       {           int temp= num & 15;           if(temp>9)              //System.out.println((char)(temp-10+'A'));              sb.append((char)(temp-10+'A'));           else              //System.out.println(temp);              sb.append(temp);            num = num >>> 4;       }       System.out.println(sb.reverse()); }


注: reverse()方法是StringBuffer类里面的一个方法,作用是对StringBuffer对象里存储元素进行反转然后返回。

Append()方法是把元素加入StringBuffer对象中进行储存。

(char)(temp-10+’A’)的作用是把 &15 大于9的值转换为对应的十六进制的 A~F.

 

9.   查表法十进制——十六进制


9.1查表法:将所有的元素临时储存起来。建立对应关系。


      9.2 临时数组:

char[]chs = {'0','1','2','3'                  ,'4','5','6','7'                  ,'8','9','A','B'                  ,'C','D','E','F'};


    每次&15后的值作为索引去查建立好的表。就可以找对应的元素

     代码:

  

  public static voidtoHex(int num)    {       char[]chs = {'0','1','2','3'                  ,'4','5','6','7'                  ,'8','9','A','B'                  ,'C','D','E','F'};             //定义一个临时容器。       char[]arr = new char[8];       int pos= arr.length;        while(num!=0)       {           int temp= num & 15;                     //System.out.println(chs[temp]);           arr[--pos] = chs[temp];                      num = num >>> 4;       }       System.out.println("pos="+pos);       //存储数据的arr数组遍历。       for(intx=pos;x<arr.length; x++)       {           System.out.print(arr[x]+",");       }     }

注:--pos的意思是,先将pos自减再用作于下标。


10. 查表法十进制——二进制


10.1临时数组: char[] chs = {'0','1'};


     10.2 代码:

      

public static voidtoBin(int num)    {       //定义二进制的表。       char[]chs = {'0','1'};        //定义一个临时存储容器。       char[]arr = new char[32];        //定义一个操作数组的指针       int pos= arr.length;        while(num!=0)       {           int temp= num & 1;            arr[--pos] = chs[temp];            num = num >>> 1;       }        for(intx=pos; x<arr.length; x++)       {           System.out.print(arr[x]);       }    }

 

11. 进制转换优化


11.1把十进制转换为二进制和转换为十六进制的代码合并,把不同变量的作为参数传进来。


11.2具体实现代码:


num为需要转换的十进制数,base是&运算的数。offset是移位数。

public static voidtrans(int num,intbase,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];        int pos= arr.length;        while(num!=0)       {           int temp= num & base;           arr[--pos] = chs[temp];           num = num >>> offset;       }        for(intx=pos; x<arr.length; x++)       {           System.out.print(arr[x]);       }        return ;}


12. 二维数组


12.1格式:int[ ][ ] y=new int[x][x];  inty[ ][ ]=new int[x][x];  


int[ ] y[ ]=new int[x][x];    x为不确定的整数。


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


   上面定义的二维数组的意义是:


a.   定义一个名称为arr的二维数组


b.二维数组的长度表示方式:arr.length;


 c.二维数组中的有三个一维数组


 d.每一个一维数组中具体元素也都已初始化


 e.第一个一维数组arr[0] = {3,8,2};


 f.第二个一维数组arr[1] = {2,7};


 g.第三个一维数组arr[2] = {9,0,1,6};


 h.第三个一维数组的长度表示方式:arr[2].length;


12. 2 第二种方式:int [][]arr=new int[3][ ];


arr[0] =new int[3]; 定义第一个一维数组,长度为3

arr[1] =new int[1]; 定义第一个二维数组,长度为1

arr[2] =new int[2]; 定义第一个三维数组,长度为3



------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
0 0
原创粉丝点击