黑马程序员 Java 语言基础下

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


第二章 Java语言基础

程序流程控制

判断结构

if语句

用于做判断使用的。
  常见于对某个范围进行判断,或者几个变量进行判断,还有就是boolean表达式的判断。

三种格式:

1.if(条件表达式)

  {

         执行语句;

}

执行流程:
如果条件表达式为true,就执行语句体;
否则,什么都不执行。

2. if(条件表达式)

  {

         执行语句;

}

 else

  {

     执行语句;

  }

执行流程:
如果条件表达式为true,就执行语句体1;
否则,就执行语句体2;


特殊:
可以和条件表达式在某些情况下进行替换。
一般是在赋值的情况下可以。


举例:
获取两个数中的最大值。

3. if(条件表达式)

  {

         执行语句;

}

 else if(条件表达式)

  {

     执行语句;

  }

else

  {

     执行语句;

  }

执行流程:
如果条件表达式1为true,就执行语句体1;
如果条件表达式2为true,就执行语句体2;
...
否则,就执行语句体n;

注意事项
a:什么时候用哪一种if语句。
第一种格式在判断条件为一种情况下使用。
第二种格式在判断条件为两种情况下使用。
第三种格式在判断条件为多种情况下使用。
b:每一种if语句其实都是一个整体,如果有地方执行了,
 其他的就不执行了。
c:如果if或者else里面控制的语句体是一条语句,是可以省略大括号的,
 但是,如果是控制多条语句,就必须写上大括号。
 建议:永远写上大括号。
d:大括号和分号一般不同时出现。

作用域
所有变量的定义只在它所属的大括号内有效。 


选择结构

switch语句

用于做选择使用的。一般用于几个常量的判断。
switch会把几个常量值直接加载到内存,在判断的时候,效率要比if高。
所以,针对几个常量的判断,一般选择switch语句。

格式:

switch(表达式)

{

  case 取值1:

     执行语句;

     break;

  case 取值 2:

     执行语句;

     break;

  default:

      执行语句;

      break;

}

针对格式的解释
switch:表示这里使用的是switch语句,后面跟的是选项。
表达式:byte,short,int,char
       JDK5以后可以是枚举
JDK7以后可以是字符串
case:表示这里就是选项的值,它后面的值将来和表达式的值进行匹配。
    case后面的值是不能够重复的。
break:
switch语句执行到这里,就结束了。
default:
当所有的case和表达式都不匹配的时候,就走default的内容。
它相当于if语句的else。一般不建议省略。
 执行流程
进入switch语句后,就会根据表达式的值去找对应的case值。
如果最终没有找到,那么,就执行default的内容。

 注意事项:
a:default整体可以省略吗?
可以,但是不建议。
b:default的位置可以放到前面吗?
可以,但是不建议。
c:break可以省略吗?
可以,但是不建议。
default在最后,break是可以省略的。
case后面的break可以省略,但是结果可能有问题。
d:switch语句什么时候结束呢?
就是遇到break或者执行到程序的末尾。 


if和switch的应用:

 

if:

       1,对具体的值进行判断。

       2,对区间判断。

       3,对运算结果是boolean类型的表达式进行判断。

 

switch:

       1,对具体的值进行判断。

       2,值的个数通常是固定的。

       对于几个固定的值判断,建议使用switch语句,因为switch语句会将具体的答案都加载进内存。效率相对高一点。

 

循环结构

代表语句:while,   do while ,   for

如果我们发现有很多重复的内容的时候,就该考虑使用循环改进代码。
  让我们代码看起来简洁了。

while语句格式:

while(条件表达式)

{

    执行语句;

}

 

do while 语句格式:

do

{

    执行语句;

}while(条件表达式);

do while特点:条件无论是否满足,循环体至少执行一次。

 

for语句格式:

for(初始化表达式;循环条件表达式;循环后的操作表达式)

{

    执行语句;(循环体)

}

注:

1, for里面的连个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复找个过程,直到条件不满足为止。

2, while和for可以互换,区别在于for为了循环而定义的变量在for循环结束就是在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。

3, 最简单无限循环格式:while(true),for(;;)无限循环在在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。

 

其它流程控制语句

有些时候,我们需要对循环进行一些控制终止,这个时候,就出现了两个关键字:
break和continue

break(跳出),   continue(继续)

break语句:应用范围:选择结构和循环结构。

continue语句:应用于循环结构。

注:

1, 这两个语句离开应用范围,存在是没有意义的。

2, 这两个语句单独存在下面都不只可以有语句,因为执行不到。

3, continue语句是结束本次循环继续下次循环。

4, 标号的出现,可以让这两个语句作用于指定的范围。

 

函数

函数的定义:

什么是函数?

 函数就是定义在类中的具有特定功能的一段独立小程序。

 函数也称为方法。

函数的格式:

 修饰符 返回值类型  函数名(参数类型  形式参数1,参数类型 形式参数2,……)

 {

     执行语句;

    return 返回值;

 }

返回值类型:函数运行后的结果的数据类型。

参数类型:是形式参数的数据类型

形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。

实际参数:传递给形式参数的具体数值。

return:用于结束函数。

返回值:该函数运算后的结果,该结果会返回给调用者。

特殊情况:

       功能没有具体的返回值。

 

       这时return的后面直接用分号结束。

       返回值类型怎么体现呢?因为没有具体值,所以不可以写具体的数据类型。

       在java中只能用一个关键字来表示这种情况。关键字是:void.

 

       总结:没有具体返回值时,返回值类型用void来表示。

 

       注意:如果返回值类型是void,那么函数中的return语句可以省略不写。

函数的特点:

定义函数可以将功能代码进行封装

便于对该功能进行复用

函数只有被调用才会被执行

函数的出现提高了代码的复用性

对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。

注意:

 函数中只能调用函数,不可以在函数内部定义函数。

 定义函数时,函数的结果应该返回给调用者,交由调用者处理。

 

 

函数的应用

如何定义一个函数呢?

              通过两个明确来完成。

       明确一:这个功能的结果是什么?

              是和。是功能的结果,所以该功能的返回值类型是int 。

              其实就是在明确函数的返回值类型。

 

                    

       明确二:这个功能实现过程中是否需要未知内容参与运算?

              有,加数和被加数。这就是函数的参数列表(参数的个数,参数的类型)

              其实就是在明确参数列表。

 

       注意:返回值类型和参数类型没有直接关系。

 

函数内存加载过程:

 

函数的重载(overload)

重载的概念:

在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。

重载的特点:

与返回值类型无关,呆看参数列表。

重载的好处:

方便于阅读,优化了程序设计。

注java是严谨性语言,如果函数出现的调用不确定性,会编译失败。

重载的示例:

//返回两个整数的和

int add(int x,int y )

{

   return x+y;

}

//返回三个整数的和

int add(int x,int y,int z )

{

   return x+y+z;

}

 

//返回两个小数的和

double add(double x,double y )

{

   return x+y;

}

 

数组

数组的定义

概念:

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

数组的好处:

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

格式1:

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

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

格式2:

元素类型[] 数组名 = new 元素类型[]{元素,元素,……};

如:

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

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

 

数组的内存分配及特点

内存的划分:

1,寄存器。

2,本地方法区。

3,方法区。

4,栈内存。

       存储的都是局部变量。

       而且变量所属的作用域一旦结束,该变量就自动释放。

 

 

5,堆内存。

       存储是数组和对象(其实数组就是对象) 凡是new建立在堆中。

       特点:

       1,每一个实体都有首地址值。

       2,堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同。整数是0,小数0.0或者0.0f,boolean false char '\u0000'

4, 垃圾回收机制。

数组操作常见问题

int[] arr = new int[3];

System.out.println(arr[3]);//ArrayIndexOutOfBoundsException:

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

 

arr = null;

System.out.println(arr[0]);//NullPointerException

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

 

数组常见操作

对数组操作最基本的动作就是存和取。

核心思想:就是对角标的操作。

 

获取最值(最大值,最小值)

获取数组中的最大值。

      

       /* 思路:
       1,需要进行比较。并定义变量记录住每次比较后较大的值。
       2,对数组中的元素进行遍历取出,和变量中记录的元素进行比较。
              如果遍历到的元素大于变量中记录的元素,就用变量记录住该大的值。
       3,遍历结果,该变量记录就是最大值。
 
       定义一个功能来是实现。
       明确一,结果。
                     是数组中的元素。int .
       明确二,未知内容。
                     数组.
       */
       publicstatic int getMax(int[] arr)
       {
              //定义变量记录较大的值。
              intmaxElement = arr[0];//初始化为数组中的任意一个元素。
              for(intx=1; x<arr.length; x++)
              {
                     if(arr[x]>maxElement)
                            maxElement= arr[x];
              }
              returnmaxElement;
       }
       publicstatic int getMax_2(int[] arr)
       {
              //定义变量记录较大的值。
              intmaxIndex = 0;//初始化为数组中任意一个角标。
              for(intx=1; x<arr.length; x++)
              {
                     if(arr[x]>arr[maxIndex])
                            maxIndex= x;
              }
              returnarr[maxIndex];
       }
 
/*排序(选择排序,冒泡排序)*/
public static void swap(int[] arr,int a,intb)
       {
              inttemp = arr[a];
              arr[a]= arr[b];
              arr[b]= temp;
       }
       /*
       冒泡排序。
       */
       publicstatic void bubbleSort(int[] arr)
       {
              for(intx=0; x<arr.length-1; x++)
              {
                     for(inty=0; y<arr.length-1-x; y++)
                     {
                            if(arr[y]>arr[y+1])
                            {
                                   swap(arr,y,y+1);
                                   /*
                                   inttemp  = arr[y];
                                   arr[y]= arr[y+1];
                                   arr[y+1]= temp;
                                   */
                            }
                     }    
              }
       }
 
 
       /*
       选择排序。
       */
       publicstatic void selectSort(int[] arr)
       {
              for(intx=0; x<arr.length-1; x++)
              {
                     for(inty=x+1; y<arr.length; y++)
                     {
                            if(arr[x]>arr[y])
                            {
                                   swap(arr,x,y);
                                   /*
                                   inttemp  = arr[x];
                                   arr[x]= arr[y];
                                   arr[y]= temp;
                                   */
                            }
                     }
              }
       }
 
/*折半查找(二分查找)

       数组常见功能:查找。
       */
       publicstatic int getIndex(int[] arr,int key)
       {
              for(intx=0; x<arr.length; x++)
              {
                     if(arr[x]==key)
                            returnx;
              }
              return-1;
       }
/*
       二分查找法。
      
       */
       publicstatic int halfSearch(int[] arr,int key)
       {
              intmax,min,mid;
              min= 0;
              max= arr.length-1;
              mid= (max+min)/2;
             
              while(arr[mid]!=key)
              {
                     if(key>arr[mid])
                            min= mid + 1;
                     elseif(key<arr[mid])
                            max= mid - 1;
 
                     if(max<min)
                            return-1;
 
                     mid= (max+min)/2;
              }
              return-1;
 
       }
 
       publicstatic int halfSearch_2(int[] arr,int key)
       {
              intmax,min,mid;
              min= 0;
              max= arr.length-1;
 
              while(min<=max)
              {
                     mid= (max+min)>>1;
 
                     if(key>arr[mid])
                            min= mid + 1;
                     elseif(key<arr[mid])
                            max= mid - 1;
                     else
                            returnmid;
              }
              return-1;
       }

 

面试题:

给定一个有序的数组,如果往该数组中存储一个元素,并保证这个数组还是有序的,

那么个元素的存储的角标为如何获取。


/*
       利用二分查找法确定插入位置,返回要插入的位置。
      
       */
       public static int halfSearch(int[] arr,int key)
       {
              int max,min,mid;
              min = 0;
              max = arr.length-1;
              mid = (max+min)/2;
             
              while(arr[mid]!=key)
              {
                     if(key>arr[mid])
                            min = mid + 1;
                     else if(key<arr[mid])
                            max = mid - 1;
 
                     if(max<min)
                            return -1;
 
                     mid = (max+min)/2;
              }
              return mid;
 
       }
 
       public static int halfSearch_2(int[] arr,int key)
       {
              int max,min,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-1;
       }


java中的方法,要导包

import java.util.*;

int index1 = Arrays.binarySearch(arr,5);

//如果存在返回的具体的角标位置,不存在返回的是  -插入点-1

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

 

数组中的数组

二维数组[][]

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

 


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值