String、StringBuffer、StringBuilder三者的区别

String、StringBuffer、StringBuilder这三个都可以用在字符串处理上面,但它们三究竟有什么区别呢?

先来看看String,String是final类,是不可变的对象,在进行字符串连接的时候是新建一个字符串,进行连接后,最后赋值,如果对String赋值N次,就会在内存中为新的对象分配N个新的空间,在内存中保存N个这个对象的副本,浪费系统资源。

比如:String s1 = new String(“行者”);s1 = s1 + “摩罗”;实际上String s1 = new String(“行者”);是在全局共享的字符串常量池里驻留了”行者”这个实例,然后通过new String(String)创建了一个内容与”行者”一样的实例,然后将new出来的这个实例的引用赋值给变量s1,当对s1执行加操作的时候,实际上是生成了一个新的实例:”行者摩罗”,然后将”行者摩罗”这个实例的引用又赋值给了s1,原来”行者”那个实例只要GC没有回收,它仍然存在于常量池中,并且内容还是”行者”,内容和地址都没有发生改变。

接着再看看StringBuffer,StringBuffer是线程安全的,同步的,可变的,不会生成新的对象,不会像String那样对”副本”进行操作,而是直接进行拼接,常用的方法有append()和insert()。

最后来看StringBuilder,StringBuilder是JDK1.5以后的版本才有的,1.5以前的只有String和StringBuffer。StringBuilder和StringBuffer功能一样,实际上StringBuilder提供一个与StringBuffer兼容的API,只是StringBuilder不保证同步,所以它不是线程安全的。

简单的说 StringBuilder 事先先分配内存, 如果 StringBuilder没有先定义长度,则默认分配的长度为16;当 StringBuilder字符长度小于等于16时,则StringBuilder不重新分配内存。当 StringBuilder  字符长度大于16 小于 32的时候,StringBuilder又重新分配16的2倍 ,依次类推。所以StringBuilder的内存空间不够也是要扩容的,如果分配的空间远远大于需要量,也会很浪费 资源。所以,初始化StringBuilder的时候最好根据需要设置容量,避免浪费 。

另外通过StringBuilder.Capacity可以获取StringBuilder的真实的分配的内存大小,通过StringBuilder.Length可以获取 StringBuilder字符串的长度。

最后再来看几个例子:

eg1.

                String s = "aa" + "bb";

eg2.

                StringBuilder strBuilder = new StringBuilder();
		strBuilder.append("aa");
		strBuilder.append("bb");

eg1中在内存中实际上有三个实例:"aa","bb"以及"aabb",而eg2中就不同了,他虽然也有三个实例,但分别是:"aa","bb","aabb\0..."因为strBuilder.capacity()没有指定长度,所以默认长度是16,所以"aabb"后面用12个空格填充满,而不是eg1中的直接是"aabb"。

再来看案例2:

eg3.

                String s = "";
		for (int i=0; i<10; i++) {
			s = s + String.valueOf(i);
		}

eg4.

                StringBuilder strBuilder = new StringBuilder(100);
		for (int i=0; i<10; i++) {
			strBuilder = strBuilder.append(String.valueOf(i));
		}

这里eg3生成了"0","1","2","3","4","5","6","7","8","9"以及"01","012",..."0123456789"

eg4则生成了"0","1","2","3","4","5","6","7","8","9"和"0123456789",并没有生成"01","012,","0123"这些中间产物。

总结:

1.String不可变,StringBuffer和StringBuilder可变

2.String和StringBUffer是线程安全的,StringBuilder线程不安全,因为它不同步

3.如果字符串经常变,使用StringBuilder最好,因为它不会产生”副本“,而且效率比StringBuffer高,但如果需要线程安全,就必须使用StringBuffer

尊重版权,转载请注明本文链接

欢迎关注行者摩罗微信公众号(xingzhemoluo),共同交流编程经验,扫描下方二维码即可;

时间: 2024-08-10 19:06:35

String、StringBuffer、StringBuilder三者的区别的相关文章

关于Java基础知识 String StringBuffer StringBuilder三者的区别

Java基础中String StringBuffer StringBuilder 以下介绍 相同点:String,StringBuffer,StringBuilder最终底层存储与操作的都是char数组,StringBuffer和StringBuilder都继承了AbstractStringBuilder 不同点:String:char数组是final的,不可变,修改String时实际上是new一个新String对象返回,线程安全,频繁的增删操作时不建议使用 StringBuffer:线程安全(

String StringBuffer StringBuilder 之间的区别

StringBuffer与StringBuilder的区别: StringBuffer是jdk1.0版本出来的,线程安全,效率低 StringBuilder是jdk1.5版本出来的,线程不安全,效率高 String 与StringBuffer,StringBuilder 啷两个之间的区别: String是一个不可变的字符序列 StringBuffer,StringBuilder 是可变的字符序列

String StringBuffer StringBuilder之间的区别

String:字符串常量 StringBuffer:字符串变量 StringBuilder:字符串变量 对于这句话的理解你可能会产生这样一个疑问  ,比如这段代码: 1 String s = "abcd";2 s = s + 1;3 System.out.print(s);  //abcd1 我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行代码,也就

String ,Stringbuffer,Stringbuilder有什么区别

一:string是不可变的.stringbuffer是拼接字符串线程安全的.stringbuilder线程不安全 二:stringbuffer和stringbuilder底层是char或byte(jdk9)数组,构建初始长度是16. 三:jvm会将所有的字符串缓存起来.当调用"".intern()方法就会从缓存中查,有就返回实例,没有就建缓存.jdk6是这样的.但是不推荐使用,因为他存在perngon,永久代,fullGc才可以清理.后续的版本放在了堆中,jdk8放在了元数据区. 四:

String/StringBuffer/StringBuilder基础

String类:特点: 1)字符串字面值"hello"可以看做一个字符串对象 2)字符串是常量,一旦被赋值,就不能被改变. 构造: public String() public String(byte[] bytes) public String(byte[] bytes,int index,int length):表示从该字节数组的offset索引处开始获取length个字节数结合成字符串 public String(char[] value) public String(char[

转:String StringBuffer StringBuilder区别

转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸裸的站在我们这些Java色狼面前了.嘿嘿.... 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却不是普通的类哦!!! [镜头1] String对象的创建       1.关于类对象的创建,很普通的一种方式就是利用构造器,

Java杂谈之StringBuffer----兼带String,StringBuffer,StringBuilder的区别

在Java中,用到最多的当属String类型的数据了 而这一点就要涉及String , StringBuffer , StringBuilder这三大类 下面主要来比较一下String和StringBuffer的区别,因为StringBuffer和StringBuilder 太相似,所以就不拿来比较了. 提及一下,StringBuffer和StringBuilder的区别 从安全性来说,StringBuffer更安全,StringBuffer主打线程安全 从执行效率来说,StringBuilde

String, StringBuffer, StringBuilder比较

1.见API: String是不可变的字符序列: StringBuffer是线程安全的,可变的字符序列: StringBuilder是可变的字符序列: StringBuffer与String的区别是StringBuffer是可变的(StringBuffer看做可变的String),StringBuffer中含有的字符序列和自身长度可随着方法调用而改变:StringBuffer在多线程环境中是安全的,必要的方法都是同步的,因而在某一特定实例上的所有方法就像被依次执行一样,与所有方法依次执行的结果一

Java学习笔记--String StringBuffer StringBuilder

String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cnblogs.com/YSO1983/archive/2009/12/07/1618564.html String str0 = "最正常的创建方法"; System.out.println(str0); char[] c1 = new char[3]; c1[0] = 'c'; c1[1]

String StringBuffer StringBuilder (转)

转自:http://www.iteye.com/topic/522167 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却不是普通的类哦!!! [镜头1] String对象的创建        1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world"); 问题是参数"Hello world"是什么东西,