String 字符串常量

StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:  www.2cto.com
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做
在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
如果你读过《Think in Java》,而且对里面描述HashTable和HashMap区别的那部分章节比较熟悉的话,你一定也明白了原因所在。对,就是支持线程同步保证线程安全而导致性能下降的问题。HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也在于此,新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。如果你对此不太相信,可以试试下面的例子:
package com.hct.test;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @author: chengtai.he* @created:2009-12-9 上午09:59:57*/
public class StringBuilderTester {private static final String base = " base string. ";private static final int count = 2000000;public static void stringTest() {long begin, end;begin = System.currentTimeMillis();String test = new String(base);for (int i = 0; i < count/100; i++) {test = test + " add ";}end = System.currentTimeMillis();System.out.println((end - begin)+ " millis has elapsed when used String. ");}public static void stringBufferTest() {long begin, end;begin = System.currentTimeMillis();StringBuffer test = new StringBuffer(base);for (int i = 0; i < count; i++) {test = test.append(" add ");}end = System.currentTimeMillis();System.out.println((end - begin)+ " millis has elapsed when used StringBuffer. ");}public static void stringBuilderTest() {long begin, end;begin = System.currentTimeMillis();StringBuilder test = new StringBuilder(base);for (int i = 0; i < count; i++) {test = test.append(" add ");}  end = System.currentTimeMillis();System.out.println((end - begin)+ " millis has elapsed when used StringBuilder. ");}public static String appendItemsToStringBuiler(List list) {StringBuilder b = new StringBuilder();for (Iterator i = list.iterator(); i.hasNext();) {b.append(i.next()).append(" ");}return b.toString();}public static void addToStringBuilder() {List list = new ArrayList();list.add(" I ");list.add(" play ");list.add(" Bourgeois ");list.add(" guitars ");list.add(" and ");list.add(" Huber ");list.add(" banjos ");System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));}public static String appendItemsToStirngBuffer(List list) {StringBuffer b = new StringBuffer();for (Iterator i = list.iterator(); i.hasNext();) {b.append(i.next()).append(" ");}return b.toString();}public static void addToStringBuffer() {List list = new ArrayList();list.add(" I ");list.add(" play ");list.add(" Bourgeois ");list.add(" guitars ");list.add(" and ");list.add(" Huber ");list.add(" banjos ");System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));}public static void main(String[] args) {stringTest();stringBufferTest();stringBuilderTest();addToStringBuffer();addToStringBuilder();}
}

运行结果:

5266 millis has elapsed when used String.
375 millis has elapsed when used StringBuffer.
281 millis has elapsed when used StringBuilder. I   play   Bourgeois   guitars   and   Huber   banjos  I   play   Bourgeois   guitars   and   Huber   banjos 

从上面的结果来看,这三个类在单线程程序中的性能差别一目了然,采用String对象时,即使运行次数仅是采用其他对象的1/100,其执行时间仍然比其他对象高出25倍以上;而采用StringBuffer对象和采用StringBuilder对象的差别也比较明显,前者是后者的1.5倍左右。由此可见,如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;当然,如果要保证线程安全,自然非StringBuffer莫属了。

除了对多线程的支持不一样外,这两个类的使用几乎没有任何差别,上面的例子就是个很好的说明。appendItemsToStringBuiler和appendItemsToStirngBuffer两个方法除了采用的对象分别为StringBuilder和StringBuffer外,其他完全相同,而效果也完全相同。

转载于:https://www.cnblogs.com/fangchongyan/p/5356923.html

String、StringBuffer 、StringBuilder 的区别(转)相关推荐

  1. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  2. String StringBuffer StringBuilder的区别

    简单的事情做到极致也是一种能力. 首先,说一下目前我还没进行整理的情况下,我的理解: String 不可修改 修改后相当于又新创建创建一个字符串 比如: String a = "abc&qu ...

  3. 【翻译】Java中String, StringBuffer, StringBuilder的区别

    2019独角兽企业重金招聘Python工程师标准>>> String 是  Java 中最重要的类之一,并且任何刚开始做Java编程的人,都会 用String定义一些内容,然后通过著 ...

  4. java stringbuffer原理_深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)

    String.StringBuffer.StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别 ...

  5. String,StringBuffer,StringBuilder的区别

    1 Java String 类是字符串常量 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 需要注意的是,String的值是 ...

  6. Java中String,StringBuffer,StringBuilder的区别

    String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 运行速度 StringBuilder > StringBuffe ...

  7. String, StringBuffer,StringBuilder

    String, StringBuffer,StringBuilder的区别 java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,都实现了CharSe ...

  8. StringBuffer类,StringBuffer类和String的区别、String,StringBuffer,StringBuilder之间的区别

    1.概述 StringBuffer是一个线程安全的可变序列. 2.StringBuffer与String区别 (1)StringBuffer的长度和内容都可以发生改变,String却不行 (2)Str ...

  9. 116day(String,StringBuffer,StringBuilder,模拟器和虚拟机的区别,复合命题的种类)

    <2018年2月4日>[连续116天] 标题:String,StringBuffer,StringBuilder,模拟器和虚拟机的区别,复合命题的种类: 内容: A.详见http://bl ...

  10. String StringBuffer StringBuilder区别与联系

    String     StringBuffer     StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...

最新文章

  1. 5地图组件 uni_uni-app学习笔记(一)-- uni-app简介
  2. 模拟问路场景理解递归
  3. 在eclipse及myEclipse下安装插件之方法
  4. MySQL Replication--复制异常1
  5. Vue2.x通用条件搜索组件的封装及应用
  6. Cdn间隙性故障总结
  7. Linux执行fastqc报错Exception in thread “main“ java.awt.HeadlessException: No X11 DISPLAY variable was s
  8. 如何用Camtasia为“微课”视频添加光标效果?
  9. LVS(三)LVS集群NAT模式
  10. JavaScript正则表达式学习笔记之一 - 理论基础
  11. myeclipse使用(技术和快捷键)
  12. OSG学习之几何图形
  13. Docker硬盘空间使用分析与清理
  14. GEO数据库学习二(ID转换)
  15. 阿里云服务器白嫖和购买教程——学生向
  16. 视频语音如何翻译成文字?
  17. 电气EPlan软件第一章到第五章的学习
  18. 如何通过优化网站内容提高外贸网站的谷歌排名?
  19. 秋荣创投:本品牌成立的意义与价值、使命愿景价值观
  20. 硬盘无法格式化怎么解决?数据丢失怎么恢复?

热门文章

  1. java.lang.UnsupportedOperationException: null at java.util.AbstractList.add(AbstractList.java:148)
  2. java用循环做猜拳_java用循环方式实现和计算机玩猜拳的程序
  3. 原生JS那些事:原生JS添加和删除class类名
  4. 勒索软件再次降临 教育网为什么成为重灾区
  5. scrapy 伪装代理和fake_userAgent的使用
  6. android 电话拨号器
  7. PhpStorm下Laravel代码智能提示
  8. Silverlight 密码框 Focus
  9. Java实现的基于socket的一次通信
  10. [Android实例] 天天动听 悬浮歌词(迷你歌词)效果解读