(Thinking in Java学习笔记)字符串(用Markdowm写的)

不可变String

String对象是不可变的。
String类中每个看起来会修改String值得方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。
而最初的String对象则丝毫未动。

重载“+”与StringBuilder

用于String的“+”与“+=”是Java中仅有的两个重载过的操作符;
而Java并不允许程序员重载任何操作符。(C++允许)

使用“+”连接一个String对象时,编译器会自动创建一个StringBuilder对象,来构造最终的String,并为每个字符串调用一次StringBuilder的append()方法。但是进入循环语句时,每一次遇到“+”都会创建一个新的StringBuilder对象。
可以主动在代码中使用StringBuilder。

无意识的递归

在一个类的toString()方法中返回一个””字符串” + this + 其它“时会调用this的toString()方法,产生递归调用。

public class InfiniteRecursion {
    public String toString() {
        return " InfiniteRecursion" + super.toString() + "\n";
//      return " InfiniteRecursion" + this + "\n";// 会产生异常。this在这指InfiniteRecursion对象,会调用toString()方法,发生递归调用。
    }
    public static void main(String[] args) {
        ArrayList v = new ArrayList();
        for(int i = 0; i < 10; i++) {
            v.add(new InfiniteRecursion());
        }
        System.out.println(v);
    }
}

String上的操作

格式化输出

System.out.format()
system.out.println(“Row 1: [” + x + ” ” + y + “]”);
system.out.format(“Row 1: [%d %f]\n”, x, y);
system.out.printf(“Row 1: [%d %f]\n”, x, y);
//format() 与 printf()是等价的
String.format()
String.format()是一个static方法,
接受与Formatter.format()方法一样的参数,但返回一个String对象。
Formatter类
format()方法
构造时告诉Formatter对象将结果向哪里输出
格式化说明符
%[argument_index$][flags][width][.precision]conversion

argument_index$ flags width .precision
d\c\b\s\f\e\x\h 默认数据右对齐,使用”-“左对齐 一个域的最小尺寸 String:打印String时输出字符的最大数量;浮点数表示小数部分要显示出来的位数(默认6位);整数:无法应用,否则触发异常
//: strings/Receipt.java
package strings;
import java.util.*;

public class Receipt {
    private double total = 0;
    private Formatter f = new Formatter(System.out);
    public void printTitle() {
        f.format("%-15s %5s %10s\n", "Item", "Qty", "Price");
        f.format("%-15s %5s %10s\n", "----", "---", "-----");
    }
    public void print(String name, int qty, double price) {
        f.format("%-15.15s %5d %10.2f\n", name, qty, price);
        total += price;
    }
    public void printTotal() {
        f.format("%-15.15s %5s %10.2f\n", "Tax", "", total*0.06);
        f.format("%-15s %5s %10s\n", "", "", "-----");
        f.format("%-15s %5s %10.2f\n", "Total", "", total*1.06);
    }
    public static void main(String[] args) {
        Receipt receipt = new Receipt();
        receipt.printTitle();
        receipt.print("Jack's Magic Bean", 4, 4.25);
        receipt.print("Princess Peas", 3, 5.1);
        receipt.print("Three Bears Por", 1, 14.29);
        receipt.printTotal();
    }
}

Formatter转换
对于boolean基本类型或Boolean对象,转换结果是对应的true或flase。
对于其他类型的参数,只要该参数不为null,那转换的结果永远都是true,即使是数字0。
正则表达式

扫描输入

你可能感兴趣的:(Java)