☕️【Java 技术之旅】带你实战使用 String 的功能特性

前提回顾
java.lang.String 类用于描述字符串,Java 程序中所有的字符串字面值都可以使用该类的对象加以描 述,如:"abc"。
该类由 final 关键字修饰,表示该类不能被继承。
从 jdk1.9 开始该类的底层不使用 char[]来存储数据,而是改成 byte[]加上编码标记,从而节约了一 些空间。
该类描述的字符串内容是个常量不可更改,因此可以被共享使用。
如: String str1 = “abc”; 其中"abc"这个字符串是个常量不可改变。
str1 = “123”; 将“123”字符串的地址赋值给变量 str1。 改变 str1 的指向并没有改变指向的内容 ,"abc"如果没有被引用,会被垃圾回收机制回收。

常量池概念
String 类描述的字符串内容是常量不可改变,因此 Java 虚拟机将首次出现的字符串放入常量池中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对象,从而提高了性能(创建对象以分配内存消耗资源过大)且节省了空间。
常用的构造方法

方法代码案例
常用的成员方法


正则表达式的概念
正则表达式本质就是一个“规则字符串”,可以用于对字符串数据的格式进行验证,以及匹配、查 找、替换等操作。该字符串通常使用^运算符作为开头标志,使用 $运算符作为结尾标志,当然也可以省略。
正则表达式的规则

用 () 进行分组,无实际意义
正则表达式相关的方法

可变字符串类
基本概念
由于 String 类描述的字符串内容是个常量不可改变,当需要在 Java 代码中描述大量类似的字符串 时,只能单独申请和存储,此时会造成内存空间的浪费。
为了解决上述问题,可以使用 java.lang.StringBuilder 类和 java.lang.StringBuffer 类来描述字符序 列可以改变的字符串,如:"ab"。
StringBuffer 类是从 jdk1.0 开始存在,属于线程安全的类,因此效率比较低。
StringBuilder 类是从 jdk1.5 开始存在,属于非线程安全的类,效率比较高。
StringBuilder 类常用的构造方法

StringBuilder 类常用的成员方法

注意 作为参数传递的话,方法内部 String 不会改变其值,StringBuffer 和 StringBuilder 会改变其值。
返回值的设计
StringBuilder 的很多方法的返回值均为 StringBuilder 类型。这些方法的返回语句均为:return this。
这些方法在对 StringBuilder 所封装的字符序列进行改变后又返回了该对象的引用。基于这样设计的目的在于可以连续调用。
扩容算法源码分析
*当字符串的长度超过了字符串对象的初始容量时,该字符串对象会自动扩容,默认扩容算法是:原始容量 2+2
底层采用 byte 数组来存放所有的字符内容
版权声明: 本文为 InfoQ 作者【李浩宇/Alex】的原创文章。
原文链接:【http://xie.infoq.cn/article/707c479f7f3c39bcd94b07518】。文章转载请联系作者。
评论