String是典型的Immutable(不可变)类,被声明为final class,所有属性都是final的。由于它的不可变性,类似拼接、截取字符串等操作都会产生新的String对象,往往编码中常常对字符串进行操作,所以操作的效率往往对应用性能有明显影响。

StringBuffer 是为了解决上面提到的因拼接产生太多中间对象问题而提供的一个类,我们可以用append 或者add方法,把字符串添加到已有序列末尾或者指定位置。StringBuffer本质是一个线程安全的可修改字符序列,它保证了线程安全(通过把各种修改数据的方法都加上synchronized关键字实现),也随之带来了额外的性能开销,若无线程安全的需要,可以使用StringBulider。

深入分析:

1.字符串的设计和实现考量

StringBuffer 和StringBulider底层都是利用可修改的数组(java9是byte)数组,二者都继承了AbstractStringBulider,里面包含了基本操作,区别仅仅在于方法是否加了synchronized。

个数组构建时是初始字符串长度加16,如果没有构建时输入最初的字符串,那么初始值就是16。如果我们能预估需要的大小,最好制定其大小,避免多次扩容带来的开销,扩容需要创建新的数组,还要进行arrayCopy。

//不带字符串初始化,默认分配16byte
StringBuilder stringBuilder = new StringBuilder();
//带字符串初始化,初始化字符串长度+16byte
StringBuilder sb = new StringBuilder().append("nihao").append("ggsimida");
//指定大小50byte
StringBuilder ssb = new StringBuilder().append("nihao").append("ggsimida");

2.字符串缓存

各版本jdk的实现

3.String自身演化

java9将字符串存储方式从char数组,改变为一个byte数组加上一个标识编码的coder,极端情况下最长字符串大小变小了,但是紧凑型字符串优势巨大,更小的内存,更快的操作速度

5-- String 、StringBulid 、StringBuffer的区别的更多相关文章

  1. JAVA中String与StringBuffer的区别

    String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结. 在java中有3个类来负责字符的操作. 1.C ...

  2. String 和 StringBuffer的区别

    String与StringBuffer的区别:            简单地说,就是一个常量和变量的关系.StringBuffer对象的内容可以修改:而String对象一旦产生后就不可以被修改,重新赋 ...

  3. boolean和Boolean, char和Character , byte和Byte, short和Short, int和Integer , long和Long , float和Float, double和Double的区别 , String和StringBuffer的区别

    Java提供两种不同的类型:引用类型和原始类型(内置类型).Int是java的原始数据类型,Integer是java为int提供的封装类. Java为每个原始数据类型提供了封装类. 其中原始数据类型封 ...

  4. string 和 stringbuffer的区别?

    string和stringbuffer的区别其实是变量和常亮的关系,string和stringbuffer内部实现的原理不同,在修改string对象时会产生另外的对象,也就是说在内存中会有两个存储区域 ...

  5. 【转载】String和StringBuffer的区别,以及StringBuffer的常用方法介绍

    String与StringBuffer的区别简单地说,就是一个变量和常量的关系.StringBuffer对象的内容可以修改:而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象.Stri ...

  6. String和StringBuffer的区别

    1.选自http://szh-java.iteye.com/blog/1666630 String 1,Stirng是对象不是基本数据类型 2,String是final类,不能被继承.是不可变对象,一 ...

  7. String与StringBuffer的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  8. String和StringBuffer的区别;字符串的一些基本方法

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

  9. Java语言基础(四) String和StringBuffer的区别

    Java提供了两个字符串类:String和StringBuffer. String提供了数值不可变的字符串,而StringBuffer提供的字符串对象可以进行修改. 当知道字符数据要改变的时候就可以使 ...

  10. java中String和StringBuffer的区别

    前言 String和StringBuffer本质上都是修饰字符串的只是含义不同 StringBuffer叫做字符串缓冲区 首先看下string类的例子 public class Work1 { pub ...

随机推荐

  1. TCP time_wait close_wait问题(可能是全网最清楚的例子)

    背景 公司群里,运维发现一个问题,task服务报错(如下) The stream or file \"/data/logs/adn_task/offer_service.log\" ...

  2. nyoj 101-两点距离 (数学)

    101-两点距离 内存限制:64MB 时间限制:3000ms 特判: No 通过数:27 提交数:74 难度:1 题目描述: 输入两点坐标(X1,Y1),(X2,Y2)(0<=x1,x2,y1, ...

  3. C语言|博客作业08

    这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9976 我在这个课程的 ...

  4. opencv 6 图像轮廓与图像分割修复 1 查找并绘制轮廓 寻找物体的凸包

    查找并绘制轮廓 寻找轮廓(findContours)函数 绘制轮廓(drawContours()函数) 基础实例程序:轮廓查找 #include <opencv2/opencv.hpp> ...

  5. template screen

    从全局搜索主机可看到此screen

  6. 20190926-2 选题 Scrum立会报告+燃尽图05

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8678 一.小组情况组长:迟俊文组员:宋晓丽 梁梦瑶 韩昊 刘信鹏队名:扛 ...

  7. Java描述设计模式(24):备忘录模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时, ...

  8. Hash Map 在java中的解释及示例

    目录 HashMap在java中的应用及示例 HashMap的内部结构 HashMap的性能 同步HashMap HashMap的构造函数 HashMap的时间复杂度 HashMap的方法 1. vo ...

  9. csrf与xss

    CSRF攻击攻击原理及过程如下: 1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A:       2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登 ...

  10. 依赖注入利器 - Dagger ‡

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/53715960 本文出自: [HansChen的博客] 概述 声明需要注入的对象 如何 ...