String
java.lang.String类代表字符串,Java程序中的所有字符串文字都为此类的对象
注意:字符串的内容是不会发生改变的,它的对象在创建后不能被更改
创建String对象的两种方式:
① 直接赋值
String name = "theshy";
② new关键字
构造方法 | 说明 |
---|---|
public String() | 创建空白字符串,不含任何内容 |
public String(String original) | 根据传入的字符串,创建字符串对象 |
public String(char[] chs) | 根据字符数组,创建字符串对象 |
public String(byte[] chs) | 根据字节数组,创建字符串对象 |
内存原理图:
直接赋值:
当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。若不存在,则创建新的;若存在,则复用
手动new:
字符串比较:
“==”的比较原理:对于基本数据类型而言,比较的是数据值;对于引用数据类型而言,比较的是地址值
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出现的一个可变的操作字符串的容器,可以高效、方便地拼接字符串。在拼接的时候,可以指定间隔符号、开始符号、结束符号
字符串原理
字符串拼接的底层原理:
① 等号右边没有变量,都是字符串
② 等号右边有变量
JDK8以前:系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接。拼接后,再调用其toString方法转换为String类型,而toString方法的底层是直接new了一个字符串对象
一个加号,堆内存会产生两个对象
JDK8后:系统会预估字符串拼接之后的总长度,然后把拼接的内容都放在数组中,再把数组变成字符串,此时也是产生了一个新的字符串
无论是哪种方法,在字符串拼接且有变量参与的情况下,都会在内存中创建很多对象,从而浪费空间。
结论:如果很多字符串变量拼接,不要直接+。在底层会创建多个对象,浪费时间,浪费性能。而要使用StringBuilder或StringJoiner来进行字符串变量的拼接
StringBuilder提高效率原理:
所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存
StringBuilder扩容机制:
① 默认创建一个长度为16的字节数组
② 添加的内容长度小于16,直接存
③ 添加的内容大于16会扩容(原来的容量*2+2)
④ 如果扩容之后还不够,以实际长度为准