Java编程思想—第13章 字符串

13.1 不可变String
  1. String对象是不可变的
  2. String类的每一个看起来修改String值的方法,实际都是创建了一个全新的String对象,以包含修改后的字符串内容
13.2 重载“+”与StringBuilder
  1. 重载的意思是,一个操作符在应用于特定的类时,被赋予了特殊的意义(用于String的“+”与“+=”是Java中仅有的两个重载过的操作符,而Java并不允许程序员重载任何操作符)
  2. 除非你用代码将系统实现,并让它动起来,否则你无法真正了解它会有什么问题
  3. 编译器自动引入了java.lang.StringBuilder类。虽然我们在源代码中并没有使用StringBuilder类,但是编译器自作主张地使用了它,因为它更高效
  4. StringBuilder提供了丰富而全面的方法,包括insert()、repleace()、substring()甚至reverse(),但是最常用的还是append()和toString()。还有delete()
13.3 无意识的递归
  1. 如果你真的想要打印出对象的内存地址,应该调用Object.toString()方法,这才是负责此任务的方法。所以,你不该使用this,而是应该调用 super.toString()方法
13.4 String上的操作
  1. 当需要改变字符串的内容时,String类的方法都会返回一个新的String对象。同时,如果内容没有发生改变,String的方法只是返回指向原对象的引用而已。这可以节约存储空间以及避免额外的开销
13.5 格式化输出
  1. printf()
    a. C语言中的格式化输出,占位符称为格式修饰符,他们不但说明了插入数据的位置,同时还说明了将插入什么类型的变量,以及如何对其格式化
  2. System.out.format()
    a. format()与printf()是等价的
System.out.format("Row 1 : [%d %f]\n", x, y);
System.out.printf("Row 1 : [%d %f]\n", x, y);
  1. Formatter
    a. 在Java中,所有新的格式化功能都由java.util.Formatter类处理
    b. Formatter的构造器经过重载可以接收多种输出目的地,不过最常用的还是PrintStream()、OutputStreamFile
  2. 格式化说明符
    a. 在默认的情况下,数据时右对齐,不过可以通过使用“-”标志来改变对其方向
    b. width:用来控制一个域的尺寸
    c. precision:对String类,表示打印时输出字符的最大数量;用于浮点数,小数保留位数,默认6位;不能用于整数
%[argument_index$][flags][width][.precision]conversion
  1. Formatter转换
    a. 下表包含了最常用的类型转换
    b. b转换,对于其他类型的参数,只要该参数不为null,那转换的结果就永远都是true
d         整数型(十进制)
c         Unicode字符
b         Boolean值
s         String
f         浮点数(十进制)
e         浮点数(科学计数)
x         整数(十六进制)
h         散列码(十六进制)
%         字符"%"
  1. String.format()
    a. **String.format()**是一个static方法,它接受与Formatter.format()方法一样的参数,但返回一个String对象
13.6 正则表达式
  1. 基础
    a. 在Java中,\的意思是“我要插入一个正则表达式的反斜线,所以其后的字符具有特殊意义
    b. 因为字符+在正则表达式中有特殊的意义,所以必须使用\将其转义,使之成为表达式中的一个普通字符
    c. String类还自带一个非常有用的正则表达式工具——split()方法,其功能是“将字符串从正则表达式匹配的地方切开”
\\d     表示一位数字
\\\\    普通的反斜线
\n\t    换行和制表符
+       一个或多个之前的表达式
|       表示或
()      起表达式分组作用
?       可以都没有
\W      非单词字符
\w      单词字符
public class IntegerMatch{
    public static void main(String[] args){
        System.out.println("-1234".matches("-?\\d+"));
        System.out.println("+911".matches("(-|\\+)?\\d+"));
    }
}
  1. 创建正则表达式
  2. 量词
    a. 贪婪型:量词总是贪婪的,除非有其他的选项被设置
    b. 勉强型:用问号来指定,这个量词匹配满足模式所需的最少字符数
    c. 占有型:只有在Java中能使用。当正则表达式被应用于字符串,它会产生相当多的状态,以便在匹配失败时可以回溯。“占有的”量词并不会保存这些中间状态,因此它们可以防止回溯
  3. PatternMatcher
    a. 引入java.util.regex包,然后用static Pattern.compile()方法来编译你的正则表达式即可
  4. split()方法将输入字符串断开成字符串对象数组,断开边界有正则表达式确定
  5. 替换操作
  6. reset(),可以将现有的Matcher对象应用于一个新的字符序列
    使用不带参数的reset()方法,可以将Matcher对象重新设置到当前字符序列的起始位置
  7. 正则表达式与Java I/O
13.7 扫描输入
  1. Scanner的构造器可以接受任何类型的输入对象,包括File对象、InputStreamString或者Readable对象
  2. 有了Scanner,所有的输入、分词以及翻译的操作都隐藏在不同类型的next方法中
  3. Scanner还有相应的hasNext方法,用以判断下一个输入分词是否所需的类型
Scanner stdin = new Scanner(SimpleRead.input);
String name = stdin.nextLine();

//创建Scanner接收对象
Scanner input=new Scanner(System.in);
//取出输入流中的值
int n=input.nextInt();
  1. Scanner定界符
    a. 默认情况下,Scanner根据空白字符对输入进行分词,但是你可以用正则表达式指定自己所需的定界符
public class ScannerDelimiter{
    public static void main(String[] args){
        Scanner scannerr = new Scanner("12, 42, 78, 99, 42");
        scanner.useDelimmiterr("\\s*,\\s*");
        while(scanner.hasNextInt()){
            System.out.println(scanner.nextInt());
        }
    }
}
  1. 用正则表达式扫描
13.8 StringTokenizer
  1. stringTokenizer已经废弃了
13.9 总结
  1. 到目前为止,Java对字符串操作的支持已经很完善了。不过,有时你还需要在细节上注意效率问题,例如恰当地使用StringBuilder
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值