(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. Oracle 数据库执行 操作系统的命令

    1 Linux环境下面的处理 在sqlplus 里面 添加一个 ! 就可以执行 但是 因为Oracle 必须为非root用户 所以很多命令可能无法执行: 2. Windows 环境执行命令的方式 是在 ...

  2. [转帖]SSL/TLS/WTLS原理

    SSL/TLS/WTLS原理 作者:yawl < yawl@nsfocus.com >主页:http://www.nsfocus.com日期:2001-02-19 一 前言 首先要澄清一下 ...

  3. Linux vi中查找字符内容的方法

      使用vi编辑器编辑长文件时,常常是头昏眼花,也找不到需要更改的内容. 这时,使用查找功能尤为重要. 方法如下: 1.命令模式下输入“/字符串”,例如“/Section 3”. 2.如果查找下一个, ...

  4. python 多参数并行化

    multiprocessing模块与map方法 import time from datetime import datetime from multiprocessing.dummy import ...

  5. resultMap 表示转换字段后 resultType 表示没·有转换字段

    resultMap 表示转换字段后 resultType 表示没·有转换字段

  6. php 微信公众号上传永久素材

    <?php namespace Mob\Controller; use Think\Controller; class WxmaterialController extends Controll ...

  7. 01 Maven构建的项目中,把.xml等配置文件添加到编译目录

    Maven构建的项目,默认只会把src/main/resources目录下的xml配置文件添加到编译目录. 如果需要把src/main/java目录下的xml配置文件也添加到编译目录,需要在pom.x ...

  8. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest F(递推)

    F题 Problem F Philosopher’s Walk 题意:给你n,m,n代表一个长宽都为2的n次方的格子里,m代表走了从左下角开始走了m米,求最后的坐标. 思路: 看上图很容易便可以看出规 ...

  9. java web 验证码-数字不变形

    controller代码: import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.a ...

  10. python之旅:异常处理

    一 什么是异常 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下 一个异常分为三部分 ...