记录
| 日期 | 说明 |
|---|---|
| 2023/1/1 | 首次创建 |
| 2023/2/18 | 增加String,StringBuffer,StringBuilder |
总纲
关于字符串的一些概念
初始化
- 字面量
new Stringintern方法
不可变性
- 定义:实例一旦被创建,在整个生命周期内状态都不会改变
- 好处:易于设计,实现和使用。并发时并不容易出错,更加安全
- 原因
- 字符串池的需求,相同字面量定义的不可变量,改变了一个变量,就会使另一个变量指向错误的值
- 缓存字符串HashCode码的需求,确保了频繁使用hashCode值的高效性
- 出于安全性考虑,不可变保证网络连接,数据库连接的安全性
- 设计原则
- 类添加final修饰符,保证类不被继承
- 保证所有成员变量必须私有,并且加上final修饰
- 不提供改良成员变量的方法,包括setter
- 通过构造器初始化所有成员,进行深拷贝
- 在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝
String
- 实现了Serializable和Comparable接口
- 实现
- 1.8及以前使用char数组
- 1.9及以后使用byte数组
- 原因是char占2个字符,byte占1个字符,节省内存
- 不可变,任何修改都不会影响原对象
String str = "I";//1
String str2 = new String("hello")//2
final String str3 = "world"//3
str += “love” + “java“;//4
str = str + "love" + ”java“;//5
- 创建分析
- 运行期间字面常量对象存储在运行时常量池。将引用指向该字面常量对象。编译阶段会把直接相加的字符串优化,但是应用的相加不行
- new在堆里创建对象,指向堆。在类加载过程中,运行时常量池创建了一个“hello”对象,在代码执行过程中,创建了一个String对象
- final修饰,会在class文件常量池保存,会在编译期间被直接替代成真实值
- 比5的效率高。在编译期间会被优化为“lovejava”
- 不会优化,会拼接两遍
StringBuffer
- 线程安全
- synchronized实现
- java中直接引入
- 多线程隔离
- 同步
- 效率低
StringBuilder
- 线程不安全
- java5引入
- 异步
- 多线程可同时调用
- 效率高
正则表达式
- Pattern:正则表示的编译表示
- Matcher:对输入字符串进行解释和匹配
- PatternSyntaxExceptino:正则表达式中的语法错误
- 合法字符串
- 特殊字符
- 预定义字符
- 方括号表达式
- 边界匹配符
- 数量表示符
- 参考
格式化方法
- ForMatter:语法:%[argument_index$][flags][width][precision]conversion
- 格式转换符
- 日期/时间转化符
- 其他
- 参考
细节
- ”+“连接字符串,底层是用StringBuilder里的append和toString实现
- 编译时优化:编译时会把字面量链接的结果放置于常量池,final修饰的字符串页当作字面量来使用