for循环
for循环结构
for ( ①初始化语句; ②boolean表达式; ④操作后的语句){
③循环体
}
1.初始化语句,用来声明变量,一般用于控制循环条件.只执行一次
- boolean表达式:作为循环条件
—如果boolean表达式为ture,执行循环体
— 如果boolean表达式为false,跳过执行循环体
3.循环体:重复性的操作
4.操作后的语句,循环体执行后会调用该语句,一般是循环控制变量的递增或递减
总结
1> 还是循环的四部曲
2> for循环的代码更精简,代码行数更少, ( 在明确知道循环次数的情况下,让开发者更关注循环体本身)
实际开发过程中,如果知道循环次数,一定用for
无限循环
while(true){
//ToDo
}
for( ; ; ){
//ToDo
}
嵌套循环
重复性的操作使用循环
如果这个重复性的操作也需要执行多次,此时就需要考虑嵌套循环了
// System.out.println(x); 输出@后光标换行
// System.out.print ( x ); 输出@后光标不换行
// 输出一行 @ @ @ @
for(int j = 1; j <=4; j++){
System.out.print(“ @ “);
}
System.out.println(); //换行
//第二行
for(int j = 1; j <=4; j++){
System.out.print(“ @ “);
}
System.out.println();
//输出三行
for( int i = 1; i <= 3; i++){
for(int j = 1; j <=4; j++){
System.out.print(“ @ “);
}
System.out.println();
}
经验
1> 外层循环控制行,内层循环控制内容列
2> 外层循环执行1次,内层循环4次
for( int row = 1; row <= 9; row++){
for( int col = 1; col <= row; col++){
System.out.print( col + “×” + row + “=” + row * col + “ “) ;
}
System.out.println();
}
控制循环
break:
1> 结束switch
2> 应在循环中,用于停止整个循环(提前结束循环,循环不在继续)
/
for( ; ; ){
if(表达式){
语句;
break;
}
}
break的后续语句不会被执行
continue:
用来中止一次循环,立即进入下一次循环(跳过本次循环)
break是终止整个循环,continue是中止本次循环,整个循环还没结束.
数组 (必须掌握)
第一部分:数组的定义 ,和静态初始化,动态初始化
第二部分:数组的使用
程序计数器(了解)
当前线程所执行的字节码的行号指示器
本地方法桟:(了解)
为虚拟机使用的native方法服务
方法区: (重点)
存储已被虚拟机加载的类信息、常量、静态变量即时编译器编译后的代码数据等
java虚拟机桟:
每个方法在执行的时候都会同时创建一个桟帧, 当方法执行完毕后,该方法的桟帧就被销毁了
( java 方法执行时,在桟区执行)
java堆: 简称为堆区
所有的对象实例以及数字都在堆区上分配
每次使用new关键字,就表示在堆区内开辟一块新的空间
Gc ( 垃圾回收期 )
java的自动垃圾回收机制:
jvm内存模型
1 方法区:用于存储字节码(xx.class)信息,也即类信息
2 栈区:方法执行时在栈区分配内存空间,java方法执行时,在栈区执行。
3 堆区:数组的内存都分配在该区。该区变量有一个标志——new操作符,表示在堆内存中开辟一块新的存储空间。
数组 ( Array )
所谓数组, 把具有相同类型的多个常量值有序组织起来的一种数据形式.
这些按一定顺序排列的多个数据称为数组
1> 数组中的每一个常量值称为数组元素( item / element )
2> 数组中的使用索引/下标( index )来表示元素存放的位置,索引从0开始,步长是1 ,有点类似于Excel表格的行号.
数组的定义语法
int[] ages; 元素数据类型[] 数据名;
// 建议: 数组名以 xx(Arr) / xx(Array) / xx(s)
String[] nameArr / nameArray / names
数组的长度是固定的,无论以那种,
静态初始化:
( 事先知道元素是什么,就选择静态初始化)
语法: 元素数据类型[] 数组名 = new 元素数据类型[] {元素1 , 元素2 , 元素3 , ….. };
step1 : 定义一个数组
int[] numArr;
step2: 静态初始化numArr数组
numArr = new int[] {1,3,5,9,7};
// 定义和初始化合二为一
int[] numArr = new int[] {1,3,5,9,7};
// 语法糖 (定义和初始化必须在同一行)
// 元素数据类型[] 数组名 = {元素1 , 元素2 , 元素3 , ….. };
int[] numArr2 = {1,3,5,9,7};
//错误用法: 语法糖定义和初始化必须在同一行上,不能分开
int[] numArr3;
numArr = {1,3,5,9,7};
nums.length(nums的长度)
null: 空引用,不引用任何堆内容
nums = null; (此时new就像未初始化,无法使用)
动态初始化
事先不知道元素是什么,但知道需要几个内存空间(知道元素个数),
程序员只设置
语法:
元素数据类型[] 数组名 = new 元素数据类型[ length ];
int[] nums = new int[4];
int[] numArr = new int[4];
//重新初始化
numArr = new int[5];
注意:不能同时指定元素值和数组长度
错误写法 int[] numArr = new int[5]{1,3,5,7,9};
基本操作:
int[] nums = {1,3,5,7,9};
1> 获取数组长度: 语法( 数组名.length )
System.out.println(nums.length);
2> 获取元素的值 语法: 变量 = 数组名[index]
index 取值范围[0, 数组名.length - 1)
// 最小下标 0
// 最大下标 3
数组的最大下标永远是 数组名.length - 1
int item;
item = nums[index];
3> 设置元素值 语法 数组名[index] = 新的值;
nums[0] = 10; // 把索引0的值设置为10
// 注意 : 问题1: 数组下标越界的问题
错误示范: item = nums[x]; (x >= nums.length)
// 问题2: nums = null;
没有初始化,空引用问题
数组的遍历操作
依次访问数组的每个元素 (也称之为迭代)
// 1> 普通for循环 : 借助index获取每个元素
int[] nums = {1,3,5,7};
int item;
for( int index = 0; index < nums.length; index++){
// 获取指定索引为止数组元素
item = nums[index];
// 使用该元素
System.out.println(“ item = “ + item);
}
// 2> 增强for (语法糖)
语法:
for( 元素数据类型 变量:数组){
使用该变量
}
for(int item:nums) {
System.out.println(item)
}
需要索引 用普通for , 不关注索引 用增强for
int[] arr = {11,22,33,44,55,66,22,77,88};
int target = 22; (有下标,用普通for)
int index = -1; // 用于记录查找目标元素第一次出现的索引位置
// step1: 依次取出每个元素
int item;
for(int i = 0; i < arr.length; i++){
item = arr[i];
// step2: 和目标元素target比较,如果相等,记录位置并停止查找
if( item == target ){
index = i;
break;
}
// step3: 输出index的值
if( index < 0){
System.out.println(“没找到元素”);
} else {
System.out.println(“找到元素,位置为:” + item);
}
}