黑马程序员_Java学习日记num3

学习内容:循环结构(while语句,do....while语句,for语句);break和continue语句;函数(函数的定义,应用,特性重载);

     数组(一维数组,二维数组);(十进制通过函数封装转二、八、十六进制;选择排序,冒泡排序;以及二分查找)

一、循环结构
 
1,while语句
 格式:
  while(条件表达式)
  需要循环操作的语句;
   特点:先判断条件表达式是否满足条件,来决定执行循环操作与否
2、do....while 语句
格式:
  do
     {  需要循环操作的语句;}
  while(条件表达式)
 特点:先执行循环语句,然后再判断是否满足条件来决定是否第二次进入循环。所以,do....while语句,不论条件是否满足,都至少会被执行一次
 
3、for语句
格式:
   for(初始表达式;循环条件表达式;循环操作表达式)
  循环操作执行语句;
  特点:
  A,for语句执行流程为:初始化表达式如果存在的话,先执行初始化表达式并且只会被执行一次,然后判断循环条件表达式是否为真,满足,则执行循环操作执行语句,然后执                    行循环操作表达式;再判断循环条件表达式是否满足,满足,则执行循环操作执行语句,接着执行循环操作表达式。。。。。。。。。。
  B,对于初始化表达式和循环操作表达式可有可无,并且如果想写多个表达式也可以,中间使用逗号隔开即可。
4,死循环
  两个常用到的死循环格式:
    for(;;)                       while(true)
   循环操作语句                     循环操作语句
5,for语句和while语句的使用区别
  for语句可以将循环增量定义在for语句中,如果for语句结束后,定义的循环增量就自动释放内存,并且不能再或者循环增量的值。
  while语句需要将循环增量定义在while语句外面,当while语句结束后,定义的循环增量还可以继续被使用。
  综上所述,for与while二者可以相互转换,什么时候使用for 什么时候使用while,关键是看对内存的管理以及循环结束后是否还使用循环增量。
 
二、break和continue语句
 
1,break语句
  break既可以应用到选择结构中,也可以用到循环结构中。在选择结构中,意味着选择语句的结束;在循环语句中,则是跳出当前的训话语句。break还有一个特点,如果循环有很多层,在最外层循环钱定义一个标号,使用
break 标号名,则可以直接跳出这个多层循环 。还有,标号仅用于循环,给循环起名字。
 
2,continue语句
  continue语句只可以用于循环结构,意思是跳出本次循环,继续下一次循环。
3,break和continue的一些共同特点
  这两个语句离开应用范围,存在是没有意义的
  这两个语句单独存在下面都不可以有语句,因为执行不到,就是废话。
 
三、函数
 
1,函数的定义:
   函数就是定义在类内部的具有特定功能的一段独立运行的小程序,函数也成为方法。
   函数内部不可以定义函数,函数只可以调用函数。
 
2,函数定义的格式:
   修饰符   返回值类型   函数名(参数类型  参数名称....)
        {
                 函数执行语句;
                 return  返回值;
        }   
 
3,函数的一个重要特性---重载(overload)
   重载概念:在同一个类中,允许存在一个以上的同名函数,只要他们的参数类型或者参数个数不同即可。
   重载的特点:与返回值类型无关,只看参数列表
   什么时候使用重载?当定义的功能相同,但是参与运算的未知内容不同,那么,这时定义一个函数名称以表
 示其功能,方便阅读,而通过参数列表的不同来确定使用哪一个同名函数。
 
四,数组
数组:同一类型数据的集合。数组其实就是一个容器。
 
(一)、一维数组
   1,定义格式:
       元素数据类型[ ] 数组名称 = new 元素数据类型 [ 元素个数或者数组长度 ]
           例如: int[ ] arr = new int[4]; 
       元素数据类型[ ] 数组名称 = new  元素数据类型[ ]{元素1,元素2,元素3..........}
           例如: int[ ] arr = new int[ ]{3,4,5,6,623,33}
       元素数据类型[ ] 数组名称 ={元素1,元素2,元素3..........}
           例如: int[ ] arr = {2,3,4,5,6,}
   2,数组在初始化或者使用的过程在中容易出现两个异常
          ArrayIndexOutOfBoundsException 数组下标越界异常   通常是使用了不存在的数组索引造成的
          NullPointerException 空指针异常    通常是由于使用了未被初始化的数组造成的
(二)、二维数组
        二维数组就是在数组中定义数组。在二维数组中,里面的小一维数组的长度是可以不同的。
1,定义方法。例如:定义一个二维数组,这个二维数组中有3个一维数组,每个一维数组中有四个int类型的元素。
    int[ ][ ] arr = new int[3 ][4 ];
   
   2,一些问题
   A,定义int[ ][ ] arr = new int[3 ][4 ];
      那么执行下面打印语句的结果是:
         System.out.println(arr);//打印的结果是二维数组的地址值
         System.out.println(arr[0]);//打印的结果是二维数组中第一个一维数组的地址值。
         System.out.println(arr.length);//3。  打印的是二维数组中元素个数,即有一个一维数组
         System.out.println(arr[0].length);//4 打印的是二维数组中第一个一维数组有几个元素
   B,定义int[ ][ ] arr = new int[3 ][ ],上面的这个二维数组,仅仅指定了里面包含几个小数组,没有制定小数组中有几个元素。执行下面两个打印语句的结果是:
         System.out.println(arr);//打印的结果是二维数组的地址值
         System.out.println(arr[0]);//打印的结果是null。因为里面的一维数组未被初始化。
   C,定义下面两个数组定义int[ ][ ] arr = new int[3 ][4 ],定义int[ ][ ] arr1 = new int[3 ][ ],则下面的打印结果为 
       System.out.println(arr[0][0]);//结果是0  因为数组存放在堆内存中,对内存中的变量都有默认初始化值。int类型为0,引用类型为null,布尔类型为false
       System.out.println(arr1[0][0]);//会跑出空指针异常,因为第一个小数组没有被初始化,她的地址值为null。
 
五、其他一些知识点
 
1,冒泡排序
思路:冒泡排序每轮排序都是相邻元素之间进行比较,每轮结束后会产生一个元素在其最终位置上。每轮排序结束后,下一轮比较都会减少一个元素。代码如下:
              public static void bubbleSort(int[] arr)
     {
           for(int i = 0; i < arr.length; i++)
              for(int j = 0; j < arr.length-i-1; j++)
               {
                       if(arr[j] > arr[j+1])
                         {
                            int temp = arr[j];
                             arr[j] = arr[j+1];
                              arr[j+1] = temp;
                          }
              }
    }
 
2,选择排序
选择排序每次都是找一个固定的元素和其他元素相比,每次排序完成后,都会产生一个在最终位置的元素,则接下来的排序就会一个元素
 
        public static void selectSort(int[] arr)
         {
 
           for(int i = 0; i < arr.length; i++)
               for(int j = 0; j < arr.length; j++)
                 {
                       if(arr[i] < arr[j])
                   {
                       int temp = arr[i];
                       arr[i] = arr[j];
                       arr[j] = temp;
                   }
                 }
          }
3,二分查找
二分查找的数组必须是有序的,即数组元素从大到小排列。当给出一个元素key,查看其是否在数组中,如果存在返回她的下标,否则返回-1;
                
                    public static int halfSearch(int[] arr,int key)
                      {
                          int min = 0,max = arr.length,mid;
                           mid = (min+max)/2;
                           while(arr[mid] != key || min < max)
                           { 
                              if(key > arr[mid])
                              {  
                                 min = mid + 1;
                                 mid = (min + max)/2;
                              }
                              else if(key < arr[mid])
                              {
                                  max = mid - 1;
                                  mid = (min + max)/2;
                               }
                              else
                                    return mid;
                             }
                          return -1;
                         }
 
4,十进制转任意进制的数据
  十进制数据(包括负数)转换为任意进制的数据,其中需要三个参数,num是被转换的十进制数据,base是转换的基数,offset是在转换的过程中需要右移的位数。代码如下:
             
 
 
public static void trans(int num ,int base, int offset)
{
       if(num == 0) //如果要转换的数值是0,则直接返回
       {
         System.out.println(0);
         return;
        }
          StringBuilder sb = new StringBuilder();// 定义一个StringBuilder容器,用来存放数据,主要使                                                     //用其reverse方法
         char[] chs = new char[]{'0','1','2','3','4','5','6',
               '7','8','9','A','B','C','D','E','F'}; //通过查表法更简单的找到相&之后的数据
       while(num!=0)
           {
                  int temp = num & base;
                  sb.append(chs[temp]);
                  num = num >>> offset;
            }
                 System.out.println(sb.reverse());
         }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2015-04-28 09:55  小敬  阅读(158)  评论(0编辑  收藏  举报