1. 不可变String
- String作为方法参时,接收的是一个引用的复制,并不是原来的String对象
- String对象具有只读特性,所以指向它的任何引用都不能改变它的值
2. 重载+、+=与StringBuilder
- 当对String对象使用+、+=时,编译器会自动创建一个StringBuilder对象用于字符串的拼接操作
- 使用 javap -c 类名 命令查看编译后的类文件的jvm字节码
3. 无意识的递归
例:
public class Test3 {
@Override
public String toString() {
return super.toString() + this;
}
public static void main(String[] args) {
System.out.println(new Test3());
}
}
由于+后this为非字符串类型,所以会发生强制类型转换,将this转换成String类型,因此会调用toString()方法,所以发生了递归
4. String上的操作
- 当需要改变String的内容是,String中的方法都是返回一个新的String对象,原对象没有发生改变
- 如果内容没有发生改变,为了避免额外的开销,返回的仍然是原来的对象
5. 格式化输出
-
System.out.printf()与System.out.format()
-
Formatter类
该类用来处理所有新的格式化功能(System.out.printf()与System.out.format()方法都是使用该类进行格式化输出操作的)
-
格式化说明符
语法:%[argument_index$][flags][width][.precision]conversion
argument_index:
flags:**“-”**控制对齐方向
width:控制字符的最小宽度,不够时以空格补充
.predision:控制域的最大宽度,用于String类型时用来控制输出字符的最大数量,用于浮点类型时用来控制小数部分要显示的位数
conversion:d、c、b、s、f、e、x、h、%
-
注意:对于b转换来说,它虽然对于所有类型都是合法的,但是稍有不同,对于Boolean、boolean可以正常转换成对应的true、false,对于基本类型转换结果均为true,对于对象来说只要不是null转换结果也均为true
6. 正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
1.基础
-
java中正则表达式对反斜线\的处理有些不同
普通语言中\\表示在正则表达式中插入一个普通的反斜线,而在Java中则表示插入一个正则表达式的反斜线
例如: \d 与 \\d
-
String中的split()和“替换”方法可以接受正则表达式
2. 创建正则表达式
3. 量词
-
量词描述了一个正则表达式吸收文本的方式
类型有:贪婪型、勉强型、占有型(只在java中可用)
-
CharSequence
CharSequence接口从CharBuffer、String、StringBuffer、StringBuilder中抽象出来,Java中多数正则表达式的操作都是接受的CharSequence类型的参数(如Pattern和Matcher中的一些方法);
4. Pattern和Matcher
-
Pattern常见方法
compile(String regex)、compile(String regex, int flag)、spilt()
-
Matcher常见方法
matches()、lookingAt()、find()、find(int start)、start()、stop()、groupCount()(第0组不包括在内)、group()、group(int i)、start(int group)、end(int group)、reset()、reset(CharSequence input)
-
组(groups)
组是用括号来划分的表达式、可以根据组的编号来引用某个组,相关方法在Matcher类中
-
Pattern标记
用来调整匹配的行为,在调用compile(String regex, int flag)方法时作为参数传入,可以通过或“|”操作符来组合多个标记,例如:Pattern.compile(re, Pattern.CASE_INSENSITIVE|Pattern.MULTILINE)
flag 功能 CASE_INSENSITIVE(?i) 表示正则匹配的时候忽略大小写,US-ASCII 字符下进行。可以结合 UNICODE_CASE 的标记,基于 Unicode 的大小写不敏感的匹配就可以开启了 COMMENTS(?x) 空白和 #开始直到行末的注释会被忽略掉 DOTALL(?s) 这种模式下 .
可以匹配所有字符,包括换行符,默认.
匹配除换行符以外的任意字符MULTILINE(?m) 更改 ^
和$
的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。 注意:(?m)只有在正则表达式中涉及到多行的^
和$
的匹配时,才使用 Multiline 模式。UNIX_LINES(?d) 在 .
、^
、&
的行为中只识别换行符\n
- 除了通过以传入参数的方式调整匹配行为,也可以**直接在正则表达式的开头使用(?i)、(?m)**等来调整匹配行为,如:(?i)(\S+)\s