一. 循环语句分类
while,do while,for
二. while
格式:
while(boolean表达式){
循环体
}
新建WhileDemo.java
//whlie的Demo
class WhileDemo
{
public static void main(String[] args)
{
//打印500次
int i = 0;
while (i < 500)
{
//System.out.println("帅哥");
i ++;
}
//打印1-100
i = 1;
while (i <= 100)
{
System.out.println(i);
i ++;
}
//计算1-100的整数和
i = 1;
int count = 0;
while (i <= 100)
{
count += i;
i ++;
}
System.out.println("count =" + count);
}
}
三. do while
先执行一次循环体,再进行判断
do{
循环体
}while(boolean表达式);
新建DoWhileDemo.java
//do while的Demo
class DoWhileDemo
{
public static void main(String[] args)
{
//打印帅哥100次
int i = 0;
do{
//System.out.println("帅哥");
i ++;
}while(i < 100);
//打印1-100整数
i = 1;
do
{
System.out.println(i);
i ++;
}
while (i <= 100);
//计算1-100整数的和
i = 1;
int count = 0;
do
{
count += i;
i ++;
}
while (i <= 100);
System.out.println(count);
}
}
四. for
for(初始化语句;boolean表达式;循环后操作语句){
循环体语句;
}
- 初始化语句:表达式对循环初始化,只在循环开始时执行一次。
- boolean表达式:表达式为false时,循环终止。
- 循环后操作语句:循环每次迭代之后会调用该语句,一般该语句都是执行递增或递减。
新建ForDemo.java
//for循环
class ForDemo
{
public static void main(String[] args)
{
//打印100次帅哥
for (int i = 0;i < 100;i ++ )//这样定义作用域为for当中
{
//System.out.println("帅哥");
}
//打印1-100整数
for (int i = 1;i <= 100 ;i ++ )
{
//System.out.println(i);
}
//计算1-100之间的整数
int count = 0;
for (int i = 1;i <= 100 ;i ++ )
{
count += i;
}
System.out.println(count);
}
}
- 三大循环,for循环要方便,for性能更高。
- 原因:变量定义在for循环里面,循环执行完毕后,释放该变量的存储空间。
五. 嵌套循环
新建LoopInLoopDemo.java
//嵌套循环
class LoopInLoopDemo
{
public static void main(String[] args)
{
for (int i = 1;i <= 4 ;i ++ )
{
for (int j = 1;j <= 100 ;j ++ )
{
System.out.println(j);
}
System.out.println("---------");
}
}
}
六. 嵌套循环的性能优化
-
案例描述
某日,在JavaEye上看到一道面试题,题目是这样的:请对以下的代码进行优化
for (int i = 0; i < 1000; i++)
for (int j = 0; j < 100; j++)
for (int k = 0; k < 10; k++)
testFunction (i, j, k);
- 案例分析
从上述代码案例可以看出,不论如何优化,testFunction()执行的次数都是相同的,该部分是不存在优化的可能。那么优化只能从循环变量i,j,k的实例化、初始化、比较、自增等耗时方面来进行分析。首先,分析原题代码循环变量在以上方面的耗时情况:
变量 | 实例化(次数) | 初始化(次数) | 比较(次数) | 自增(次数) |
---|---|---|---|---|
i | 1 | 1 | 1000 | 1000 |
j | 1000 | 1000 | 1000*100 | 1000*100 |
k | 1000*100 | 1000*100 | 1000 * 100*10 | 1000 * 100*10 |
目的:该代码性能优化就是要尽可能地减少循环变量i、j、k的实例化、初始化、比较、自增的次数,同时不引起其他可能的耗时运算。
- 解决过程
- 优化方案①:
for (int i = 0; i < 10; i++)
for (int j = 0; j < 100; j++)
for (int k = 0; k < 1000; k++)
testFunction (k, j, i);
该方案主要是将循环次数少的放在外面,循环次数多的放在里层,这样可以最大程度地减少相关循环变量的实例化次数、初始化次数等,方案耗时情况如下:
变量 | 实例化(次数) | 初始化(次数) | 比较(次数) | 自增(次数) |
---|---|---|---|---|
i | 1 | 1 | 10 | 10 |
j | 10 | 10 | 10*100 | 10*100 |
k | 10*1000 | 10*100 | 10 * 100*1000 | 10 * 100*1000 |
- 优化方案②:
int i, j, k;
for (i = 0; i < 10; i++)
for (j = 0; j < 100; j++)
for (k = 0; k < 1000; k++)
testFunction (k, j, i);
该方案主要是在方案①的基础上,将循环变量的实例化放在循环外,这样可以进一步减少实例化次数,耗时情况如下表:
变量 | 实例化(次数) | 初始化(次数) | 比较(次数) | 自增(次数) |
---|---|---|---|---|
i | 1 | 1 | 10 | 10 |
j | 1 | 10 | 10*100 | 10*100 |
k | 1 | 10*100 | 10 * 100*1000 | 10 * 100*1000 |
注:方案②的优势体现在若将i、j、k的数值提高更多的,其提升的效果才更明显。
七. 打印一个矩形
//打印一个矩形
class RectangleDemo
{
public static void main(String[] args)
{
for(int i = 0;i < 4;i ++){
for (int j = 0;j < 6 ;j ++ )
{
System.out.print("*");
}
System.out.println("");//换行
}
}
}
八. 打印三角形
新建TriangleDemo.java
//输出三角形
class TriangleDemo
{
public static void main(String[] args)
{
for (int i = 1;i < 9;i ++ )
{
for (int j = 0;j < i ;j ++ )
{
System.out.print("*");
}
System.out.println("");
}
}
}
九. 九九乘法表
//99乘法表
class Table99Demo
{
public static void main(String[] args)
{
//第一行
//第二行
//第三行
for (int i = 1;i <= 9 ;i ++ )
{
for (int j = 1;j <= i ;j ++ )
{
System.out.print(j + " * " + i + " = " + ( j * i) + "\t");
}
System.out.println("");
}
}
}