------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、程序流程控制(语句)
1.判断结构:if 语句的三种格式
(1)if 语句:
if(条件表达式)
{
执行语句;
}
(2)if else 语句:
if(条件表达式)
{
执行语句;
}
else
{
执行语句;
}
※ if else结构简写格式:变量 = (条件表达式)?表达式1:表达式2;
※ 好处:可以简化if else代码;弊端:因为是一个运算符,运算后必须有一个结果
(3)if else if...... else 语句:
if(条件表达式)
{
执行语句;
}
else if (条件表达式)
{
执行语句
}
……
else
{
执行语句;
}
2.选择结构:switch语句
switch(表达式)
{
case取值1:
执行语句;
break;
case取值2:
执行语句;
break;
.....
default:
执行语句;
break;
}
※ 何时结束:执行到break语句或switch语句大括号
※ 若匹配的case、default没有对应的break语句,则不判断case,一直执行语句,直到遇到break
※ default、case语句顺序不影响执行顺序,先执行case语句
※ 如何选择何时使用if或switch语句:如果判断的具体数值不多,而且符合byte short int char四种类型,建议使用switch语句稍微高效。其他情况:对区间判断,对结果为boolean类型判断使用if,if的使用范围更广。
3.循环结构:(对某些语句执行多次)
(1)while 语句:(条件满足,执行循环体)
while(条件表达式)
{
执行语句;
}
(2)do while 语句:(无论条件是否满足,至少执行一次循环体)
do
{
执行语句;
}while(条件表达式);
(3)for 语句:
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
※for和while的区别:for语句执行结束后,条件表达式中的变量在内存中被释放;while中的循环变量在循环结束后 还可以继续使用。如果是定义循环增量,用for更合适。
4.其他流程控制语句:
(1)break语句:有作用范围(选择结构和循环结构中用于跳出循环)
(2)continue语句:只能用在循环中,结束本次循环,继续下一次循环
例:打印99乘法表
代码:
class ForFor
{
public static void main(String[] args)
{
for(int x=1; x<=9; x++)
{
for(int y=1; y<=x; y++)
{
System.out.print(y+"*"+x+"="+y*x+"\t");
}
System.out.println();
}
}
}
※ 若打印的99乘法表以1*1开始,则改变条件,让条件随着外循环变化
※ 若打印的99乘法表以9*9开始,则初始化值,让初始化随着外循环变化
例:打印三角形
----*
---* *
--* * *
-* * * *
* * * * *
代码:
class ForForTest { public static void main(String[] args) { for(int x=0; x<5; x++) { for(int y=x; y<5; y++) { System.out.print("-"); } for(int z= 0; z<=x; z++) { System.out.print("* "); } System.out.println(); } } }
二、函数:
1.概念:也称为方法,指具有独立功能的一段小程序,Java中最小的功能就是函数。
2.定义:
修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…)
{
执行语句;
return返回值;
}
3.特点:
(1)对功能代码进行封装,以便复用
(2)只有被调用,才会执行
(3)提高了代码的复用性
(4)如果功能无具体返回值,返回值类型用一个特殊的关键字标识:void,有void关键字时,return语句可省略不写,写也不错。
(5)函数中只能调用函数,不能再函数内部定义函数
4.函数的重载(overload):
(1)定义:同一个类中,可存在一个以上同名函数,只要参数个数或类型不同即可。
(2)使用情况:定义的功能相同,单参与运算的未知内容不同。
※ 函数的参数是有顺序的,参数相同顺序不同也可能会重载
※ 重载与返回值类型无关,当参数类型及个数都相同时,返回值类型不同无法重载。
例:以下哪些函数与给定函数重载:voidshow(int a,char b,double c){}
a.void show(intx,char y,double z){} ※不重载,参数类型和个数都一样,是同一个函数
b.int show(inta,double c,char b){}※重载,参数类型不同
c.void show(inta,double c,char b){}※重载,参数类型不同
d.booleanshow(intc,char b){}※重载,参数个数不同
e.void show(doublec){}※重载,参数个数不同
f.double show(intx,char y,double z){}※不重载,参数个数和类型相同,返回值类型不同
三、数组
1.概念:同一种类型数据的集合,数组就是一个容器。
2.好处:使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
3.格式:
(1)元素类型 [ ]数组名 = new 元素类型 [元素个数或数组长度] ;
如: int [] arr = new int [4]; 也可以写成: int arr[] = new int[4];
(2)元素类型 []数组名 = new 元素类型 [ ]{元素1,元素2,…};
如: int [] arr = new int []{1,2,3};
※ 数组是一个引用数据类型
※ 栈内存中存储的都是引用地址,数据使用完毕后,会自动释放
※ 堆内存中存储的是new出的实体对象,每个对象都有一个地址,标识数据存放的位置,未初始化定义时默认值都为0
4.数组的常见问题
(1)数组脚标越界异常(ArrayIndexOutOfBoundsException):访问到了数组中的不存在的脚标时发生。
(2)空指针异常(NullPointerException):arr引用没有指向实体,却在操作实体中的元素时(arr=null;)。
5.数组的常见操作
(1)遍历:for循环,可以用于获取最值
(2)排序
a.选择排序
public static void 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]) { int temp = arr[x]; arr[x] = arr[y]; arr[y]=temp; } //换位操作 } } }
b.冒泡排序
public static void 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]) { int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1]=temp; } //换位操作 } } }
(3)查找:折半查找(数组必须有序)
a.第一种方法
public static int halfSearch(int[] arr,int key) { int min,max,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(min>max) return -1; mid = (max+min)/2; } return min; }
b.第二种方法
public static int halfSearch2(int[] arr,int key) { int min = 0,max = arr.length - 1,mid; while(min<=max) { mid = (max+min)/2; //>>1 if(key>arr[mid]) min = mid+1; else if(key<arr[mid]) max = mid -1; else return mid; } return -1; }
(4)进制的转换
class ArrayTest { public static void main(String[] args) { toBin(-6); toHex(60); toBa(60); } //十进制--->二进制 public static void toBin(int num) { trans(num,1,1); } //十进制--->八进制 public static void toBa(int num) { trans(num,7,3); } //十进制--->十六进制 public static void toHex(int num) { trans(num,15,4); } public static void trans(int num,int base,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(int x=pos; x<arr.length; x++) { System.out.print(arr[x]); } } }
6.二维数组
1.概念:数组中的数组
2.二维数组的格式
格式1: int[][] arr= new int[3][4];
二维数组中一维数组的个数为3,每一个一维数组中的元素个数为4。
格式2: int[][] arr= new int[3][];
每个一维数组都是默认初始化值null。
格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};
每一个一维数组中具体元素都初始化了。
注:一种特殊定义写法:int[]x,y[](相当于int[]x,int[]y[]),x是一维数组,y是二维数组。