阅读笔记[1] ——《Think In Java》 Chapter 13
- javap –c 可以用来进行反编译,其中 –c 标志表示将生成JVM字节码
- 关于 String 对象重载的“+”“+=”操作符,在内部实际引入了 StringBuilder
- 优化: 把多次出现的String 的“+”“+=”运算符更改为StringBuilder的append,切勿出现如下情况:append(a+”:”+c)
- 无意识的递归:重点在于对对象 (this) 的装换为 String 类型的时候,其实就是调用的该类的 toString 方法。所以又在其 toString 方法中进行类型转换会造成无穷的递归,如果想要这么做可以调用 Object 的 toString ,即使用 super.toString()
- Java.util.Formatter 用于处理所有新的格式化功能,可以把其看做是一个翻译器,其构造方法需要一些信息,告诉它最终的结果将在哪里输出
- String.format() 可以生成格式化的 String 对象
- 进制转换的一些内部方法:
Integer.toBinaryString(17); //十进制转换为二进制
Integer.toHexString(17); //十进制转换为十六进制
Integer.toOctalString(17); //十进制转换为八进制
Integer.valueOf("11", 2); //二进制转换为十进制,其中“11”为原数,2表示二进制
正则表达式
- 在 Java 中需要先将 \ 转义,\\ 表示要插入一个正则表达式的反斜线,如果想要插入普通的反斜线,则应该为 \\\\
- 括号有着将表达式分组的效果,而竖直线 | 则表示或运算
- Split() 和 replace() 方法可以直接使用正则表达式,前者功能是“将字符串从正则表达式匹配的地方切开”,后者功能是“将匹配的地方替换”
- 字符集、边界匹配符等(应该将JDK文档中java.util.regex.Pattern那一页加入浏览器的书签中)
- 量词,描述了一个模式吸收输入文本的方式:[1] 贪婪型 [2] 勉强型 [3]占有型(这里有问题,不太清楚这三种模式的区别)
- 组(Groups),可以根据组的编号来引用某个组。例如:A(B(C))D 其中有三组,组0 为ABCD、组1 为BC、组2 为C 。有关组的几个方法:public int groupCount()、public String group()、public int end(int group)、public int start(int group) 这些都是 Mather 对象的方法
- 附:find() lookingAt() matches() 三者的区别
i. find() 可以在输入的任何位置定位正则表达式;
ii. lookingAt() 和 matches() 只有在正则表达式和输入的最开始处匹配才会成功,且matches() 需要输入的全部匹配正则表达式的时候才会成功,而lookingAt()只需要第一部分匹配成功就可以;
- 附:find() lookingAt() matches() 三者的区别
Pattern 标记,使用 Pattern.compile(String regex,int flag) 可以接受一个标记参数,以调整匹配的行为。
编译标记 效果 Pattern.CASE_INSENSITIVE(?i) 开启基于Unicode的大小写不敏感的匹配 Pattern.MULTILINE(?m) ^和$为匹配一行的开始和结束,默认为完整字符串的开始和结束 Pattern.COMMENTS(?x) 空格符被忽略,并且以#开始的该行注释也被忽略 Pattern.DOTALL(?x) . 可以匹配所有的字符包括行终结符,默认不包括行终结符 Matcher中的一些使用方法:
- Split() 同 String 的,但其可以带第二个参数用来确定分割后字符串的数量,即只分割前几个;
- appendReplacement(StringBuffer sbuf,String replacement) 执行渐进式的替换,将一次替换的结果保存在sbuf 中。appendTail(StringBuffer sbuf) 是在上面方法执行一次或多次后,将输入字符串的余下的部分复制到 sbuf 中;
- reset() 重新设置到当前字符序列的起始位置,reset(String str) 匹配 str ;
正则表达式的使用
- [1] 利用 static Pattern.compile() 方法来编译正则表达式,其中正则表达式以 String 形式作为该方法的参数,最终产生该正则表达式的一个 Pattern 对象
- [2] 把想要检索的字符串传入 Pattern 对象的 matcher() 方法,结果会产生一个 Matcher 对象
- [3] 利用产生的 Matcher 对象,可以对利用其 find() 方法获取结果,该对象有许多方法可以使用
- [4] [补充] matcher() 方法接受 CharSequence 类型的参数。 CharSequence 是一个接口,它是从 CharBuffer 、String 、StringBuilder 、StringBuffer 类之中抽象出来的字符序列的一般化定义
- Scanner 有一个假设,在输入结束时会抛出 IOException ,所以 Scanner 会把IOException 吞掉,不过可以通过调用 IoException() 方法可以查找最近发生的异常
- Scanner 定界符可以使用正则表达式,Scanner.useDelimiter(“\\s*,\\s*”)。还可以通过 delimiter() 方法来返回当前正在作为定界符使用的 Pattern 对象
- Scanner 中 next(String pattern) 方法配合指定的正则表达式使用时,将找到下一个匹配该模式的输入部分,再调用 match() 方法就可以获得匹配的结果。注意:此处的正则表达式切勿包含定界符(上述)