字符串技术选型
在java语言中,能够表示字符串的类有String,StringBuffer,StringBuilder.
1.从 String,StringBuffer,StringBuilder中选择合适的技术,进行字符串的拼接(技术选型)
-String,StringBuffer,StringBuilder底层都是char数组
-String是不可变的字符序列 ,任何对字符串的修改操作,都会创建新的对象,所以在做字符串拼接操作的时候,效率较低,不推荐使用
-StringBuffer,StringBuilder继承了相同的父类 ,是可变的字符序列
-StringBuffer,StringBuilder底层数组默认初始化容量是16
-StringBuffer,StringBuilder在拼接的时候,如果超出了16个字符,那么需要对其进行扩容,
*扩容的新长度 原长度* 2 + 2
*扩容方式 数组拷贝 System.arraycopy();该方法前用native修饰,属于本地方法调用JNI(Java Native Invoke)
表示该方法实现的时候,底层调用了其它语言编写的dll文件(C,C++,VB)
*面试题:在使用StringBuffer或者是StringBuilder进行大数据量字符串拼接的时候,如何优化?
改变初始化容量,减少扩容次数,减少数组拷贝的次数...
-StringBuffer是线程安全的 @since JDK1.0 比较老 效率低,并发性差
-StringBuilder是非线程安全的 @since 1.5 比较新 效率高 ,并发性好
1)关于线程安全问题
-多线程
-有共享数据
-对共享数据涉及修改操作
以上条件都满足的情况下,才需要考虑线程安全的问题
栈:栈内存是线程独立的,一个线程一个栈. 结论: 局部变量是线程安全的
堆:是被多线程共享的,所以成员变量是非线程安全的
方法区:是被多线程共享的, 所以静态变量是非线程安全的
2)一旦出现线程安全问题,如何解决?
-尽量使用局部变量
-如果使用了成员变量,加synchronized修饰,让线程同步
*synchronized可以加在方法上,还可以加在代码块上,推荐加在代码块上,影响的范围小一些
-让线程访问的对象变为多例
3)让线程同步,效率低,并发性差;让对象变为多例,耗费堆内存;结论:使用局部变量的StringBuilder进行字符串的拼接