写点什么

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

发布于: 2021 年 06 月 10 日
☕️【Java技术之旅】带你实战使用String的功能特性

前提回顾

java.lang.String 类用于描述字符串,Java 程序中所有的字符串字面值都可以使用该类的对象加以描 述,如:"abc"。


  • 该类由 final 关键字修饰,表示该类不能被继承

  • 从 jdk1.9 开始该类的底层不使用 char[]来存储数据,而是改成 byte[]加上编码标记,从而节约了一 些空间

  • 该类描述的字符串内容是个常量不可更改,因此可以被共享使用

  • 如: String str1 = “abc”; 其中"abc"这个字符串是个常量不可改变。

  • str1 = “123”; 将“123”字符串的地址赋值给变量 str1。 改变 str1 的指向并没有改变指向的内容 ,"abc"如果没有被引用,会被垃圾回收机制回收。


 public static void main(String[] args) {                String s1="abc";                String s2="abc";                System.out.println(s1==s2); //true 比较地址 abc存在常量池 }
复制代码


常量池概念

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

常用的构造方法

方法代码案例

public static void main(String[] args) { //下面代码会创建几个对象,分别存放在哪里 String s1 = "abc";  // 1个对象 存在常量池 String s2 = new String("abc");  //2个对象  "abc"在常量池  new的对象在堆区(堆区存abc的副本) s2指向堆区 String s3="hello"; String s4="hello"; String s5=new String("hello"); String s6=new String("hello"); System.out.println(s3==s4);         //true System.out.println(s3.equals(s4));  //true System.out.println(s5==s6);         //false System.out.println(s5.equals(s6));  //true System.out.println(s3==s5);         //false System.out.println(s3.equals(s5));  //true //常量有优化机制,变量没有 String a1="abcd"; String a2="ab"+"cd";       // 常量优化机制   "abcd" System.out.println(a1==a2);//比较地址true String a3="ab"; String a4=a3+"cd";          //没有优化机制,如同new一个String System.out.println(a3==a4);//比较地址 false}
复制代码

常用的成员方法



正则表达式的概念

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

正则表达式的规则

用 () 进行分组,无实际意义

正则表达式相关的方法

可变字符串类

基本概念
  • 由于 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 数组来存放所有的字符内容

发布于: 2021 年 06 月 10 日阅读数: 27
用户头像

我们始于迷惘,终于更高水平的迷惘。 2020.03.25 加入

🏆 【酷爱计算机技术、醉心开发编程、喜爱健身运动、热衷悬疑推理的”极客狂人“】 🏅 【Java技术领域,MySQL技术领域,APM全链路追踪技术及微服务、分布式方向的技术体系等】 🤝未来我们希望可以共同进步🤝

评论

发布
暂无评论
☕️【Java技术之旅】带你实战使用String的功能特性