String、StringBuffer、StringBuilder的区别?_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > String、StringBuffer、StringBuilder的区别?

String、StringBuffer、StringBuilder的区别?

 2019/4/13 12:45:22  hbxflihua  程序员俱乐部  我要评论(0)
  • 摘要:Java的基本类型有八种,三大类:字符型:char布尔型:boolean数值型:byte、short、int、long、float、double,前四种整型,后面两种浮点型Java八种基本类型的包装类和String都是Immutable类,被声明为finalclass,所有的属性也都是final的。由于String的不可变性,它的拼接、剪裁都会产生一个新的对象。由于字符串操作的普遍性,相关操作的效率往往对性能有明显的影响
  • 标签:区别

class="MsoNormal">Java的基本类型有八种,三大类:

字符型:char

布尔型:boolean

数值型:byte、short、int、long、float、double,前四种整型,后面两种浮点型

?

Java八种基本类型的包装类和String都是Immutable类,被声明为final class,所有的属性也都是final的。

由于String的不可变性,它的拼接、剪裁都会产生一个新的对象。由于字符串操作的普遍性,相关操作的效率往往对性能有明显的影响。

??

StringBuffer是为解决String因拼接而产生过多的中间对象问题而提供的一个类,可用通过StringBuffer的append、add等方法来对字符串进行操作。StringBuffer是线程安全的可修改字符串序列,它通过在方法上加上synchronized关键字来保证线程安全,但随之也带来了额外的性能开销,所以除非有线程安全的需要,否则还是推荐使用StringBuilder。

?

StringBuilder在能力上和StringBuffer没有区别,但是它去掉了线程安全的部分,有效减小了性能开销。

?

为了实现修改字符序列的目的,StringBuffer 和 StringBuilder 底层都是利用可修改的(char,JDK 9 以后是 byte)数组,二者都继承了 AbstractStringBuilder,里面包含了基本操作,区别仅在于最终的方法是否加了 synchronized。

另外,这个内部数组应该创建成多大的呢?如果太小,拼接的时候可能要重新创建足够大的数组;如果太大,又会浪费空间。目前的实现是,构建时初始字符串长度加 16(这意味着,如果没有构建对象时输入最初的字符串,那么初始值就是 16)。我们如果确定拼接会发生非常多次,而且大概是可预计的,那么就可以指定合适的大小,避免很多次扩容的开销。扩容会产生多重开销,因为要抛弃原有数组,创建新的(可以简单认为是倍数)数组,还要进行 arraycopy。

?

String在Java6提供了intern()方法来缓存字符串,由于在Java6缓存的字符串被存放在永久代里,使用不当很容易导致OOM。在后续版本中,这块缓存区域被放在了堆中,这块区域被称为字符串常量池。

?

?

这段代码在不同的java版本中运行会输出什么??

	public static void main(String[] args) {
		String s = new String("1");
		s.intern();
		String s2 = "1";
		System.out.println(s == s2);

		String s3 = new String("1") + new String("1");
		s3.intern();
		String s4 = "11";
		System.out.println(s3 == s4);
	}

?参考:深入解析String#intern

发表评论
用户名: 匿名