第二篇学习总结
一、循环语句
和选择语句不同,循环语句满足一定条件循环执行循环体内的语句。循环语句在Java中有三种形式:for,while,do...while。
1.for循环
for循环语句的格式为:for(初始化表达式;condition;循环后表达式){statement}。执行流程是:首先执行初始化表达式,将变量初始化,然后判断条件,如果条件满足,也就是true就执行循环体中的语句,执行完之后执行循环后表达式,再次判断,如果条件不满足,也就是false会退出循环。
for循环中的三个部分均可以省略,初始化表达式不是必须,因为可以在外面进行变量的初始化,condition也不是必须,如果省略的话默认为true,无限循环,循环后表达式也可以省略,因为可以在循环体内对循环判断变量进行计算,这样就相当于一个while循环了。如果同时省略三条语句的话就相当于一个while(true)循环了。
2.while循环
while循环语句的格式为while(condition){循环语句}。while循环的执行流程为首先判断condition是否为true,如果为true,就执行循环体内的语句,否则就退出循环。一般将while循环看作是for循环的简写形式,因为while循环能做的for循环一定能做,while循环适用于循环次数不确定的情况下,比如当一个方法返回boolean类型的时候,可以用这个方法作为condition,如果返回true就执行循环体内的语句。
3.do{}while()循环
do...while循环语句的格式为do{循环语句}while(condition)。执行流程是,先执行一遍循环体内的语句,然后再进行判断,如果为true继续执行循环,否则,退出循环。do...while循环与while循环的不同是:do...while循环至少会执行一次循环体内的语句,while循环有可能一次也不执行。
4.关键字
- return:return关键字是和方法一起作用的,return后面的语句不再执行,结束整个方法,整个方法结束了,循环语句也就结束了。
- break:break关键字的作用是结束循环,循环后如果还有语句还会继续执行,如果有多层循环的话break只能结束所在的那层循环。
- continue:结束本次循环,不再执行循环内continue后面的语句,开始下一次循环。
- 如果break和continue想要结束父循环,就必须给父循环起别名。
public static void main(String[] args) {
w: for (int i = 0; i < 10; i++ ) {
//外循环语句
System.out.println("外循环语句.....前");
for (int j = 0; j < 10; j++) {
break w;
}
System.out.println("外循环语句.....后");
}
}
二、数组
数组是存放同一种数据类型的容器,定义时就必须指定长度与数据类型,通过下标访问,长度不能改变,所存放的数据类型也不能改变,所以,数组的使用不够灵活,后来又出现了List集合,不过,Java中唯一的底层容器就是数组,是一种引用数据类型。
1.数组的初始化
- 静态初始化:在定义数组时数组中的元素由程序员自己指定,数组的长度由Java虚拟机自己判断,这种方式不够灵活。
- 动态初始化:定义数组时不指定内容,只指定长度,数组中的元素由JVM自己填充。
2.数组的操作
- 获取数组的元素:使用下标值:arr[i],数组中的元素下标是从0开始的,所以要想获取第i个元素,就需要使用ar[i-1]。数组中存储的是元素的地址而不是值。
- 获取数组的长度:arr.length。数组中最后一个元素的获取方式:arr[arr.length-1]。
3.数组的默认值
- byte、short、int、long默认初始化值是0。
- float与double的默认初始化值是0.0。
- char默认初始化值是十六进制的'\u0000'。
- boolean类型的默认初始化值是false。
- 引用数据类型的默认初始化值是null。
4. 数组在内存中的分配
Java在内存中只有两个部分:堆区与栈区,很多人在这两个部分基础上再分出方法区、常量池等部分,引用数据类型都是存储在堆区,栈区只存储局部变量。数组的初始化是这样的过程:首先分配连续的内存空间,然后分配下标,之后如果是动态初始化就分配默认的值,如果是静态初始化就赋上指定的值。
5.数组中常见的问题
- ArrayIndexOutOfBoundException:下标越界异常,下标超过了数组的最大下标。
- NullPointerException:空指针异常,某个元素为空。
6.数组的基本操作
- 遍历数组
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
- 获取数组中的最大值/最小值
int max = arr[0]
for(int i=1;i<arr.length;i++){
if(arr[i]>max){
max = arr[i];
}
}
- 反转数组
for(int i=0;i<arr.length/2;i++){
int temp = arr[i];
arr[i] = arr[arr.length-1-i];
arr[arr.length-1-i] = temp;
}
- 查找数组中某个值第一次出现的位置,如果没找到,就打印-1
int value;
int index = -1;
for(int i=0;i<arr.length;i++){
if(arr[i]==value){
index = i;
break;
}
}
System.out.println(index);
7.二分查找
二分查找是效率最高的查找算法,最坏时间复杂度是log(N)。一次可以将一半的数据剔除,但是二分查找的前提是已经排序好的数据。
public static int binarySearch(int[] arr,int value){
int bottom = 0;
int top = arr.length-1;
int index = -1;
while(bottom<=top){
int mid = (bottom+top)/2;
if(arr[mid]==value){
index = mid;
break;
}
else if(arr[mid]<value){
bottom = mid+1;
}
else {
top = mid-1;
}
}
return index;
}
8.冒泡排序
冒泡排序算法是较为简单的排序算法之一,其基本思想是比较相邻的两个元素,依次将最大的数放在最后面,这样就实现了元素从小到大排序。这个排序算法的时间复杂度是O(n2)。
public static void bubbleSort(int[] a){
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i;j++>){
if(a[j]>a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
三、方法
方法是用来包裹一段代码,这样这段代码就实现了重用,不然每次都需要重新写一遍方法中的代码。,定义一个方法的格式如下:
权限修饰符 静态/非静态 返回值类型 方法名(参数类型1 参数1,参数类型2 参数2,.....)。
- 权限修饰符:public private protected 或者没有。
- 静态/非静态:static 如果有static就是静态,没有static就是非静态。
- 返回值类型:可以有返回值类型,也可以没有返回值(void)。
- 方法名:遵循驼峰命名法。
- 参数:数量无限制,但一般不要超过四个,否则不容易记忆,也可以没有。
1.方法的分类和调用
-
方法的分类:根据有无参数及有无返回值可以分为四类:有参方法、无参方法、有返回值与无返回值。
-
调用方式:单独调用、输出调用、赋值调用。
2.方法的重载(OVERLOADING)
JVM判断两个方法是否相同依据方法名与参数列表,如果两者都相同,则认定是同一个方法,一个类中不允许出现方法名相同,参数列表也相同的两个方法,两者只要有一个不同就是不同的方法。方法的重载含义是在同一个类中出现了多个方法名相同,但是参数列表不相同的方法,参数列表包括参数类型、参数个数、参数顺序,只要有一个不同就算是重载。但是参数顺序不同的重载在程序开发中没有意义,所以不要使用。
3.方法间相互调用
JVM在调用某个方法时,会将这个方法压入栈中,如果这个方法又调用了其他方法,就会将另一个方法压入栈中,当方法执行完毕之后,会将当前方法弹栈。
4.可变参数
在方法声明上使用...表示多个相同类型的参数,可变参数使用是有限制的,一般可变参数放在最后,因为可变参数会将尽可能多的参数形成一个整体,也就是组成一个数组,这时如果我们想传入一个单独的参数,并不想让它成为数组的一部分,如果可变参数放在前面这样的操作就无法完成。
网友评论