String,StringBuffer和StringBuilder的区别
(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的区别的更多相关文章
- String,StringBuffer与StringBuilder的区别??
转自http://blog.csdn.net/rmn190/article/details/1492013 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBu ...
- JAVA String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- 转 String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- String,StringBuffer与StringBuilder的区别??[转]
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- 【Java】String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- String,StringBuffer与StringBuilder的区别?? 缓存
转: String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主 ...
- 《转》String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- (转)String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- String,StringBuffer与StringBuilder的区别与选择
三者的区别 String:不可变类,一旦一个对象被建立的时候,包含在这个对象中的字符串序列是不可变的,直到这个对象被销毁.StringBuffer:可变字符序列的字符串.当其对象被创建的时候,可以用a ...
随机推荐
- C语言入门:05.scanf函数
一.变量的内存分析 1.字节和地址 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”. (1)内存以“字节为单位”
- Git从零开始(二)
前面提交了一个test1.txt文件,接下来看看这个文件接下来的命运. 一.继续修改并提交 在test1.txt中修改后, git status 查看git的状态, 会提示我们文件test1.txt被 ...
- Chrome Ajax 跨域设置
一.前言 web 开发中 Ajax 是十分常见的技术,但是在前后端使用接口对接的调试过程中不可避免会碰到跨域问题.今天我给大家介绍一个十分简单有效的方法. 跨域经典错误 二.Chrome 跨域设置 首 ...
- google-gson 使用及GsonBuilder设置
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串( ...
- js判断checkbox是否选中
$('.div0 .checkbox1').prop('checked')选中返回 true未选中返回 false $('.div0').prop("checked", true) ...
- BZOJ刷题指南(转)
基础(65) 巨水无比(4):1214.3816:2B题:1000A+B:2462:输出10个1 模拟/枚举/暴力(15):4063傻子模拟:1968小学生暴力:1218前缀和暴力:3856读英文:4 ...
- 【CF580C】Kefa and Park
题目大意:给定一棵 N 个节点的有根树(其中根节点始终为 1 号节点),点有点权,点权只有 1 和 0 两种,求从根节点到叶子节点的路径中,有多少条路径满足:路径上最大连续点权为 1 的节点个数不超过 ...
- C# 基于MySQL的数据层基类(MySQLHelper)
这里介绍下比较简单的方式,引用MySql.Data.dll然后添加一个MySqlHelper类来对MySql数据库进行访问和操作. 1.将MySql.Data.dll引用到你的项目中 下载地址:MyS ...
- SQL Server优化的方法
SQL Server优化的方法<一> 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了 ...
- php错误日志
php错误日志 /usr/local/php/var/log/php-fpm.log」—————————