(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. PHP操作Redis数据库常用方法

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis支持的数据类型有 Stirng(字符串), Lis ...

  2. Pandas笔记目录

    速查笔记 使用实例 Pandas-数据导入 (未完成) Pandas-数据探索 基础属性 shape indexs columns values dtype/dtypes 汇总和计算描述统计 coun ...

  3. poj2828 Buy Tickets (线段树 插队问题)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 22097   Accepted: 10834 Des ...

  4. c++11 基于范围的for循环

    c++11 基于范围的for循环 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> # ...

  5. BZOJ 百题纪念!

    一百题辣! 现在NOI知识点中最基础的那部分已经学完了--这几天发现自己会写SA啊树剖啊可持久化Trie啊之类模板题--还挺开心的-- 逛了两天学长博客之后--BZOJ100题辣--也挺开心的-- 现 ...

  6. 一文掌握Docker Compose

    目录 Docker Compose介绍 Docker Compose安装 Docker Compose基本示例 1.基本文件及目录设置 2.创建一个Dockerfile 3.通过docker-comp ...

  7. unity常用小知识点

    感觉自己抑郁变得更严重了,超级敏感,经常想崩溃大哭,睡眠超差,实在不想药物治疗,多看看书,多约约朋友,多出去走走. 来几句鸡汤吧,人一定要活得明白一点,任何关系都不要不清不楚,说不定最后受伤的就是自个 ...

  8. Windows的DOS命令基础

    Windows的DOS命令基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1.dir: 查看当前路径下的目录(directory)详细信息 . 详细信息: a>.dir ...

  9. 函数和常用模块【day06】:json模块(十一)

    本节内容 1.dumps序列化和loads反序列化 2.dump序列化和load反序列化 3.序列函数 1.dumps序列化和loads反序列化 dumps()序列化 1 2 3 4 5 6 7 8 ...

  10. docker 时区设置

    今天查问题的时候发现 在对时间 格式化为 时间戳的时候,time.mktime(time.strptime('20170609-15:00:00','%Y%m%d-%H:%M:%S')) 发现测试环境 ...