相关链接
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>4.1.3.RELEASEversion>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>compilescope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>8source>
<target>8target>
configuration>
plugin>
plugins>
build>
快捷键 fori
执行流程:
循环结构 for循环语句格式:
for(初始化语句;判断条件语句;控制条件语句) {
循环体语句;
}
//实例
for (int x = 1; x <= 5; x++) {
System.out.println("HelloWorld");
}
for (int i = 0; i < collection.size(); i++) {
}
arraylist可以用for遍历;
collection没有索引,不能用for循环;
案例代码一 流程语句-循环结构-for循环练习
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* for循环语句的格式:
* for(初始化语句;判断条件语句;控制条件语句) {
* 循环体语句;
* }
*
* 执行流程:
* A:执行初始化语句
* B:执行判断条件语句,看其结果是true还是false
* 如果是false,就结束循环
* 如果是true,就继续执行
* C:执行循环体语句
* D:执行控制条件语句
* E:回到B继续
*/
public void OperatorDemo01() {
//需求:在控制台输出5次HelloWorld
//原始做法
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("----------");
//用for循环改进
for (int x = 1; x <= 5; x++) {
System.out.println("HelloWorld");
}
}
}
案例代码二 流程语句-循环结构-for循环练习 获取数据1-5和5-1
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* 需求:获取数据1-5和5-1
*/
public void OperatorDemo02() {
//从1-5
for (int i = 1; i < 5; i++) {
System.out.println("i:" + i);
}
System.out.println("=========");
//从5-1
for (int i = 5; i > 0; i--) {
System.out.println("i:" + i);
}
}
}
案例代码三 流程语句-循环结构-for循环练习 1-5之间数据和
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* 需求:求出1-5之间数据之和
*
* 分析:
* A:定义一个求和变量,初始化值是0
* B:获取1-5的数据,用for循环就可以实现
* C:把每一次获取到的数据累加到求和变量
* D:输出求和变量
*/
public void OperatorDemo03() {
//定义一个求和变量,初始化值是0
int sum = 0;
//获取1-5的数据,用for循环就可以实现
for (int i = 1; i <= 5; i++) {
sum += i;
/*
* 第一次:sum = sum + x = 0 + 1 = 1
* 第二次:sum = sum + x = 1 + 2 = 3
* 第三次:sum = sum + x = 3 + 3 = 6
* 第四次:sum = sum + x = 6 + 4 = 10
* 第五次:sum = sum + x = 10 + 5 = 15
*/
System.out.println("sum:" + sum);
}
//15
System.out.println("结果为:" + sum);
}
}
案例代码四 流程语句-循环结构-for循环练习 1-100之间的偶数
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* 需求:求出1-100之间偶数和
*
* 分析:
* A:定义求和变量,初始化值是0
* B:获取1-100之间的偶数,用for循环实现
* C:拿到每一个获取的数据进行判断看是否是偶数
* 如果是偶数,就累加。
* D:输出求和变量
*/
public void OperatorDemo04() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
sum += i;
}
}
System.out.println("偶数和为:" + sum);
}
}
案例代码五 流程语句-循环结构-for循环练习 寻找水仙花数
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* 需求:求出1-100之间偶数和
*
* 分析:
* A:定义求和变量,初始化值是0
* B:获取1-100之间的偶数,用for循环实现
* C:拿到每一个获取的数据进行判断看是否是偶数
* 如果是偶数,就累加。
* D:输出求和变量
*/
public void OperatorDemo05() {
int ge, shi, bai;
int tempvalue;
int count = 0;
for (int i = 100; i < 1000; i++) {
//获取每一个三位数的个位,十位,百位
ge = i % 10;
shi = i / 10 % 10;
bai = i / 100 % 10;
tempvalue = ge * ge * ge + shi * shi * shi + bai * bai * bai;
//如果相等,就说明该数是水仙花数,在控制台打印
if (tempvalue == i) {
count++;
/*
第1个水仙花数:153
第2个水仙花数:370
第3个水仙花数:371
第4个水仙花数:407
*/
System.out.println("第" + count + "个水仙花数:" + i);
}
}
}
}
执行流程:
循环结构 while语句格式:
//基本格式
while(判断条件语句) {
循环体语句;
}
//扩展格式
初始化语句;
while(判断条件语句) {
循环体语句;
控制条件语句;
}
//实例
while(x<=5) {
System.out.println("HelloWorld");
x++;
}
案例代码六 流程语句-循环结构-while循环
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* while循环的语句格式:
* while(判断条件语句) {
* 循环体语句;
* }
*
* 完整格式:
* 初始化语句;
* while(判断条件语句) {
* 循环体语句;
* 控制条件语句;
* }
*
* 回顾for循环的语句格式:
* for(初始化语句;判断条件语句;控制条件语句) {
* 循环体语句;
* }
*/
public void OperatorDemo6() {
//在控制台输出5次HelloWorld
//for循环实现
/*
for(int x=1; x<=5; x++) {
System.out.println("HelloWorld");
}
System.out.println("--------------");
*/
//while循环实现
int x = 1;
while (x <= 5) {
System.out.println("HelloWorld");
x++;
}
}
}
案例代码七 流程语句-循环结构-while循环练习 1-100求和
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* 需求:求1-100之间的数据和。
*/
public void OperatorDemo7() {
//for循环实现
/*
//定义求和变量
int sum = 0;
for(int x=1; x<=100; x++) {
//累加即可
sum += x;
}
//输出结果
System.out.println("sum:"+sum);
*/
//while循环实现
//定义求和变量
int sum = 0;
int x = 1;
while (x <= 100) {
//累加即可
sum += x;
x++;
}
//输出结果
System.out.println("sum:" + sum);
}
}
执行流程:
循环结构 do while语句格式:
//基本格式
do {
循环体语句;
}while(判断条件语句);
//扩展格式
初始化语句;
do {
循环体语句;
控制条件语句;
} while(判断条件语句);
//实例
do {
System.out.println("HelloWorld");
x++;
}while(x<=5);
案例代码八 流程语句-循环结构-do while
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* do...while循环语句的格式:
* do {
* 循环体语句;
* }while(判断条件语句);
*
* 完整格式:
* 初始化语句;
* do {
* 循环体语句;
* 控制条件语句;
* }while(判断条件语句);
*
* 执行流程:
* A:执行初始化语句
* B:执行循环体语句
* C:执行控制条件语句
* D:执行判断条件语句,看是true还是false
* 如果是false,就结束循环
* 如果是true,就回到B继续
*
* 练习:求和案例,水仙花案例
*/
public void OperatorDemo8() {
//在控制台输出5次HelloWorld案例
/*
for(int x=1; x<=5; x++) {
System.out.println("HelloWorld");
}
*/
int x = 1;
do {
System.out.println("HelloWorld");
x++;
} while (x <= 5);
}
}
int a = 1;
while (true) {
System.out.println(a++);
}
int a = 1;
for (; ; ) {
System.out.println(a--);
}
增强型for循环定义如下:
for(ElementType element: arrayName){};
上述for循环可被读为:for each element in arrayName do {...}
相对于for(;;)而言 增强for循环有两个好处:
1.写起来简单
2.遍历集合、容器简单
//实例
for (int i : arr) {
System.out.println(i);
}
案例代码九 流程语句-循环结构-嵌套循环 4行5列的星星(*)图案
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* 需求:请输出一个4行5列的星星(*)图案。
* 结果:
* *****
* *****
* *****
* *****
*
* 循环嵌套:就是循环体语句本身是一个循环语句。
*
* 结论:
* 外循环控制的是行,内循环控制的是列
*/
public void OperatorDemo9() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
//* * * * *
System.out.print("* ");
}
//换行
System.out.println();
}
/*
* * * * *
* * * * *
* * * * *
* * * * *
*/
}
}
案例代码十 流程语句-循环结构-嵌套循环 正三角形
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* 需求:请输出如下图形
* *
* **
* ***
* ****
* *****
*/
public void OperatorDemo10() {
for (int i = 0; i < 6; i++) {
for (int j = 0; j < i; j++) {
//每次内循环打印i个*
System.out.print("* ");
}
//换行
System.out.println();
}
/*
*
* *
* * *
* * * *
* * * * *
*/
}
}
案例代码十一 流程语句-循环结构-嵌套循环 九九乘法表
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* 需求:在控制台打印九九乘法表
*
* \t:转移字符,表示一个tab键的位置
*/
public void OperatorDemo11() {
for (int i = 0; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i + "*" + j + "=" + i * j + "\t");
}
//换行
System.out.println();
}
/*
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
*/
}
}
//实例
switch (weekDay) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
default:
System.out.println("其他");
break;
}
//case穿透写法
switch (weekDay) {
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("工作日");
break;
case 6:
case 7:
System.out.println("休息日");
break;
default:
System.out.println("日期错误");
break;
}
//实例 乘法表 1-9 不要5
for (int i = 0; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i + "*" + j + "=" + i * j + "\t");
}
if (i==5){
break;
}
//换行
System.out.println();
}
/*
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
*/
wc:
for (int i = 1; i <= 3; i++) {
nc:
for (int j = 1; j <= 3; j++) {
if (j == 3) {
break wc;
}
System.out.print("*");
}
System.out.println();
}
案例代码十二 流程语句-循环结构-跳转控制语句break
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* break:中断的意思
*
* 使用场景:
* A:switch语句中,用于结束switch语句
* B:循环语句中,用于结束循环
* 如何使用:
* A:跳出单层循环
* B:跳出多层循环
* 用带标签的语句格式。
*/
public void OperatorDemo12() {
//break可以用于结束当前的循环。
for (int x = 1; x <= 5; x++) {
if (x == 3) {
break;
}
System.out.println("HelloWorld");
}
/*
HelloWorld
HelloWorld
*/
System.out.println("-----------------------");
//如果是多层循环,break到底结束的是哪个循环呢?
//break结束的是离他最近的那个循环
//如果我要跳出外层循环,可不可以呢?
//可以。如何实现呢?
//带标签的语句:
//格式:标签名:语句
wc:
for (int i = 1; i <= 3; i++) {
nc:
for (int j = 1; j <= 3; j++) {
if (j == 3) {
break wc;
}
System.out.print("*");
}
System.out.println();
}
/*
**
*/
}
}
案例代码十三 流程语句-循环结构-跳转控制语句continue
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* continue:继续的意思
*
* 使用场景:
* 循环中。离开使用场景是没有意义的。
*
* break和continue的区别:
* break:跳出整个循环
* continue:跳出这一次的操作,进入下一次的执行
*/
public void OperatorDemo13() {
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue;
}
/*
HelloWorld1
HelloWorld2
HelloWorld4
HelloWorld5
*/
System.out.println("HelloWorld" + i);
}
}
}
案例代码十四 java.lang.Math.Random
package com.itheima;
import org.junit.Test;
public class day03 {
@Test
/**
* Random:java.lang.Math.Random;
* 不需要导包
*/
public void OperatorDemo14() {
for (int i = 0; i < 5; i++) {
/*
0.6786675846878583
0.36699904452209553
0.9194537891343871
0.7271913829671783
0.4315928699154187
*/
System.out.println(Math.random());
}
}
}
作用:生成伪随机数
使用的是48-bit的种子,然后调用一个linear congruential formula线性同余 (和P1、7.6 数学证明 【反码、补码、同余、取模】是同一概念) 方程(Donald Knuth的编程艺术的3.2.1节)。如果两个Random实例使用相同的种子,并且调用同样的函数,那么生成的sequence是相同的
方法摘要
生成下一个伪随机数。
protected int next(int bits)
返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的boolean值。
boolean nextBoolean()
生成随机字节并将其置于用户提供的 byte 数组中。
void nextBytes(byte[] bytes)
返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布的 double值。
double nextDouble()
返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布float值。
float nextFloat()
返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的double值,其平均值是0.0标准差是1.0。
double nextGaussian()
返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
int nextInt()
返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不包括)之间均匀分布的int值。
int nextInt(int n)
返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
long nextLong()
使用单个 long 种子设置此随机数生成器的种子。
void setSeed(long seed)
范围
案例代码十五 java.util.Random
package com.itheima;
import org.junit.Test;
import java.util.Random;
public class day03 {
@Test
/**
* Random:用于产生随机数的类。用法和Scanner类似。
*
* 使用步骤:
* A:导包
* import java.util.Random;
* B:创建对象
* Random r = new Random();
* C:获取随机数(有参构造)
* int number = r.nextInt(10);
* 获取的范围:[0,10) 包括0,不包括10
*/
public void OperatorDemo15() {
//创建对象
Random r = new Random();
for (int x = 1; x <= 10; x++) {
//获取随机数
int number = r.nextInt();
/*
number:167800495
number:-1793232755
number:1616292626
number:2039967788
number:-204215836
number:2083858793
number:-1415376024
number:-1291646196
number:1152449652
number:733253850
*/
System.out.println("number:" + number);
}
System.out.println("--------------");
for (int x = 1; x <= 10; x++) {
//获取随机数
int number1 = r.nextInt(10);
/*
number1:7
number1:6
number1:7
number1:8
number1:7
number1:8
number1:4
number1:6
number1:5
number1:3
*/
System.out.println("number1:" + number1);
}
System.out.println("--------------");
//如何获取一个1-100之间的随机数呢?
int i = r.nextInt(100) + 1;
/*
76
*/
System.out.println(i);
}
}
案例代码十六 java.util.Random原理
package com.itheima;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Random;
public class day03 {
@Test
public void OperatorDemo16() {
// 案例1
System.out.println("=========案例1=========");
// 对于种子相同的Random对象,生成的随机数序列是一样的。
Random ran1 = new Random(10);
System.out.println("【使用种子为10的Random对象生成[0,10)内随机整数序列:】 ");
for (int i = 0; i < 10; i++) {
System.out.print(ran1.nextInt(10) + " ");
}
System.out.println();
Random ran2 = new Random(10);
System.out.println("【使用另一个种子为10的Random对象生成[0,10)内随机整数序列: 】");
for (int i = 0; i < 10; i++) {
System.out.print(ran2.nextInt(10) + " ");
}
// 输出结果为:
//
//=========案例1=========
// 【使用种子为10的Random对象生成[0,10)内随机整数序列:】
// 3 0 3 0 6 6 7 8 1 4
// 【使用另一个种子为10的Random对象生成[0,10)内随机整数序列: 】
// 3 0 3 0 6 6 7 8 1 4
// 案例2
System.out.println();
System.out.println();
System.out.println("=========案例2=========");
// 在没带参数构造函数生成的Random对象的种子缺省是当前系统时间的毫秒数。
Random r3 = new Random();
System.out.println("【使用种子缺省是当前系统时间的毫秒数的Random对象生成[0,10)内随机整数序列】");
for (int i = 0; i < 10; i++) {
System.out.print(r3.nextInt(10) + " ");
}
// 输出结果为:
//
// =========案例2=========
// 【使用种子缺省是当前系统时间的毫秒数的Random对象生成[0,10)内随机整数序列】
// 3 7 2 0 6 0 8 9 5 9
System.out.println();
System.out.println();
System.out.println("=========案例3=========");
// 另外,直接使用Random无法避免生成重复的数字,如果需要生成不重复的随机数序列,需要借助数组和集合类
ArrayList list = new day03().getDiffNO(15);
System.out.println("产生的n个不同的随机数:" + list);
//=========案例3=========
//产生的n个不同的随机数:[13, 12, 8, 7, 11, 9, 0, 2, 4, 3, 10, 1, 14, 6, 5]
}
/**
* 方法:生成n个不同的随机数,且随机数区间为[0,10)
* @param n
* @return
*/
public ArrayList getDiffNO(int n) {
// 生成 [0-n) 个不重复的随机数
// list 用来保存这些随机数
ArrayList list = new ArrayList();
Random rand = new Random();
boolean[] bool = new boolean[n];
int num = 0;
for (int i = 0; i < n; i++) {
do {
// 如果产生的数相同继续循环
num = rand.nextInt(n);
} while (bool[num]);
bool[num] = true;
list.add(num);
}
return list;
}
}
解密随机数生成器(1)——真随机数生成器
解密随机数生成器(2)——从java源码看线性同余算法
21/01/27
M