https://blog.csdn.net/u011489043/article/details/68488459
转自https://blog.csdn.net/u011489043/article/details/68488459
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因为String类的声明是:public final,因此在每次对
String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String
对象,所以经常改变内容的字符串最好不要用 String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的
GC 就会开始工作,那速度是一定会相当慢的。
在大部分情况下 StringBuffer > String
Java.lang.StringBuffer:线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer上的主要操作是 append 和 insert
方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append
方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的位置添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append(“le”) 会使字符串缓冲区包含“startle”,而 z.insert(4, “ab”) 将更改字符串缓冲区,使之变为“starabtle”。
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilder:一个可变的字符序列,是5.0新增的。此类提供一个与 StringBuffer 兼容的
API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
Java中StringBuilder的用法:
String对象是不可改变的。每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用java.lang.StringBuilder类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder类可以提升性能。
(一)通过用一个重载的构造函数方法初始化变量,可以创建 StringBuilder类的新实例,比如:
StringBuilder testStringBuilder = new StringBuilder("Hello World!");
(二)设置容量和长度:
虽然 StringBuilder对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前 StringBuilder对象容纳的字符串长度混淆在一起。例如,可以创建 StringBuilder类的带有字符串“Hello”(长度为 5)的一个新实例,同时可以指定该对象的最大容量为 25。当修改 StringBuilder时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍 int newCapacity = value.length * 2 + 2;。可以使用重载的构造函数之一来指定 StringBuilder类的容量。比如:以下代码可以将 testStringBuilder对象扩充到最大25个空白
StringBuilder testStringBuilder = new StringBuilder("Hello World!",25);
(三)Append方法:
将文本或对象的字符串表示形式添加到由当前 StringBuilder对象表示的字符串的结尾处。
(四)Insert方法:
将字符串或对象添加到当前 StringBuilder中的指定位置。
(五)Remove方法:
从当前 StringBuilder中移除指定数量的字符,移除过程从指定的索引处开始。
(六)Replace方法:
可以用另一个指定的字符来替换 StringBuilder对象内的字符。
如果程序对附加字符串的需求很频繁,不建议使用+来进行字符串的串联。可以考虑使用java.lang.StringBuilder 类,使用这个类所产生的对象默认会有16个字符的容量(capacity),您也可以自行指定初始容量。如果附加的字符超出可容纳的长度,则StringBuilder 对象会自动增加容量以容纳被附加的字符。如果有频繁作字符串附加的需求,使用StringBuilder 类能使效率大大提高。
见下面测试案例:
public class testStringBuilder {
public static void main(String[] args) {
String text = "";
long beginTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++)
text = text + i;
long endTime = System.currentTimeMillis();
System.out.println("普通字符串直接相加的执行时间:" + (endTime - beginTime));
StringBuffer sbf = new StringBuffer();
beginTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++)
sbf.append(String.valueOf(i));
endTime = System.currentTimeMillis();
System.out.println("使用StringBuffer的append()方法的执行时间:"+ (endTime - beginTime));
StringBuilder sb = new StringBuilder();
beginTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++)
sb.append(String.valueOf(i));
endTime = System.currentTimeMillis();
System.out.println("使用StringBuilder的append()方法的执行时间:"+ (endTime - beginTime));
}
}
输出结果:
普通字符串直接相加的执行时间:261
使用StringBuffer的append()方法的执行时间:3
使用StringBuilder的append()方法的执行时间:2
补充:Java中为什么StringBuilder比StringBuffer快?
首先我们看一下源码:
java.lang.StringBuilder
public StringBuilder append(String str) {
super.append(str);
return this;
}
java.lang.StringBuffer
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
可以看到,StringBuffer类的append()方法,都被synchronized所修饰,这就是我们的主角。
synchronized关键字是做什么的呢?在多线程中非常常见,根据用法不同,可以给方法、代码块或对象加锁。以此处为例,当多个线程访问加锁的方法时,每次只有一个线程获得锁,其他线程必须等待该线程释放锁(一般是执行完这个方法),再由下一个线程获得锁,才允许执行该方法。加锁会带来性能上的损耗(毕竟多执行了一些操作,还包括锁等待时的线程阻塞)。
为什么StringBuffer要加锁?StringBuffer就是为了多线程而设计的,这样可以防止多个线程同时操作同一个对象,也就是线程安全。而如果使用多线程操作StringBuilder对象,则无法保证每次append进去的字符串保持原样(随线程数量和数据量增大,出现错乱的概率也越大,跟线程切换有关)。
综上所述,Stringbuilder要比Stringbuffer快。
https://blog.csdn.net/u011489043/article/details/68488459的更多相关文章
- 程序员的沟通之痛https://blog.csdn.net/qq_35230695/article/details/80283720
个人理解: 一般刚工作的程序员总觉得技术最重要.但是当工作年限超过3年.或者岗位需要涉及汇报.需求对接等就会发现沟通非常重要.也许在大公司还不那么明显,但是在小公司.小团队或者创业,沟通甚至可以说是第 ...
- https://blog.csdn.net/uftjtt/article/details/79044186
https://blog.csdn.net/uftjtt/article/details/79044186
- 自动车牌识别(ALPR)---https://blog.csdn.net/ELEVEN_ZOU/article/details/80893579
1.基本功能:从一张或者一系列的图片中提取车牌信息,比如车牌号码.车牌颜色等信息. 2.功能扩展:车型.车品牌.车牌类型等. 3.应用方向:电子交易系统(停车自动收费.收费站自动支付等).交通执法.交 ...
- Nginx 配置location root 转自https://blog.csdn.net/rofth/article/details/78581617
nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...
- golang操作memcached 转自https://blog.csdn.net/weixin_37696997/article/details/78760397
go使用memcached需要第三方的驱动库,这里有一个库是memcached作者亲自实现的,代码质量效率肯定会有保障 1:安装 go get github.com/bradfitz/gomemcac ...
- 爬虫出现Forbidden by robots.txt(转载 https://blog.csdn.net/zzk1995/article/details/51628205)
先说结论,关闭scrapy自带的ROBOTSTXT_OBEY功能,在setting找到这个变量,设置为False即可解决. 使用scrapy爬取淘宝页面的时候,在提交http请求时出现debug信息F ...
- https://blog.csdn.net/doegoo/article/details/50749817
因为使用DiscuzX3.2进行系统的整合后,因为只是想在原J2EE的系统上增加论坛功能,而且J2EE中已经有一套用户的注册认证的体系,所以不需要在Discuz的系统中去注册以及登录功能,而是通过在J ...
- windows 安装lua-5.3.4 --引用自https://blog.csdn.net/wangtong01/article/details/78296369
版权声明:本文为博主原创文章,转载时请标明出处.http://blog.csdn.net/wangtong01 https://blog.csdn.net/wangtong01/article/det ...
- [Android Pro] https://blog.csdn.net/gaugamela/article/details/79143309
原文地址:https://blog.csdn.net/gaugamela/article/details/79143309 最近遇到这样一个问题: 第三方的SDK除了Jar包外,还提供了对应的so文件 ...
随机推荐
- redis删除所有key
flushdb 删除当前数据库的所有keyflushall 删除所有数据库的所有keydbsize 返回当前数据库的key的数量
- HTML DOM 实例
DOMAnchor 对象 更改一个链接的文本.URL 以及 target 使用 focus() 和 blur() 向超链接添加快捷键 Document 对象 使用 document.write() 向 ...
- Java框架-Spring MVC理解001
Spring MVC理解 1.servlet--Spring MVC的本质 2.Spring MVC其实是一个工具,具体的理解可以分为两步:第一步,了解这个工具是怎么创建出来的:第二步,了解这个工具是 ...
- 经典Console案例
/*下面的示例演示 WindowLeft.WindowTop.WindowWidth.WindowHeight.BufferWidth.BufferHeight 和 CursorVisible 属性以 ...
- FFPLAY的原理(四)
意外情况 你们将会注意到我们有一个全局变量quit,我们用它来保证还没有设置程序退出的信号(SDL会自动处理TERM类似的信号).否则,这个线程将不停地运 行直到我们使用kill -9来结束程序.FF ...
- IT桔子沙龙之本地生活服务O2O探路者笔记整理
这个沙龙活动侧重于创业融资与投资角度 主持人:真格基金投资分析师顾女士;E-mail:grace@zhenfund.com;新浪微博:@顾三小姐 赞助商七牛云的服务宣传:静态资源托管:上传下载全网加速 ...
- Android反编译和再打包神器:Apktool
首先推荐一下这东东,官网:https://ibotpeaches.github.io/Apktool/ 安装.使用之类的看官方文档吧,写这个博客主要是mark一下这东西. 这玩意只能供打包党来用,要想 ...
- Linux服务器安全审计工具与流程完全指南
http://Linux.chinaitlab.com/server/860516.html 当今许多linux服务器都不是刚刚部署完毕的新机器,有专业的Linux系统管理员进行定期维护,IT技术人员 ...
- Django Channels简明实践
1.安装,如果你已经安装django1.9+,那就不要用官方文档的安装指令了,把-U去掉,直接用: sudo pip install channels 2.自定义的普通Channel的名称只能包含a- ...
- Hashtable源码解析
Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. Hashtable也是JDK1.0引入的 ...