1、用户交互Scanner
Scanner对象
java.util.Scanner是Java5的新特性,我们可以通过Scanner类来获取用户的输入。
基本语法
Scanner s = new Scanner(System.in);//创建scanner对象
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前,我们一般需要使用hasNext()与hasNextLine()来判断是否还有输入的数据。
next()方法
- 一定要读取到有效字符后才可以结束输入。
- 对输入有效字符之前遇到的空格,next()方法会自动将其去掉。
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next()不能得到带有空格的字符串。
public static void main(String[] args){
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接收:");
//判断用户有没有输入字符串
if(scanner.hasNext()){
//使用next方式接收
String str = scanner.next();
System.out.println("输入的内容为:"+str);//输入:hello world,输出:hello
}
//凡是属于IO流的类,如果不关闭,会一直占用资源,要养成良好的习惯,用完就关掉
scanner.close();
}
nextLine()方法
- 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
- 可以获取空格。
public static void main(String[] args){
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
//判断用户有没有输入字符串
if(scanner.hasNextLine()){
//使用hasNextLine方式接收
String str = scanner.hasNextLine();
System.out.println("输入的内容为:"+str);//输入:hello world,输出:hello world
}
//凡是属于IO流的类,如果不关闭,会一直占用资源,要养成良好的习惯,用完就关掉
scanner.close();
}
补充:
-
获取更精确的数据类型
Scanner scanner = new Scanner(System.in); int i = scanner.nextInt();//获取整数 float f = scanner.nextFloat();//获取浮点数 double d = scanner.nextDouble();//获取浮点数
-
输入数字,并求其总和与平均数
public static void main(String[] args){ Scanner scanner = new Scanner(System.in); //定义变量:输入个数n、总和sum int n = 0; double sum = 0; System.out.println("请输入数字(按x可结束输入):"); //通过循环判断是否还有输入,并在里面对每一次进行求和和统计 while(scanner.hasNextDouble()){ double x = scanner.nextDouble(); n = n + 1; sum = sum + x; System.out.println("你输入了第"+n+"个数,当前总和为:"+sum); } System.out.println(n + "个数的和为:" + sum); System.out.println(n + "个数的平均值为:" + (sum/n)); //关闭对象 scanner.close(); }
2、顺序结构
Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。
顺序结构是最简单的算法结构。
语句与语句之间,框与框之间是按照从上到下的顺序进行的,它是由若干个一次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。
3、选择结构
if选择结构
if单选择结构
我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用if语句来表示。
if(布尔表达式){
//如果布尔表达式为true将执行的语句
}
if双选择结构
if(布尔表达式){
//如果布尔表达式为true将执行的语句
}else{
//如果布尔表达式为false将执行的语句
}
if多选择结构
if(布尔表达式1){
//如果布尔表达式1为true将执行的语句
}else if(布尔表达式2){
//如果布尔表达式2为true将执行的语句
}else if(布尔表达式3){
//如果布尔表达式3为true将执行的语句
}else{
//如果以上布尔表达式,都不为true时将执行该语句
}
嵌套的if结构
if(布尔表达式1){
//如果布尔表达式1为true将执行的语句
if(布尔表达式2){
//如果布尔表达式2为true将执行的语句
}else{
//如果布尔表达式2为false将执行的语句
}
}else{
//如果布尔表达式1为false将执行的语句
if(布尔表达式3){
//如果布尔表达式3为true将执行的语句
}else{
//如果布尔表达式3为false将执行的语句
}
}
switch多选择结构
多选择结构还有一个实现方式就是switch case 语句。
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
语法:
switch(expression){
case value :
//语句
break;//可选
case value :
//语句
break;//可选
//可以有任意数量的case语句
default ://可选
//语句
}
switch语句中的变量类型和注意点:
- byte、short、int或者char
- 从JavaSE7开始,switch支持字符串String类型了
字符串的本质还是数字,此处是通过hashCode来实现的 - case标签必须为字符串常量或者字面量
补充:
-
case穿透
switch语句会根据表达式的值从相匹配的case标签处开始执行,一直执行到break语句处或者是switch语句的末尾。如果没有break语句,那么就会从表达式的值相匹配的case标签处开始执行,一直执行到switch语句的末尾,这种从其中的一个case处开始,忽略后面的值的匹配,直接运行case的内容的现象就是穿透的现象。
简单点说,就是case后没有break,执行完一个case并不退出switch,而是继续下一个case。 -
使用IDEA反编译
反编译过程: java文件 — class(字节码文件)— 反编译为java文件
操作步骤:-
将需要反编译的class文件拷到目录下面,这里主要需要从文件夹的层面拷贝。
-
然后在IDEA界面双击打开即可。
补充:
- IDEA同时查看两个文件:
- IDEA同时查看两个文件:
-
4、循环结构
while循环
最基本的循环,结构如下:
while(布尔布尔表达式){
//循环内容
}
- 只要表达是为true,循环就会一直执行下。
- 我们大多数情况下,是会让循环停止下来,我们需要一个让表达式为false的方式来结束循环。
- 少部分情况下,需要让循环一直执行,比如服务器的请求响应监听等。
- 循环条件一直为true就会造成无限循环【死循环】,正常业务应该避免使用,会影响程序性能或者造成程序卡死崩溃!
- 计算1+2+3+…+100=?
public static void main(String[] args) { //计算1+2+3+...+100=? int i = 0; int sum = 0; while (i<=100){ sum = sum + i; i++; } System.out.println("1+2+3+...+100="+sum); }
- 高斯的故事
高斯有一个很出名的故事:用很短的时间计算出了小学老师布置的任务:对自然数从1到100的求和。他所使用的方法是:对50对构造成和101的数列求和(1+100,2+99,3+98……),同时得到结果:5050。这一年,高斯9岁。
do…while循环
对于while循环,如果不满足条件,则不能进入循环。但是有的时候,我们需要即使不满足条件,也至少要执行一次。
do…while循环和while循环相似,不同的是,do…while循环至少会执行一次。
do{
//代码语句
}while(布尔表达式);//不满足条件,不再执行循环
while与do…while的区别:
- while先判断后执行,do…while是先执行后判断。
- do…while总是保证循环体被至少执行一次。
public static void main(String[] args) {
//计算1+2+3+...+100=?
int i = 0;
int sum = 0;
do{
sum = sum + i;
i++;
}while (i<=100);//不满足条件,不再执行循环
System.out.println("1+2+3+...+100="+sum);
}
for循环
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。
for循环的执行次数是在执行前就确定的。语法结构如下:
for(初始化;布尔表达式;更新){
//代码语句
}
练习题:
-
计算0-100之间的奇数和与偶数和
public static void main(String[] args) { //计算0-100之间的奇数和与偶数和 //1、定义奇数和与偶数和 int oddSum = 0; int evenSum = 0; //2、循环 for (int i = 0; i <= 100; i++) { //3、判断数字奇偶 if (i % 2 != 0) {//奇数 oddSum += i; } else {//偶数 evenSum += i; } } System.out.println("奇数和为:" + oddSum);//输出:奇数和为:2500 System.out.println("偶数和为:" + evenSum);//输出:偶数和为:2550 }
-
用while或者for循环输出1-1000之间能被5整除的数,并且每行输出3个
public static void main(String[] args) { //用while或者for循环输出1-1000之间能被5整除的数,并且每行输出3个 for (int i = 1; i <= 1000; i++) { if(i%5==0){//能被5整除 System.out.print(i+"\t");//不换行输出 } if (i%(5*3))==0){ System.out.println();//换行输出 } } }
-
打印九九乘法表
public static void main(String[] args) { //打印九九乘法表 //定义两个因数a、b int a; int b; for (int i = 1; i <= 9; i++) { a = i; for (int j = 1; j <= i; j++) {//这里布尔表达式j<=i中的i,可以改成9,即j<=9,就会打印一个完整的乘法表 b = j; System.out.print(a + "*" + b + "=" + (a * b)+"\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 */ }
补充:
-
IDEA中,快捷生成一个for循环
//输入100.for,可以直接生成如下代码 for (int i = 0; i < 100; i++) { } //输入fori,可以直接生成如下代码 for (int i = 0; i < ; i++) { }
增强型for循环
主要作用:遍历数组和集合
Java5引入,主要用于数组或者集合的增强型for循环。Java增强型for循环语法格式如下:
for(声明语句:表达式){
//代码句子
}
//举例:
public static void main(String[] args) {
int[] arrs = {1,2,3,4,5};//定义一个数组
//遍历数组
for (int x:arrs) {
System.out.print(x + "\t");//输出:1 2 3 4 5
}
}
- 声明语句:
声明新的局部变量,改变量的类型必须和数组元素的类型匹配,其作用域限定在循环语句块,其值与此时数组元素的值相等。 - 表达式:
表达式是要访问的数组名,或者是返回值为数组的方法。
5、break & continue
break
在任何循环语句的主体部分,均可以用break控制循环的流程。break用于强行退出整个循环,不执行循环中剩余的语句。
continue
用在循环语句中,continue用于终止某次循环,即跳过循环体中本次尚未执行的语句,接着进行下一次是否执行循环的判定。
goto
未在Java中得到正式使用。
6、练习
问题:使用*
号,打印5行的三角形。
*
***
*****
*******
*********
-
思路1:
图形是由空格
与*
号拼起来,根据每行分成三段,第一部分为空格
,第二部分为*
,第三部分也是*
号。public static void main(String[] args) { for (int i = 1; i <= 5; i++) { for (int j = 5; j > i; j--) {//第一部分空格 System.out.print(" "); } for (int j = i; j > 0; j--) {//第二部分*号 System.out.print("*"); } for (int j = 1; j < i; j++) {//第三部分*号 System.out.print("*"); } System.out.println(); } }
-
思路2:
图形是由空格
与*
号拼起来,根据每行分成两段,第一部分为空格
,第二部分为*
号。public static void main(String[] args) { for (int i = 1; i <= 5; i++) { for (int j = 5; j > i; j--) {//第一部分空格 System.out.print(" "); } for (int j = 1; j <= (i*2 -1); j++) {//第二部分*号 System.out.print("*"); } System.out.println(); } }