String、StringBuffer、StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别、各自的原理及使用场景。 ???????请尊重作者劳动成果,转载请标明原文链接:快彩网cai票php源码https://dashengba.com 大圣源码论坛扣3266397597 一、String ???????先来看一下JDK中String中的部分源码: ????????可以看到String类、以及value都是final类型的,这样就表明String是无法被继承的,value是无法被改写的。当通过String的构造函数初始化新的String对象时,也只是根据传入的引用对象的value和hashcode进行了赋值。看下面的例子: Vew Code ???????执行javac StringTest.java后,通过javap -v StringTest.class看下生成的class文件: ????????可以看到对于相同的字符串“abc”的引用都是相同的(对于常量池中的相同位置),这样能够节省内存空间,但是缺点就是对于频繁的字符串拼接操作,会造成内存空间的浪费。(需要注意的是这种字符串的拼接操作,从JDK8 开始,会自动被编译成StringBuilder,是不是很666^_^,但还是建议不通过JDK途径去自动转。)看下面的代码: ???????然后再通过javap看下class文件: 二、StringBuilder ???????也是先来看StringBuilder的源码: ????????可以看到StringBuilder的value是个char数组,(当然从JDK9开始,value从char数组变成了byte数组)。每次append时都是通过调用native的System.arraycopy实现的(在getChars中调用的)。 三、StringBuffer S???????tringBuffer的源码如下: ????????和StringBuilder一样,都是用了char数组保存value,append也是调用了AbstractStringBuilder的append方法。区别只是在于char数组加了transient关键字,以及方法上加了synchronized方法。 ???????综上所述,String、StringBuilder、StringBuffer的使用场景如下: ???????当处理定长字符串时,建议用String; ???????当处理变长字符串时,并且是单线程环境时,建议用StringBuilder; ???????当处理变长字符串时,并且是多线程环境时,建议用StringBuffer。
原文地址:http://blog.51cto.com/13859161/2139007