String、StringBuffer、StringBuilder有什么区别呢?

1、String:

  1. 首先String是不可变的这是家喻户晓的,它的底层是用一个final修饰的char数组来保存数据的
  2. String a = "123",String b = "123", b == a 是会返回true的,这里牵扯到了字符串常量池,因为很多字符串都是常见的,不可能每个字符串都创建一个对象吧?你有一个“abc”字符串,他也有一个,有10000个“abc”字符串就要创建10000个“abc”字符串?这样对性能和内存肯定有损耗,所以JVM中就会有一个字符串常量池(Java6中被缓存的字符串是存在所谓 PermGen 里的,也就是臭名昭著的的“永久代”,这个空间是有限的,也基本不会被FullGC之外的垃圾收集照顾到。所以使用不当,OOM就会光顾。在后续版本中,这个缓存被放置在堆中,这样就极大避免了永久代占满的问题,甚至永久代在JDK8中被MetaSpace(元数据区)替代了。而且默认缓存大小也在不断扩大中,从最初的1009,到7u40以后被修改为60013。)来保存字符串常量,以上定义的变量a,和b之所以用"=="相比较返回true是因为他们都指向同一个字符串对象。
  3. 当然以上情况要注意的是:String  a = new String("123”) ,String  b = new String("123”)这样的写法,a == b返回的就是false了。
  4. 计算中注意的两点,String a = "123" + "123 + "2341";这种写法,在编译期就已经确定了字符串“1231232341”,所以速度还是很快的。但是如果用下面这种字符串拼接方式,那么就会导致性能大减,这也是String拼接字符串效率最低的原因之一了吧。String a = "123",a  += "23"; a += "cb";这种情况下,String底层会实例化一个一个有一个的StringBuilder对象并且利用append方法来拼接字符串。当字符串拼接量比较大的时候,可想而知创建那么多StringBuilder对象造成的性能开销和内存开销了。

2、StringBuilder

  1. StringBuilder是非线程安全的,少了同步造成的性能开销,所以在大部分场景中,StringBuilder仍然是拼接字符串的首选。

3、StringBuffer

  1. StringBuffer与StringBuilder是大致相同的,都有相同的方法相同的属性,相同的特性等。不同的是加了synchronized关键字到所有操作字符串的方法上(append等),保证了操作字符串的线程安全。
  2. StringBuffer与StringBuilder底层都是用一个char[] value来保存数据的,而在append时候仅仅是对这个数组进行扩容,所以在性能上相比反复创建StringBuilder对象的String来说,性能提升了很多。

搞懂String、StringBuffer、StringBuilder的区别的更多相关文章

  1. String,StringBuffer,StringBuilder的区别

    public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...

  2. [置顶] String StringBuffer StringBuilder的区别剖析

    这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...

  3. String,StringBuffer,StringBuilder的区别及其源码分析

    String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...

  4. Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?

    Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系 创建成功的String对象,其长度是固定的,内容 ...

  5. java中 String StringBuffer StringBuilder的区别

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

  6. 深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)

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

  7. Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用

    Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...

  8. 在JAVA中,String,Stringbuffer,StringBuilder 的区别

    首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String  不是线程安全的,这意味着在不同线程共享一个String ...

  9. String,StringBuffer,StringBuilder三者区别

    String:每次改变,String都会重新构造,内存指针都会改变 StringBuffer:主要用在全局变量中 StringBuilder:在线程内完成字符拼接,因为线程是不安全的,所以完成后可以丢 ...

  10. 从源码看String,StringBuffer,StringBuilder的区别

    前言 看了一篇文章,大概是讲面试中的java基础的,有如题这么个面试题.我又翻了一些文章看了下,然后去看源码.看一下源码大概能更加了解一些. String String类是final的,表示不可被继承 ...

随机推荐

  1. 模糊C均值聚类的公式推导

    j=1...n,N个样本 i=1...c,C聚类 一.优化函数 FCM算法的数学模型其实是一个条件极值问题: 把上面的条件极值问题转化为无条件的极值问题,这个在数学分析上经常用到的一种方法就是拉格朗日 ...

  2. 【思考】为什么说Bagging减少variance,Boosting减少bias?(转载)

    具体讨论可见于此知乎问题,有很多种理解方向,甚至这一个命题可能本来就不成立!

  3. 字典和Model的互转

    LHModel的简单使用: LHModel是一个JSON转model,model转JSON的工具类. 使用很多runtime的API.调用简单,真正能用到的只有两个方法. Model* model = ...

  4. ubuntu kylin 18.04 使用 wine 安装 EasyConnect 的windows版本

    首先下载wine: sudo apt-get install wine-stable 然后使用wine安装安装包EXE文件(安装包你自己去下): wine EasyConnectInstaller.e ...

  5. node-sass 安装失败解决方案

    从失败到成功,尝试了不下20,最终终于解决了: 解决方案如下: 参考方案一:http://www.jianshu.com/p/89f5e094b8ce(具体的配置看这个) 参考方案二:http://b ...

  6. MySQL问题:Access denied for user 'mysql'@'localhost'

    deep@deep-PC:~$ sudo mysql -uroot -p mysql> update mysql.user set authentication_string=PASSWORD( ...

  7. 【Unsolved】线性时间选择算法的复杂度证明

    线性时间选择算法中,最坏情况仍然可以保持O(n). 原因是通过对中位数的中位数的寻找,保证每次分组后,任意一组包含元素的数量不会大于某个值. 普通的Partition最坏情况下,每次只能排除一个元素, ...

  8. Java基础——接口和抽象类

    接口(interface) 什么是接口? 接口时抽象方法的合集.接口不可以被直接被实例化. 为什么要使用接口? 为了扩展.Java不支持多继承,但是通过接口就可以实现“多继承” 制定规则.接口就是规则 ...

  9. Spring-Boot的第三方类库的依赖版本调整方法

    springboot方式构建的工程,是dependencyManagement方式进行依赖包的版本管理, spring中有默认的版本,可以修改ext参数来调整版本 如下SpringBoot-2.2.x ...

  10. 【编程开发】opencv实现对Mat中某一列或某一行的元素进行normalization

    [编程开发]opencv实现对Mat中某一列或某一行的元素进行normalization 标签: [编程开发] [机器学习] 声明:引用请注明出处http://blog.csdn.net/lg1259 ...