概述
- 不可变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 dcbsfexh 默认数据右对齐,使用”-“左对齐 一个域的最小尺寸 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 %10sn", "Item", "Qty", "Price");
f.format("%-15s %5s %10sn", "----", "---", "-----");
}
public void print(String name, int qty, double price) {
f.format("%-15.15s %5d %10.2fn", name, qty, price);
total += price;
}
public void printTotal() {
f.format("%-15.15s %5s %10.2fn", "Tax", "", total*0.06);
f.format("%-15s %5s %10sn", "", "", "-----");
f.format("%-15s %5s %10.2fn", "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。
- 正则表达式
基础
<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>
argument_index$ | flags | width | .precision |
dcbsfexh | 默认数据右对齐,使用”-“左对齐 | 一个域的最小尺寸 | 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 %10sn", "Item", "Qty", "Price");
f.format("%-15s %5s %10sn", "----", "---", "-----");
}
public void print(String name, int qty, double price) {
f.format("%-15.15s %5d %10.2fn", name, qty, price);
total += price;
}
public void printTotal() {
f.format("%-15.15s %5s %10.2fn", "Tax", "", total*0.06);
f.format("%-15s %5s %10sn", "", "", "-----");
f.format("%-15s %5s %10.2fn", "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。
- 扫描输入
最后
以上就是紧张小蘑菇为你收集整理的(Thinking in Java学习笔记)字符串的全部内容,希望文章能够帮你解决(Thinking in Java学习笔记)字符串所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复