Thinking in Java(Fourth Edition)学习笔记--string(字符串)

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

2.String可能会产生一大堆需要垃圾回收的中间对象,但是编译器会使用StringBuilde进行优化.但是编译器对于循环的优化无法做到最好,会为每一个循环生成一个StringBuilde对象,所以若使用循环,最好自己创建一个StringBuilde对象(P286).

`StringBuilder` 提供了丰富而全面的方法,包括 `insert()`、`replace()`、`substring()`,甚至还有`reverse()`,但是最常用的还是 `append()` 和 `toString()`。还有 `delete()`,上面的例子中我们用它删除最后一个逗号和空格,以便添加右括号。

3.重写toString()方法打印对象的内在地址时,如果toString()中使用this(等价于使用this,this.toString(),toString()这三种方法)进行字符串拼接("+"),则会陷入递归调用在toString()方法中调用toString()方法),因为"+ this"会使编译器试着将 `this` 转换成一个 `String`。它怎么转换呢?正是通过调用 `this` 上的 `toString()` 方法于是就发生了递归调用。

如果你真的想要打印对象的内存地址,应该调用 `Object.toString()` 方法,这才是负责此任务的方法。所以,不要使用 `this`,而是应该调用 `super.toString()` 方法。

此外:如果直接使用toString()方法(不重写)是可以正常打印的.

4.String操作见P288-289,Formatter类和格式化说明符见P290-294

5.Java SE5 也参考了 C 中的 `sprintf()` 方法,以生成格式化的 `String` 对象。`String.format()` 是一个 `static` 方法,它接受与 `Formatter.format()` 方法一样的参数,但返回一个 `String` 对象。当你只需使用一次 `format()` 方法的时候,`String.format()` 用起来很方便。

其实在 `String.format()` 内部,它也是创建了一个 `Formatter` 对象,然后将你传入的参数转给 `Formatter`。不过,与其自己做这些事情,不如使用便捷的 `String.format()` 方法,何况这样的代码更清晰易读。

6.正则表达式P295-300

  Java 对反斜线 \ 的处理方式跟其他语言不同。在其他语言中,`\\` 表示“我想要在正则表达式中插入一个普通的(字面上的)反斜线,请不要给它任何特殊的意义。”而在Java中,`\\` 的意思是“我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。”例如,如果你想表示一位数字,那么正则表达式应该是 `\\d`。如果你想插入一个普通的反斜线,应该这样写 `\\\`。不过换行符和制表符之类的东西只需要使用单反斜线:`\n\t`。

7. 用 `static Pattern.compile()` 方法来编译正则表达式,它会根据你的 `String` 类型的正则表达式生成一个 `Pattern` 对象。接下来,把你想要检索的字符串传入 `Pattern` 对象的 `matcher()` 方法。`matcher()` 方法会生成(返回一个 `Matcher` 对象,

 Pattern p = Pattern.compile("regular expression");       
 Matcher m = p.matcher("charaterSequence");

使用 `Matcher` 方法: boolean matches() ,boolean lookingAt() ,boolean find() ,boolean find(int start)...

备注:`find()` 方法像迭代器那样向前遍历输入字符串,重载的 `find(start)` 接收一个整型参数,该整数表示字符串中字符的位置,并以其作为搜索的起点。

是用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为 0 表示整个表达式,组号 1 表示被第一对括号括起来的组,以此类推。因此, 表达式A(B(C))D中有三个组:组 0 是 `ABCD`,组 1 是 `BC`,组 2 是 `C`。

`find()` 可以在输入的任意位置定位正则表达式,而 `lookingAt()` 和 `matches()` 只有在正则表达式与输入的最开始处就开始匹配时才会成功。`matches()` 只有在整个输入都匹配正则表达式时才会成功,而 `lookingAt()` 只要输入的第一部分匹配就会成功。

8.`split()`方法将输入 `String` 断开成 `String` 对象数组,断开边界由正则表达式确定

 String[] split(CharSequence input) 
 String[] split(CharSequence input, int limit)

备注:String.split()更常用

9.正则表达式在进行文本替换时特别方便

10.使用不带参数的 reset() 方法,可以将 Matcher`对象重新设置字符序列的起始位置。

11.Scanner的构造器可以接收任意类型的输入对象,包括 File、InputStream、String等,scanner.useDelimiter("正则表达式");可以用正则表达式指定自己所需的分隔符

备注:本章内容大多需要实际操作,所以需要结合运行书中实例,学习了解相应知识.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值