3.6.9构建字符串
StringBuilder builder=new StringBuilder();
每次需要添加内容时,调用append方法
builder.append(ch);
builder.append(str);
字符串构建完成时,调用toString方法可以得到String对象
String completedString = builder.toString();
______________________________________________
3.7.3 文件输入与输出
要想读取一个文件,需要构造一个Scanner对象
Scanner in=new Scanner(Path.of("myfile.txt"),StandardCharsets.UTF_8);
要想写入文件,就需要构造一个PrinterWriter对象,需要提供文件名和字符编码
PrintWriter out=new PrintWriter("myfile.txt",StandardCharsets.UTF_8);
_________________________________________________
3.8.6中断控制流程
如何使用break中断多层循环
read_data:
while(...)
{
......;
for(...;...;...)
{
.....;
if(...)
{
break read_data;
}
}
}
在while循环中使用continue语句,会越过当前循环体剩余部分,立刻跳到循环首部
在for循环中使用continue语句,就可以直接跳到for循环的更新部分
Scanner in=new Scanner(System.in)
while(sum<goal)
{
System.out.print("Enter a number");
n=in.nextInt();
if(n<0)
{
continue;
}
sum+=n;//not executed if n<0
}
for(count=1;count<=100;count++)
{
System.out.print("Enter a number,-1 to quit:");
n=in.nextInt();
if(n<0)
{
continue;
}
sum+=n;//not executed if n<0
}
————————————————————————
3.9大数
java.math包中的BigInteger可实现任意精度整数运算、BigDecimal可实现任意精度的浮点数运算
对于很大的数,可以使用一个带字符串参数的构造器
BigInteger reallyBig=new BigInteger("123321321333212154532113213212313215432121213"):
不能使用传统运算符例如*和+来处理大数,需要使用大数类的add和multiply方法。java没有运算符重载的功能
BigInteger c=a.add(b);
BigInteger d=c.multiply(b.add(BigInteger.valueOf(2)))//d=c*(b+2)
——————————————————————————————————————————————
3.10数组
3.10.1声明数组
int[] a=new int[100];//or var a=new int[100];
上面的语句声明并初始化了一个可以存储100个整数的数组
int[] smallPrimes={2,3,5,7,11,12};
上面语句创建了数组对象并且提供了初始值
Stirng[] authors={
"James Gosling",
"Bill Joy",
"Guy Steele",
//最后的逗号可以保留
};
3.10.2访问数组元素
创建一个数字数组时,所有元素都初始化为0。boolean数组的元素会初始化为false。
对象数组的元素则初始化为null。
String[] names=new String[10];
会创建一个包含10个字符串的数组,所有字符串都为null
如果希望这个数组包含空串,则需要执行下面的语句
for(int i=0;i<10;i++)
{
names[i]="";
}
要想获得数组中元素的个数,可以使用array.length;
3.10.3for each循环
for(int element:a)//a为数组
{
System.out.println(element);//打印a的每一个元素
}
for each循环语句的变量将会遍历数组中的每个元素,而不是下标值
有一个打印数组所有值的更加简便的方法
System.out.println(Arrays.toString(a));
3.10.4数组拷贝
java允许将一个数组变量拷贝到另一个数组变量,这两个变量将引用同一个数组
int[] l0={1,2,3}
int[] l1=l0;
l1[2]=12;//l0[2]也会等于12
如果希望将一个数组的所有值拷贝到一个新数组中去,要使用Arrays类的copyOf方法
int[] l3=Arrays.copyOf(l1,l1.length);
3.10.5命令行参数
public class Message
{
public static void main(String[] args)
{
if(args.length==0||args[0].equals("-h"))
{
System.out.println("Hello")
}
else if(args[0].equals("-g"))
{
System.out.println("GoodBye,");
}
for(int i=1;i<args.length;i++)
{
System.out.print(" "+args[i]);
}
System.out.println("!");
}
}
如果使用java Message -g curel world
args数组将会是{-g,cruel,world}
程序将会显示 GoodBye, cruel world!
3.10.6数组排序
Arrays.sort(a)
java.util.Arrays 常用接口方法
static String toString(var[] a) 返回包含a中元素的字符串
static var[] copyOf(var[] a,int end)
static var[] copyOfRange(var[] a,int start,int end)返回与a类型相同的数组
static void sort(var[] a)使用优化的快速排序
static int binarySearch(var[] a,var v)
static int binarySearch(var[] a,int start,int end,var v)使用二分查找算法在有序数组a中查找值v
static void fill(var[] a,var v)将数组所有元素设置为v
static boolean equals(var[] a,var[] b)
3.10.7多维数组
double[][] a=new double[10][6];
double[][] a2={
{1,2,3},
{4,5,6},
{7,8,9}
};
要想使用for each循环处理二维数组,需要如下语句
for(double[] row:a2)
for(double value:row)
.......
要想快速打印一个二维数组,使用如下语句
System.out.println(Arrays.deepToString(a2));