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));