1.StringBuffer 类基本介绍

  • java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删。
  • 很多方法与String相同,但StringBuffer是可变长度的
  • StringBuffer是一个容器。

public class StringBuffer01 {public static void main(String[] args) {//老韩解读//1. StringBuffer 的直接父类 是 AbstractStringBuilder//2. StringBuffer 实现了 Serializable, 即StringBuffer的对象可以串行化//3. 在父类中  AbstractStringBuilder 有属性 char[] value,不是final//   该 value 数组存放 字符串内容,因此存放在堆中的//4. StringBuffer 是一个 final类,不能被继承//5. 因为StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除)//   不用每次都更换地址(即不是每次创建新对象), 所以效率高于 StringStringBuffer stringBuffer = new StringBuffer("hello");}
}

2.String VS StringBuffer

  1. String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低//private final char value[l;

  2. StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率较高//char[] value;这个放在堆.

public class StringBuffer02 {public static void main(String[] args) {//构造器的使用//老韩解读//1. 创建一个 大小为 16的 char[] ,用于存放字符内容StringBuffer stringBuffer = new StringBuffer();//2 通过构造器指定 char[] 大小StringBuffer stringBuffer1 = new StringBuffer(100);//3. 通过 给一个String 创建 StringBuffer, char[] 大小就是 str.length() + 16StringBuffer hello = new StringBuffer("hello");}
}

在开发中,我们经常需要将String 和StringBuffer进行转换,看看如何实现,

public class StringAndStringBuffer {public static void main(String[] args) {//看 String——>StringBufferString str = "hello tom";//方式1 使用构造器//注意: 返回的才是StringBuffer对象,对str 本身没有影响StringBuffer stringBuffer = new StringBuffer(str);//方式2 使用的是append方法StringBuffer stringBuffer1 = new StringBuffer();stringBuffer1 = stringBuffer1.append(str);//看看 StringBuffer ->StringStringBuffer stringBuffer3 = new StringBuffer("韩顺平教育");//方式1 使用StringBuffer提供的 toString方法String s = stringBuffer3.toString();//方式2: 使用构造器来搞定String s1 = new String(stringBuffer3);}
}

3.StringBuffer 类常见方法

public class StringBufferMethod {public static void main(String[] args) {StringBuffer s = new StringBuffer("hello");//增s.append(',');// "hello,"s.append("张三丰");//"hello,张三丰"s.append("赵敏").append(100).append(true).append(10.5);//"hello,张三丰赵敏100true10.5"System.out.println(s);//"hello,张三丰赵敏100true10.5"//删/** 删除索引为>=start && <end 处的字符* 解读: 删除 11~14的字符 [11, 14)*/s.delete(11, 14);System.out.println(s);//"hello,张三丰赵敏true10.5"//改//老韩解读,使用 周芷若 替换 索引9-11的字符 [9,11)s.replace(9, 11, "周芷若");System.out.println(s);//"hello,张三丰周芷若true10.5"//查找指定的子串在字符串第一次出现的索引,如果找不到返回-1int indexOf = s.indexOf("张三丰");System.out.println(indexOf);//6//插//老韩解读,在索引为9的位置插入 "赵敏",原来索引为9的内容自动后移s.insert(9, "赵敏");System.out.println(s);//"hello,张三丰赵敏周芷若true10.5"//长度System.out.println(s.length());//22System.out.println(s);}
}
public class StringBufferExercise01 {public static void main(String[] args) {String str = null;// okStringBuffer sb = new StringBuffer(); //oksb.append(str);//需要看源码 , 底层调用的是 AbstractStringBuilder 的 appendNullSystem.out.println(sb.length());//4System.out.println(sb);//null//下面的构造器,会抛出NullpointerExceptionStringBuffer sb1 = new StringBuffer(str);//看底层源码 super(str.length() + 16);System.out.println(sb1);}
}

练习2

输入商品名称和商品价格,要求打印效果示例, 使用前面学习的方法完成:
商品名    商品价格
手机 123,564.59  //比如 价格 3,456,789.88要求:价格的小数点前面每三位用逗号隔开, 再输出。思路分析
1. 定义一个Scanner 对象,接收用户输入的 价格(String)
2. 希望使用到 StringBuffer的 insert ,需要将 String 转成 StringBuffer
3. 然后使用相关方法进行字符串的处理
public class StringBufferExercise02 {public static void main(String[] args) {/*输入商品名称和商品价格,要求打印效果示例, 使用前面学习的方法完成:商品名    商品价格手机 123,564.59  //比如 价格 3,456,789.88要求:价格的小数点前面每三位用逗号隔开, 在输出。思路分析1. 定义一个Scanner 对象,接收用户输入的 价格(String)2. 希望使用到 StringBuffer的 insert ,需要将 String 转成 StringBuffer3. 然后使用相关方法进行字符串的处理代码实现*///new Scanner(System.in)String price = "8123564.59";StringBuffer sb = new StringBuffer(price);//先完成一个最简单的实现123,564.59//找到小数点的索引,然后在该位置的前3位,插入,即可
//        int i = sb.lastIndexOf(".");
//        sb = sb.insert(i - 3, ",");//上面的两步需要做一个循环处理,才是正确的for (int i = sb.lastIndexOf(".") - 3; i > 0; i -= 3) {sb = sb.insert(i, ",");}System.out.println(sb);//8,123,564.59}
}

4.StringBuilder 类基本介绍

1)一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类.因为在大多数实现中,它比 StringBuffer要快[后面测]】。

2)在 StringBuilder 上的主要操作是append和 insert方法,可重载这些方法,以接受任意类型的数据。

public class StringBuilder01 {public static void main(String[] args) {//老韩解读//1. StringBuilder 继承 AbstractStringBuilder 类//2. 实现了 Serializable ,说明StringBuilder对象是可以串行化(对象可以网络传输,可以保存到文件)//3. StringBuilder 是final类, 不能被继承//4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder的 char[] value;//   因此,字符序列是堆中//5. StringBuilder 的方法,没有做互斥的处理,即没有synchronized 关键字,因此在单线程的情况下使用//   StringBuilderStringBuilder stringBuilder = new StringBuilder();}
}

5.String、StringBuffer 和 StringBuilder 的比较

  1. StringBuilder和 StringBuffer非常类似,均代表可变的字符序列,而且方法也一样

  2. String:不可变字符序列,效率低,但是复用率高。

  3. StringBuffer:可变字符序列、效率较高(增删)、线程安全,看源码

  4. StringBuilder:可变字符序列、效率最高、线程不安全

  5. String使用注意说明:
    string s="a";//创建了一个字符串

s += "b";//实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+"b”(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能=>结论:如果我们对String做大量修改,不要使用String

6.String、StringBuffer 和 StringBuilder 的效率测试

StringBuilder > StringBuffer > String

public class StringVsStringBufferVsStringBuilder {public static void main(String[] args) {long startTime = 0L;long endTime = 0L;StringBuffer buffer = new StringBuffer("");startTime = System.currentTimeMillis();for (int i = 0; i < 80000; i++) {//StringBuffer 拼接 20000次buffer.append(String.valueOf(i));}endTime = System.currentTimeMillis();System.out.println("StringBuffer的执行时间:" + (endTime - startTime));StringBuilder builder = new StringBuilder("");startTime = System.currentTimeMillis();for (int i = 0; i < 80000; i++) {//StringBuilder 拼接 20000次builder.append(String.valueOf(i));}endTime = System.currentTimeMillis();System.out.println("StringBuilder的执行时间:" + (endTime - startTime));String text = "";startTime = System.currentTimeMillis();for (int i = 0; i < 80000; i++) {//String 拼接 20000text = text + i;}endTime = System.currentTimeMillis();System.out.println("String的执行时间:" + (endTime - startTime));}
}

7.String、StringBuffer 和 StringBuilder 的选择

使用的原则,结论:
1.如果字符串存在大量的修改操作,一般使用StringBuffer 或StringBuilder;

2.如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder;

3.如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer;

4.如果我们字符串很少修改,被多个对象引用,使用String, 比如配置信息等

StringBuilder的方法使用和 StringBuffer 一样,不再说

StringBuffer类和StringBuilder类相关推荐

  1. Java计基础---常用类之StringBuilder类--String、StringBuilder和StringBuffer 的区别

    常用类之StringBuilder类 StringBulider 类:也是一个字符串类.是一个可变的字符序列,在类中提供了可以改变字符串内容的常用的方法. StringBulider 和 String ...

  2. Java学习笔记20(String类应用、StringBuffer类、StringBuilder类)

    1.获取指定字符串中大小写和数字的个数: package demo;public class StringTest {public static void main(String[] args) {g ...

  3. 【JAVA SE】第十章 String类、StringBuffer类和StringBuilder类

    第十章 String类.StringBuffer类和StringBuilder类 文章目录 第十章 String类.StringBuffer类和StringBuilder类 一.String类 1.创 ...

  4. 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照

    本文主要介绍String类.StringBuffer类.StringBuilder类的差别  : 一.概述 (一)String 字符串常量.可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作 ...

  5. String类、StringBuffer类与StringBuilder类

    一.三者的区别         [Java中的String,StringBuilder,StringBuffer三者的区别 - 酥风 - 博客园] String 类 :不可变字符序列 StringBu ...

  6. Java基础知识(二)(Object类的常用方法、日期时间类、System类、StringBuilder类、包装类、Collection集合、Iterator迭代器、泛型、list集Set接口...)

    文章目录 Java基础知识(二) 1.Object类的常用方法 1.1 toString方法 1.2 equals方法 1.3 Objects类 2.日期时间类 2.1 Date类 2.2 DateF ...

  7. C#中的字符串, String类和StringBuilder类

    C#中的字符串, String类和StringBuilder类 1.简介 字符串对大多数计算机程序而言非常普遍. 像文字处理软件和网页应用程序这些程序类型 都广泛采用了字符串. 这使得处理这类应用程序 ...

  8. Java:Object类、Date类、Calendar(日历)类、System类、StringBuilder类、包装类

    1.Object类-概述 1).在java.lang包之下,lang包是物理存在的,jdk中,lang包之下的都不需要进行导包 2).Object是Java中任何"引用类型"的父类 ...

  9. 普歌-码灵团队-System类,StringBuilder类的常用方法详解

    System类,StringBuilder类的常用方法详解(java基础必掌握)java面试必问) System类的介绍: System类中常用方法: 1.System.currentTimeMill ...

  10. java.lang包—StringBuffer类和StringBuilder类

    目录 一.数据结构 二.线程安全性分析 三.源码 四.适用场景 一.数据结构 在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串.String 类是不可变类,即一旦一 ...

最新文章

  1. 2019年最新最全运维技能图谱
  2. TensorFlow Serving 尝尝鲜
  3. 数据库-左外连接-右外连接
  4. 33 计算机维修,33.计算机硬件检测维修与数据恢复竞赛规程(修改)全解.doc
  5. 火柴Open Day,你永远不知道你错过了什么!!
  6. Python3内置模块2-logging(转)
  7. 保留(私有)地址简介
  8. apkg格式怎么打开_jpg怎么转换成pdf?再不学就晚了
  9. 360 极速模式 css,请问 chrome 和 360 极速模式 渲染页面不一样
  10. ARM开发比51开发高级吗—嵌入式就业技能分类
  11. android 路由跟踪,手机移动端网络路由跟踪探测方式
  12. 一图看懂西方哲学全脉络
  13. Leetcode1278
  14. 前端跨域请求get_前端接收 get 请求,用jsonp 解决跨域问题, 需要服务端的response 也要jsonp 类型...
  15. 金融民工python学习笔记
  16. iOS MultipeerConnectivity
  17. 第八天 02.hydra暴力破解ssh密码以及ftp密码
  18. ldpc译码讲解_LDPC码译码方法和编码方法与流程
  19. 基于Android的移动学习软件的设计与实现
  20. 阿里钉钉Android实习面试也太太太太难了吧,对算法的要求堪比字节

热门文章

  1. Ubuntu普通用户无法SSH登陆而root用户可以正常登陆问题
  2. 5G赋能智慧楼宇会后感
  3. 哔哩哔哩验证码的破解
  4. 李子柒的视频为什么这么吸引人?对她在B站上发布的视频进行分析
  5. 春水初生,春林初盛,春风十里,不如你
  6. pyinstall 打包报错
  7. HDFS 异常处理与恢复
  8. 【办公软件都有哪些】万彩办公大师教程丨PDF图片抽取
  9. 使用OPENCV简单实现具有肤质保留功能的磨皮增白算法
  10. java秒表代码_秒表 - java代码库 - 云代码