1、字符串的不可变的体现:
缓存:两个内容相同的字符串变量在字符串池中指向同一个字符串对象,保证修改其中一个,另一个不会改变
安全性:敏感数据存储成字符串,保证数据唯一准确性
线程安全:不可变性会自动使字符串成为线程安全的
hashCode缓存:在String类中被重写,以方便缓存,确保返回相同的值
性能:字符串池和hashCode缓存
2、JDK版本小于1.7,使用String的subString方法一定要注意避免内存泄露
JDK6调用subString方法是,会创建一个新的String对象,但这个值依然指向堆中的同一个字符数组,如果这个字符串很大一直被引用,无法被回收,
进而导致内存泄露
JDK7是通过创建一个新的字符串,避免对老字符串的引用,从而解决内存泄露的问题
3、replace(a,H):将字符串中的a替换所有H
replaceFirst(a,H):将第一个a替换成H
replaceAll(a,H)将所有a换成H
4、java中使用+对字符串的拼接,其实现原理是使用StringBuilder.append完成字符串拼接的
5、concat实现字符串拼接:首先创建一个字符数组,长度是已有字符串和待拼接字符串的长度之和,在把两个字符串的值复制到新的字符数组中,
然后使用这个数组创建一个新的Sting对象并返回
6、StingBuffer和StingBuilder(不是线程安全的)
7、StringUtils.join
8、几种字符串拼接的效率:StingBuilder<StingBuffer<concat<+<StringUtils.join
9、如果不是在循环体中进行字符串拼接,直接使用+
如果在并发场景中进行字符串拼接,使用StingBuffer代替StingBuilder
10、如果是简单的字符串拼接,直接使用+
若干在for循环中进行字符串拼接,使用StingBuffer代替StingBuilder
如果是通过一个lsit进行字符串拼接,使用StringJoiner
11、finally不会执行的几种情况:
System.exit()方法被执行
Runtime.getRuntime().halt()方法被执行
try或catch中有死循环
操作系统强制杀掉JVM进程,如执行了kill -9
其他原因导致虚拟机崩溃了
虚拟机所运行的环境挂了,如计算机电源断了
finally块即将被后台线程执行前,其他所有非后台线程都已执行完毕