字符串技术选型

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进行字符串的拼接

 

posted @ 2016-11-27 10:20  鹤少  阅读(184)  评论(0编辑  收藏  举报