type
status
date
slug
summary
tags
category
icon
password
Property
输入和输出
输出
使用
System.out.println()
来向屏幕输出一些内容,println
是print line
的缩写,表示输出并换行。如果不想换行,可以用print()
:格式化输出
如果要把数据显示成特定的格式,就需要格式化输出。格式化输出使用
System.out.printf()
,通过占位符%?
把后面的参数格式化成指定格式:输入
和输出相比,输入要复杂得多,看一个从控制台读取一个字符串和一个整数的例子:
首先通过
import
语句导入java.util.Scanner
,然后创建Scanner
对象并传入System.in
。System.out
代表标准输出流,而System.in
代表标准输入流。直接使用System.in
读取用户输入虽然是可以的,但需要更复杂的代码,而通过Scanner
就可以简化后续的代码。有了
Scanner
对象后,要读取用户输入的字符串,使用scanner.nextLine()
,要读取用户输入的整数,使用scanner.nextInt()
。Scanner
会自动转换数据类型,因此不必手动转换。选择
if
语句
if
语句的基本语法是:当
if
语句块只有一行语句时,可以省略花括号{}:if
语句还可以编写一个else { ... }
,当条件判断为false
时,将执行else
的语句块:还可以用多个
if ... else if ...
串联。例如:前面讲过浮点数在计算机中常常无法精确表示,计算可能出现误差,需要利用差值小于某个临界值来判断:
判断引用类型相等
判断值类型的变量是否相等,可以使用
==
运算符。判断引用类型的变量时,
==
表示“引用是否相等”,或者说,是否指向同一个对象。下面的两个String类型,它们的内容是相同的,但是分别指向不同的对象,用
==
判断,结果为false
:要判断引用类型的变量内容是否相等,必须使用
equals()
方法:执行语句
s1.equals(s2)
时,如果s1
为null
,会报NullPointerException
,要避免错误可以用&&
:switch多重选择
switch
语句根据switch (表达式)
计算的结果,跳转到匹配的case
结果,然后继续执行后续语句,直到遇到break
结束执行:注意
case
语句没有花括号{}
,而且,case
语句具有“穿透性”,漏写break
将导致意想不到的结果:从匹配到
case 2
开始,后续语句将全部执行,直到遇到break
语句,因此不要忘记写break
。如果有几个
case
语句执行的是同一组语句块,可以这么写:使用
switch
语句时,只要保证有break
,case
的顺序不影响程序逻辑:switch
语句还可以匹配字符串。字符串匹配时,是比较“内容相等”:从
Java 12
开始,switch
语句升级为更简洁的表达式语法,使用类似模式匹配(Pattern Matching)的方法,保证只有一种路径会被执行,并且不需要break
语句:不要写
break
语句,因为新语法只会执行匹配的语句,没有穿透效应使用新的
switch
语法,不但不需要break
,还可以直接返回值yield
从
Java 14
开始,switch
语句正式升级为表达式,不再需要break
,并且允许使用yield
返回值。如果需要复杂的语句,也可以写很多语句,放到
{...}
里,用yield
返回一个值作为switch
语句的返回值:循环语句
while循环
while
条件循环的基本用法是:while
循环在每次循环开始前,首先判断条件是否成立。如果计算结果为true
,就把循环体内的语句执行一遍,如果计算结果为false
,那就直接跳到while
循环的末尾,继续往下执行。如果循环条件永远满足,那这个循环就变成了死循环。
如果循环条件的逻辑写得有问题,也会造成意料之外的结果:
表面上看,上面的
while
循环是一个死循环,但是,Java的int
类型有最大值,达到最大值后,再加1会变成负数,结果,意外退出了while
循环。do while循环
while
循环是先判断循环条件,再执行循环;而do while
循环则是先执行循环,再判断条件,条件满足时继续循环,条件不满足时退出:do while
循环会至少循环一次for循环
for
循环的用法是:for
循环的初始化计数器总是会被执行,并且for
循环也可能循环0次。千万不要在循环体内修改计数器!在循环体中修改计数器常常导致莫名其妙的逻辑错误
使用
for
循环时,计数器变量i
要尽量定义在for
循环中:如果变量
i
定义在for
循环外:退出
for
循环后,变量i
仍然可以被访问,这就破坏了变量应该把访问范围缩到最小的原则。for
循环还可以缺少初始化语句、循环条件和每次循环更新语句,例如:通常不推荐这样写
for each循环
for
循环经常用来遍历数组,通过计数器可以根据索引来访问数组的每个元素:但是,很多时候实际上真正想访问的是数组每个元素的值,Java提供了
for each
循环,能更简单地遍历数组:和
for
循环相比,for each
循环的变量n不再是计数器,而是直接对应到数组的每个元素。for each
循环的写法更简洁,但是,for each
循环无法指定遍历顺序,也无法获取数组的索引。除了数组外,
for each
循环能够遍历所有“可迭代”的数据类型break和continue
break
会跳出当前循环,也就是整个循环都不会执行了;continue
则是提前结束本次循环,直接继续执行下次循环。break
语句通常都是配合if
语句使用: