六. 输入与输出
6.1 读取输入
在程序最开始添上 import java.util.* (Scanner类定义在util包中)
要通过控制台进行输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in关联
然后,使用Scanner类的各种方法实现输入操作
importjava.util.*;
publicclassInputTest
{
publicstaticvoidmain(String[] args)
{
Scannerin=newScanner(System.in);
// get first input
System.out.println("What is your name?");
Stringname=in.nextLine();
// get second input
System.out.println("How old are you?");
intage=in.nextInt();
//display output on console
System.out.println("Hello,"+name+".next year,you will be "+ (age+1));
}
}
6.3 格式化输出
System.out.println();
沿用了C语言库函数中的printf方法,System.out.printf();
使用静态的String.format方法创建一个人格式化的字符串,不输出
6.4 文件的输入与输出
想要对文件进行读取,就需要一个用File对象构造一个Scanner对象
Scannerin=newScanner(Path.get("myfile.txt"));
如果文件名包含反斜杠,需要在每个反斜杠之前再加一个反斜杠
想要写入文件,就需要构造一个PrintWriter对象。在构造器中,只需要提供文件名
PrintWriterout=newPrintWriter("myfile.txt");
如果用一个不存在的文件构造一个Scanner,或者用一个不能被创建的文件名构造一个PrintWriter,那么就会发生异常
这异常比除0更严重
若知道有可能出现这种情况,可以在main方法中用thows子句标记
publicstaticvoidmain(String[] args) throwsFileNotFoundException
{
Scannerin=newScanner(Path.get("myfile.txt"));
...
}
七. 控制流程
7.1 块作用域
块是指由一对花括号括起来的若干条java语句
不能在嵌套的两个块中声明同名的变量
7.2 条件语句
if…else if…else
7.3 循环
while
do…while
for
在for语句内部定义一个变量,这个变量就不能在循环体之外使用
7.4 多重选择:switch语句
我们在程序中基本不适用switch语句
7.5 中断控制流程语句
尽管java的设计者保留了goto,但实际上并没有打算在语言中使用它
不带标签的break
while(years<=100)
{
balance+=payment;
doubleinterest=balance*interestRate/100;
balance+=interest;
if(balance>=goal) break;
years++;
}
代标签的break。(标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号)
Scannerin=newScanner(System.in);
intn;
read_data; // 标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号
while(...)
{
for(...)
{
System.out.println("Enter a number >= 0:");
n=in.nextInt();
if(n<0)
breakread_data;
...
}
}
continue语句:将中断正常的控制流程。将控制转移到最内层循环的首部。
Scannerin=newScanner(System.in);
while(sun<goal)
{
System.out.print("Enter a number:");
n=in.nextInt();
if(n<0) continue; // continue语句越过当前循环体的剩余部分,立刻跳到循环首部
sum+=n;
}
7.6 大数值
BigInteger,BigDecimal可以处理包含任意长度数字序列的数值
BigInteger实现任意精度的整数运算
BigDecimal实现任意精度的浮点运算
使用静态的valueOf方法可以将普通的数值转换为大数值
BigIntegera=BigInteger.valueOf(100);
使用add,subtract,multiply,divide,mod实现“加”,”减”,“乘”,”除“,”余数“
BigIntegerc=a.add(b); // c = a + b
BigIntegerd=c.multiply(b.add(BigInteger.valueOf(2))); // d = c * (b + 2)
int compareTo(BigInteger other):与other相等返回0;大于返回正数;小于返回负数
八.数组
8.1 创建数组
int[] a; // 只是声明了变量a,并没有初始化为真正的数组
int[] a=newint[100]; // 创建了一个可以存储100个整数的数组
数字数组,所有元素都初始化为0
boolean数组,所有元素都初始化为false
对象数组,所有元素都初始化为null
一旦创建了数组,就不能再改变它的大小
若要经常扩展,则使用数组列表
8.2 for each循环
格式:for(int element: a) statement;
for(intelement : a)
system.out.println(element);
8.3 数组初始化以及匿名数组
初始化:
int[] smallPrimes= {2,3,5};
匿名数组
newint[] {2,3,5};
重新初始化一个已经声明的数组
smallPrimes=newint[] {1,1,1};
8.4 数组拷贝
允许将一个数组变量拷贝给另一个数组变量,两个变量将引用同一个数组(数组地址相同)
若向拷贝到一个新的数组中,使用copyTo方法
int[] copiedLuckyNumbers=Arrays.copyOf(luckyNumbers,luckyNumbers,length);
可以用此方法增加数组长度(如果是数值型的,多余位置赋值为0)
luckyNumbers=Arrays.copyOf(luckyNumbers,2*luckyNumbers.length);
8.5 命令行参数
8.6 数组排序
可以使用sort方法(使用快排)
Math.random方法随机返回0到1之间的浮点数(包含0,不包含1)
intr= (int) (Math.random() *n);
8.7 多维数组
形式与一维数组相同,多了“[]”
想要快速打印多维数组,可以调用System.out.println(Arrays.deepToString(a));
(形式为:[ [ ] , [ ] ,[ ] ] )
8.8 不规则数组
数组每一行都有不同的长度
创建:
首先需要分配一个具有所含行数的数组
分配这些行
int[][] odds=newint[MAX+1][];
for(intn=0;n<odds.length;n++)
odds[n] =newint[n+1];