(Thinking in Java学习笔记)字符串

时间:2021-07-30 19:39:57

  • 不可变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。
  • 正则表达式
基础


  • 扫描输入