Bootstrap

自制笔记 | Java基础——字符串(String、StringBuilder、StringJoiner)(持续更新...)

String

java.lang.String类代表字符串,Java程序中的所有字符串文字都为此类的对象

注意:字符串的内容是不会发生改变的,它的对象在创建后不能被更改

创建String对象的两种方式:

① 直接赋值

String name = "theshy";

② new关键字

构造方法说明
public String()创建空白字符串,不含任何内容
public String(String original)根据传入的字符串,创建字符串对象
public String(char[] chs)根据字符数组,创建字符串对象
public String(byte[] chs)根据字节数组,创建字符串对象

内存原理图:

直接赋值:

String内存原理图-1

当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。若不存在,则创建新的;若存在,则复用

手动new:

String内存原理图-2

字符串比较:

“==”的比较原理:对于基本数据类型而言,比较的是数据值;对于引用数据类型而言,比较的是地址值

int a = 10;
int b = 20;
System.out.println(a == b); //false

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); //false

使用成员方法来进行比较字符串对象中的内容是否相等:

boolean eqauls(要比较的字符串) //完全一样结果才是true,否则为false
boolean equalsIgnoreCase(要比较的字符串) //忽略大小写的比较

注意:Scanner键盘录入的字符串也是使用new创建的

String常用方法:

public char charAt(int index); //根据索引返回字符
public int length(); //返回此字符串的长度
public String substring(int beginIndex, int endIndex); //截取子串,注意:包头不包尾; 只有返回值才是结果
public String substring(int beginIndex); //截取到末尾
public String replace(旧值,新值); //将旧值替换为新值,注意:只有返回值才是替换之后的结果

StringBuilder

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的

作用:提高字符串的操作效率

StringBuilder构造方法:

方法名说明
public StringBuilder()创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象

StringBuilder常用方法:

方法名说明
public StringBuilder append(任意类型)添加数据,并返回对象本身
public StringBuilder reverse()反转容器中的内容
public int length()返回长度(字符出现的个数)
public String toString可以实现把StringBuilder转换为String

StringJoiner

StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。(JDK8出现的)

作用:提高字符串的操作效率,而且代码编写特别简洁

StringJoiner构造方法:

方法名说明
public StringJoiner(间隔符号)创建一个StringJoiner对象,指定拼接时的间隔符号
public StringJoiner(间隔符号,开始符号,结束符号)创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号

StringJoiner常用成员方法:

方法名说明
public StringJoiner add(添加的内容)添加数据,并返回对象本身
public int length()返回长度(字符出现的个数)
public String toString()返回一个字符串(该字符串就是拼接之后的结果)

三种类的对比:

String:表示字符串的类,定义了很多操作字符串的方法
StringBuilder:一个可变的操作字符串的容器,可以高效地拼接字符串,还可以将容器里面的内容反转
③ StringJoiner:JDK8出现的一个可变的操作字符串的容器,可以高效、方便地拼接字符串。在拼接的时候,可以指定间隔符号、开始符号、结束符号

字符串原理

字符串拼接的底层原理:

① 等号右边没有变量,都是字符串

字符串拼接底层原理-1

② 等号右边有变量

JDK8以前:系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接。拼接后,再调用其toString方法转换为String类型,而toString方法的底层是直接new了一个字符串对象

字符串拼接底层原理-2

一个加号,堆内存会产生两个对象

JDK8后:系统会预估字符串拼接之后的总长度,然后把拼接的内容都放在数组中,再把数组变成字符串,此时也是产生了一个新的字符串

字符串拼接底层原理-3

无论是哪种方法,在字符串拼接且有变量参与的情况下,都会在内存中创建很多对象,从而浪费空间。

结论:如果很多字符串变量拼接,不要直接+。在底层会创建多个对象,浪费时间,浪费性能。而要使用StringBuilder或StringJoiner来进行字符串变量的拼接

StringBuilder提高效率原理:

所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存

StringBuilder扩容机制:

① 默认创建一个长度为16的字节数组
② 添加的内容长度小于16,直接存
③ 添加的内容大于16会扩容(原来的容量*2+2)
④ 如果扩容之后还不够,以实际长度为准

;