格式:
格式1:
if(关系表达式){
语句体;
}
格式2:
if(关系表达式) {
语句体1;
}else {
语句体2;
}
格式三:
if (判断条件1) {
执行语句1;
} else if (判断条件2) {
执行语句2;
}
…
}else if (判断条件n) {
执行语句n;
} else {
执行语句n+1;
}
总结:
1.流程控制语句可以任意嵌套
2.if可以单独存在,else不能单独存在。如果出现else,则必须有if与之对应
3.如果在if…else代码块中只有一条执行代码,则大括号可以省略,但不建议省略。
格式:
switch(表达式) {
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
…
default:
语句体n+1;
break;
}
switch语句总结:1.条件:
等值表达式,值的类型只能满足六种(byte/short/int/char/枚举(jdk1.5之后)/String(jdk1.7之后))
2.执行体:
case的值不能重复,case与default没有书写顺序,但是有执行顺序,会根据值来匹配对应的case去执行,如果都不匹配 ,则执行default。如果没有遇到break,会执行所有可执行的代码。
总结:
1. if…else和switch…case都称为流程控制语句
循环四要素:四个什么?
1.初始化条件(值)-----------从什么时候开始循环
2.循环判断条件-------------满足什么条件才循环
3.循环体----------------------循环的是什么
4.结束条件--------------------什么时候停止循环
1.1格式
for(初始化表达式; 布尔表达式; 步进表达式){
循环体
}
注意:
1.for循环中循环四要素可以都不写,也可以只写一部分。但是两个分号;必须得写,否则报错。
2、双层循环: 外层循环控制行,内层循环控制列。外层循环执行一次,内层循环执行一轮。
2.1 while循环
格式:
初始化表达式
while(布尔表达式){
循环体
步进表达式
}
2.2 do–while循环
格式:
初始化表达式
do{
循环体
步进表达式
}while(布尔表达式);
do...while循环的特点:无条件执行一次循环体,即使我们将循环条件直接写成false,也依然会循环一次。这样的 循环具有一定的风险性,因此初学者不建议使用do...while循环。
①控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。
③在已知循环次数的时候使用推荐使用for,循环次数未知的时推荐使用while。
注意:
1.结束语句有就近原则,对其离得最近的循环起作用
2.可以通过起别名的方式结束循环
代码如下:
Scanner scanner = new Scanner(System.in); //起别名 a:while(true){ System.out.println("username"); String username= scanner.next(); if ("TOM".equals(username)){ while(true){ System.out.println("password"); String password = scanner.next(); if ("123456".equals(password)) { System.out.println("登录成功"); break a;//指定跳出层循环 }else{ System.out.println("密码错误"); } } }else{ System.out.println("账号错误"); } }
存储一组相同数据类型的容器
数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];
数组定义格式详解:
- 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。
- [] : 表示数组。
- 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组
- new:关键字,创建数组使用的关键字。
- 数组存储的数据类型:创建的数组容器可以存储什么数据类型。
- [长度]:数组的长度,表示数组容器中可以存储多少个元素。
- 注意:数组有定长特性,长度一旦指定,不可更改。 和水杯道理相同,买了一个2升的水杯,总容量就是2升,不能多也不能少。
例如: int[] arr = new int[3];
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…};
例如: int[] arr = new int[]{1,2,3,4,5};
数据类型[] 数组名 = {元素1,元素2,元素3…};
例如: int[] arr = {1,2,3,4,5};
补充:
- 各种数据类型的数组的默认值:
String[] ----------null;
int[]----------------0;
chart[]-------------空格;
double[]----------0.0;
byte[]--------------0;
boolean[]---------false;- 数组获取值和赋值
获取值:数组名[index]
赋值:数组名[index]=值- 数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为: 数组名.length ,属性length的执行结果是数组的长度,int类型结果。由此可以推断出,数组的最大索引值为 数组名.length-1 。
内存概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
Java虚拟机的内存划分
数组在内存中的存储的详细过程
代码如下: public static void main(String[] args) { int[] arr = new int[3]; System.out.println(arr);//[I@5f150435 } /** *以上方法执行,输出的结果是[I@5f150435,这个是什么呢?是数组在内存中的地址。 *new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。 */
输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素
两个数组内存图
public static void main(String[] args) {
int[] arr = new int[3];
int[] arr2 = new int[2];
System.out.println(arr);
System.out.println(arr2);
}
两个变量指向一个数组
public static void main(String[] args) {
// 定义数组,存储3个元素
int[] arr = new int[3];
//数组索引进行赋值
arr[0] = 5;
arr[1] = 6;
arr[2] = 7;
//输出3个索引上的元素值
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//定义数组变量arr2,将arr的地址赋值给arr2
int[] arr2 = arr;
arr2[1] = 9;
System.out.println(arr[1]);
}
1.复制(java中提供了两种方式)
由Arrays类提供的
public static 数组类型[] copyOf(数组类型[] src,int newlength)
– src:源数组-------------------------提供复制数据的数据源
– newlength -------------------------新数组的长度,长度>=0
例如:
int[] arr1 = {1,2,3,4,5,6};
int[] arr2 = new arr2[8];
int[] arr2 = Arrays.copyOf(new arr1,5);
由System类提供的
public static void arraycopy(数组类型[] src, int srcPos, 数组类型 dest, int destPos, int length)
– src:源数组--------------------------提供复制数据的数据源
– srcPos:源数组的开始位置---------从数组中哪个位置开始复制
– desc:目标数组---------------------复制到哪个数组
– destPos:目标数组的开始位置-----从目标数组中的哪个位置开始复制
– length:复制的长度
例如:
int[] arr = {1,2,3,4,5,6};
int[] array = new int[3];
System.arraycopy(arr,1,arrary,0,array.length);
注意:
— 如果是从头开始复制,长度不限,建议使用copyOf()方法。
— 如果是指定位置长度进行复制,建议使用arraycopy()方法。
2.排序(冒泡排序法)
口诀:
N个数来排序
两两相比小靠前
外层循环length-1
内层循环length-i-1
例如: public class TestDemo { public static void main(String[] args) { int[] arr = {2,8,1,6,3,7,9}; for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length-i-1; j++) { if (arr[j] > arr[j+1]){ int temp = 0; temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } for (int a:arr) { System.out.println(a); } } }
3.值传递和引用传递
分析下列程序代码,计算输出结果。
package com.kejizhentan; import java.util.Scanner; public class TestDemo { public static void main(String[] args) { int a = 1; int b = 2; System.out.println(a); System.out.println(b); change(a, b); System.out.println(a); System.out.println(b); } public static void change(int a, int b) { a = a + b; b = b + a; } }
结果如下:
. 分析下列程序代码,计算输出结果。
public class TestDemo { public static void main(String[] args) { int[] arr = {1, 3, 5}; System.out.println(arr[0]); change(arr); System.out.println(arr[0]); } public static void change(int[] arr) { arr[0] = 200; } }
总结:
方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值.