String常见面试题
一、==的比较
1.两个字符常量==比较
True
2.等号直接创建的字符串和构造方法new出来的字符串对比
(1)s1是在字符串常量池中创建的一个地址
(2)s2根据new String中的(“abc”)栈内存创建出来的一个副本开辟出一个新的地址,然后复制给s2
这个过程相当于创建了2个地址
3.字符串拼接流程
<1>(一个变量+一个常量):+号左右两边的字符串分别在字符串常量池中开辟两个新的地址,然后调用StringBuilder的方法把两个地址拼接起来,然后通过ToString方法转换成String类型
<2>(三个常量拼接):Java中有常量优化机制,会把拼接好的常量和原有的字符串常量池对比,有的话会指向那个地址。
原来写的Java文件
字节码文件反向编译后的Java文件
因为Java在编译时有常量优化机制,所以编译过后会产生这样的效果。
二、 String类的截取方法 :
public String substring(int beginIndex) : 根据传入的索引开始做截取, 截取到字符串的末尾
public String substring(int beginIndex, int endIndex) : 根据传入的开始和结束索引, 对字符串做截取 - 包含头, 不包含尾
注意: 截取出来的内容, 是作为新的字符串返回, 别忘记找变量接收
String类的替换方法 :
public String replace(CharSequence target, CharSequence replacement)参数1 : 旧值,参数2 : 新值
String类的切割方法 :
public String[] split(String regex) : 根据传入的字符串作为规则, 切割当前字符串
建议:先正常指定切割规则,后来发现没有得到自己要的效果(遇到了通配符,就可以尝试在规则前面,加入\ \
三、StringBuilder
StringBuilder的作用:提高字符串的操作效率
StringBuilder的介绍:
1. 一个可变的字符序列
2. StringBuilder是字符串缓冲区,将其理解是容器,这个容器可以存储任意数据类型,但是只要进入到这个容器,全部变成字符串。
StringBuilder的构造方法 :
public StringBuilder() : 创建一个空白的字符串缓冲区(容器), 其初始容量为16个字符
public StringBuilder(String str) : 创建一个字符串缓冲区(容器), 容器在创建好之后, 就会带有参数的内容
StringBuilder常用成员方法 :
1. public StringBuilder append(任意类型) : 添加数据, 并返回对象自己
2. public StringBuilder reverse() : 将缓冲区中的内容, 进行反转
3. public int length() : 返回长度
4. public String toString() : 将缓冲区的内容, 以String字符串类型返回
链式编程: 调用的方法, 返回的结果是对象, 就可以继续向下调用方法
Eg:sb.append(“红色”).append(“绿色”).append(“蓝色”);或者sb.append().reverse.toString()
注意:String和StringBulider是两个类型
String和String Builder之间的相互转换
String拼接字符串内存图:
每进行一次+号,调用的是StringBuilder对象,然后StringBuilde拼接完转换为String类型,频繁创建销毁增加了开销,所以字符串拼接StringBuilder更高效
StringBuilder拼接字符串内存图:
StringBuilder与StringBuffer的区别:用法基本一致,唯一区别是StringBuilder是线程不安全的;而StringBuffer是线程安全的。