Java-字符串

120 阅读3分钟

记录

日期说明
2023/1/1首次创建
2023/2/18增加String,StringBuffer,StringBuilder

总纲

关于字符串的一些概念

初始化

  1. 字面量
  2. new String
  3. intern方法

不可变性

  1. 定义:实例一旦被创建,在整个生命周期内状态都不会改变
  2. 好处:易于设计,实现和使用。并发时并不容易出错,更加安全
  3. 原因
  • 字符串池的需求,相同字面量定义的不可变量,改变了一个变量,就会使另一个变量指向错误的值
  • 缓存字符串HashCode码的需求,确保了频繁使用hashCode值的高效性
  • 出于安全性考虑,不可变保证网络连接,数据库连接的安全性
  1. 设计原则
  • 类添加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
  • 创建分析
    1. 运行期间字面常量对象存储在运行时常量池。将引用指向该字面常量对象。编译阶段会把直接相加的字符串优化,但是应用的相加不行
    2. new在堆里创建对象,指向堆。在类加载过程中,运行时常量池创建了一个“hello”对象,在代码执行过程中,创建了一个String对象
    3. final修饰,会在class文件常量池保存,会在编译期间被直接替代成真实值
    4. 比5的效率高。在编译期间会被优化为“lovejava”
    5. 不会优化,会拼接两遍

StringBuffer

  • 线程安全
    • synchronized实现
  • java中直接引入
  • 多线程隔离
  • 同步
  • 效率低

StringBuilder

  • 线程不安全
  • java5引入
  • 异步
  • 多线程可同时调用
  • 效率高

正则表达式

  1. Pattern:正则表示的编译表示
  2. Matcher:对输入字符串进行解释和匹配
  3. PatternSyntaxExceptino:正则表达式中的语法错误
  4. 合法字符串
  5. 特殊字符
  6. 预定义字符
  7. 方括号表达式
  8. 边界匹配符
  9. 数量表示符
  10. 参考

格式化方法

  1. ForMatter:语法:%[argument_index$][flags][width][precision]conversion
  2. 格式转换符
  3. 日期/时间转化符
  4. 其他
  5. 参考

细节

  1. ”+“连接字符串,底层是用StringBuilder里的append和toString实现
  2. 编译时优化:编译时会把字面量链接的结果放置于常量池,final修饰的字符串页当作字面量来使用

参考