(1)String类的API概述是这样的:String类代表字符串,Java程序中的所有字符串字面值都作为此类的实例体现。字符串是常量,它们的值在创建之后不能更改。可见,String是对象且为不可变对象,一旦被创建,就不能被改变,对于已经存在的String类的对象的更改都是在常量池中重新创建一个对象,将这个新地址覆盖原来的地址值,原来的就变成垃圾了。

以下面这段代码为例

当声明一个str对象时,由于常量池中没有“baiyun”,所以自动在常量池中创建了"baiyun",然后把地址值给str,之后对str进行更改,继续执行前面的操作,在常量池中创建"heitu",然后把这个新的地址值给了str,同时原来的指向就断了,即"baiyun"就变成垃圾被java垃圾回收系统回收,最后执行输出语句输出的也是"heitu"。

(2)StringBuffer类API概述:线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可见StringBuffer是一个可变对象,当对它进行修改时不会像String那样重新创建对象,它只能通过构造函数来建立对象,当对象建立后,在内存中分配空间,空参构造StringBuffer()构造一个不带字符的字符串缓冲区,其初始容量为16个字符。可以通过append方法向StringBuffer中赋值。

  StringBuffer sb = new StringBuffer().append("baiyun").append("duoduo");
  System.out.println(sb.toString());

(3)在运行速度上,这三个类的快慢为:StringBuilder>StringBuffer>String

以下面的代码为例

        String str = "baiyun";
System.out.println(str);
str = str + "duoduo";
System.out.println(str);

执行这段代码先输出"baiyun",然后输出"baiyunduoduo",看起来对象被更改了,其实代码是这样执行的,首先创建一个String对象str,并把"baiyun"赋给str,然后在第三行中,其实JVM又创建了一个新的对象同样名为str,而原来的str就被java垃圾回收机制回收了,实际上str并没有被更改。因此,java对String对象进行的操作是一个不断创建新对象并将就对象回收的过程,所以执行速度很慢。

而同样执行这段代码,用StringBuffer类和StringBuilder类的方法来执行可以是这样的:

StringBuffer sb1 = new StringBuffer().append("baiyun").append("duoduo");
System.out.println(sb1.toString());
StringBuilder sb2 = new StringBuilder().append("baiyun").append("duoduo");
System.out.println(sb2.toString());
 

因为StringBuffer和StringBuilder的类对象是变量,对变量进行操作就是直接对变量进行更改,不需要进行创建新对象和回收旧对象的操作,所以运行速度比String快很多。

内存图如下:当创建一个StringBuffer对象sb1时,系统在堆内存中分配一个内存空间,空参构造StringBuffer()构造一个不带字符的字符串缓冲区,通过append()方法向里添加字符并拼接,最后由toString()方法转成字符串打印输出。

(4)线程安全。

在线程安全上,StringBuffer是线程安全的,StringBuilder是线程不安全的。举个例子StringBuffer好比火车上的厕所,进去之后只能容纳一个人,门从里面反锁,外面的人进不去只能z在外面排队等候,故StringBuffer是线程安全的,同时StringBuffer效率也低。反之,虽然StringBuilder线程不安全但是效率高。

(5)总结:

String适用于少量字符串进行操作的情况。

StringBuffer适用于单线程在字符串缓冲区进行大量操作的情况。

StringBuilder适用于多线程在字符串缓冲区进行大量操作的情况。

String,StringBuffer和StringBuilder的区别的更多相关文章

  1. String,StringBuffer与StringBuilder的区别??

    转自http://blog.csdn.net/rmn190/article/details/1492013 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBu ...

  2. JAVA String,StringBuffer与StringBuilder的区别??

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  3. 转 String,StringBuffer与StringBuilder的区别??

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  4. String,StringBuffer与StringBuilder的区别??[转]

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  5. 【Java】String,StringBuffer与StringBuilder的区别??

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  6. String,StringBuffer与StringBuilder的区别?? 缓存

    转: String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主 ...

  7. 《转》String,StringBuffer与StringBuilder的区别??

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  8. (转)String,StringBuffer与StringBuilder的区别??

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  9. String,StringBuffer与StringBuilder的区别与选择

    三者的区别 String:不可变类,一旦一个对象被建立的时候,包含在这个对象中的字符串序列是不可变的,直到这个对象被销毁.StringBuffer:可变字符序列的字符串.当其对象被创建的时候,可以用a ...

随机推荐

  1. js & replaceAll & Regex

    js & replaceAll & Regex let multi_images = "hsjyimg hsjyimg hsjyimg hsjyimg hsjyimg hsj ...

  2. c#public、private、protected、internal、protected internal

    public 公有访问.不受任何限制.private 私有访问.只限于本类成员访问,子类,实例都不能访问.protected 保护访问.只限于本类和子类访问,实例不能访问.internal 内部访问. ...

  3. [代码]--GridControl使用技巧总结,更新中...

    1如何禁用GridControl中单击列弹出右键菜单 设置Run Design->OptionsMenu->EnableColumnMenu 设置为:false 2如何定位到第一条数据/记 ...

  4. 使用 Sixel 图形格式在终端中显示缩略图

    不久前,我们讨论了 Fim,这是一个轻量级的命令行图像查看器应用程序,用于从命令行显示各种类型的图像,如 bmp.gif.jpeg 和 png 等.今天,我偶然发现了一个名为 lsix的类似工具.它类 ...

  5. 【BZOJ1967】[AHOI2005]穿越磁场(最短路)

    [BZOJ1967][AHOI2005]穿越磁场(最短路) 题面 BZOJ 洛谷 题解 一个显然的思路是这样的,我们的正方形的边长把整个平面割成了若干块,显然每个联通块都可以看着做一个点,那么接下来只 ...

  6. 解题:SHOI 2006 有色图

    题面 本质上是在对边求置换,然后每个循环里涂一样的颜色,但是还是要点上入手,考虑每条边的两个端点是否在一个循环里 如果在一个循环里,那么当循环长度$len$为奇数时只有转一整圈才行,而边的总数是$\f ...

  7. 洛谷P3241 开店

    题意:紫妹和幽香是17岁的少女,喜欢可爱的东西. 给定一棵树,有点权,边权.每次求所有权值在[l, r]范围内的点到点x的距离和.强制在线. 解:动态点分治怎么搞啊...... 一开始想的是权值的限制 ...

  8. virtualenv和virtualenvwrapper介绍和使用

    virtualen介绍 virtualenv优点: 工具可以创建隔离的Python环境 . 环境升级不影响其他应用,也不会影响全局的python环境 它可以防止系统中出现包管理混乱和版本的冲突 vir ...

  9. sublime代码对齐

    来源于:Sublime 自动缩进怎么设置? - 郭缔的回答 - 知乎 https://www.zhihu.com/question/22987174/answer/90874465 { "k ...

  10. 流媒体技术学习笔记之(七)进阶教程OBS参数与清晰度流畅度的关系

    源码地址:https://github.com/Tinywan/PHP_Experience 很多主播问过OBS的参数到底什么影响画质,到底什么影响流畅度,那么本篇教程尽量用通俗的语言解释下一些重要参 ...