- 不可变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<InfiniteRecursion> v = new ArrayList<InfiniteRecursion>(); for(int i = 0; i < 10; i++) { v.add(new InfiniteRecursion()); } System.out.println(v); } }
- String上的操作
- 格式化输出
System.out.format()
<span style="font-weight: normal;">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()是等价的</span>
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位) 整数:无法应用,否则触发异常 |
<span style="font-weight: normal;">//: 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(); } }</span>Formatter转换
对于boolean基本类型或Boolean对象,转换结果是对应的true或flase。
对于其他类型的参数,只要该参数不为null,那转换的结果永远都是true,即使是数字0。
- 正则表达式
- 扫描输入