二、StringBuffer类&StringBuilder类

2.1 简介

  1. java.lang.StringBuffer、StringBuilder代表可变的字符序列,可以对字符 串内容进行增删,此时不会产生新的对象
  2. 很多方法与String相同
  3. 作为参数传递时,方法内部可以改变值。

2.2 String VS StringBuffer VS StringBuilder

  1. String、StringBuffer、StringBuilder三者的异同?

    • String:不可变的字符序列;底层使用char[]存储
    • StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
    • StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
  2. 源码分析

    • 我们使用new String()创建字符串的时候:

      String str = new String();       //底层是这样的:char[] value = new char[0];
      String str1 = new String("abc"); //底层是这样的:char[] value = new char[]{'a','b','c'};
    • 我们使用new StringBuffer()创建字符串的时候:

      StringBuffer test = new StringBuffer();//  无参:底层是这样的:char[] value = new char[16];底层创建了一个长度是16的数组。
      StringBuffer test2 = new StringBuffer("abd");// 有参:底层是这样的:char[] value = new char[test2.leng()+16]

      StringBuffer底层部分源码:

      public final class StringBuffer
      extends AbstractStringBuilder
      implements java.io.Serializable, CharSequence
      { /**
      * A cache of the last value returned by toString. Cleared
      * whenever the StringBuffer is modified.
      */
      private transient char[] toStringCache; /** use serialVersionUID from JDK 1.0.2 for interoperability */
      static final long serialVersionUID = 3388685877147921107L; /**
      * Constructs a string buffer with no characters in it and an
      * initial capacity of 16 characters.
      */
      public StringBuffer() {
      super(16);
      }
      }

      从中我们可以看出StringBuffer的无参构造器,默认容量是16。点击super我们去StringBuffer的父类看看。

      从中我们可以看出,new了长度为16的字符数组,并且给了value这个变量。

      有参数

    1. 几个问题

      @Test
      public void test1() {
      StringBuffer str1 = new StringBuffer("abd");
      System.out.println(str1.length());
      }

      (1)System.out.println(str1.length());结果为多少?为什么不为str1.length()+16?

      ​ 答:3。因为它统计的是你append进去的数量。

      (2)扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。

      ​ 答:默认情况下,扩容为原来容量的2倍 + 2,同时将原有数组中的元素复制到新的数组中。

    ​ 指导意义:开发中建议大家使用:StringBuffer(int capacity) 或 StringBuilder(int capacity)

2.3 StringBuffer类的常用方法

注意:

  1. String的常用方法,StringBuffer和StringBuilder都有,同时它们两个有些String没有的方法

  2. StringBuilder的常用方法和StringBuffer的一样,只不过是同步方法,线程安全。

  1. StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
  2. StringBuffer delete(int start,int end):删除指定位置的内容
  3. StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
  4. StringBuffer insert(int offset, xxx):在指定位置插入xxx
  5. StringBuffer reverse() :把当前字符序列逆转
  6. public int indexOf(String str)
  7. public String substring(int start,int end)
  8. public int length()
  9. public char charAt(int n )
  10. public void setCharAt(int n ,char ch)

当append和insert时,如果原来value数组长度不够,可扩容。

如上这些方法支持方法链操作。

总结:
增:append(xxx)
删:delete(int start,int end)
改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
查:charAt(int n )
插:insert(int offset, xxx)
长度:length();
*遍历:for() + charAt() / toString()
@Test
public void test1() {
StringBuffer buffer = new StringBuffer("abc");
/*增*/
buffer.append(2);
System.out.println(buffer);
/*删*/
buffer.delete(1,3);
System.out.println(buffer);
/*改1*/
buffer.setCharAt(0,'s');
System.out.println(buffer);
/*改2*/
buffer.replace(0,1,"cxk");
System.out.println(buffer);
/*插*/
buffer.insert(1,"SSS");
System.out.println(buffer);
/*长度*/
int length = buffer.length();
System.out.println(length);
/*遍历*/
for (int i = 0; i < buffer.length(); i++) {
System.out.print(buffer.charAt(i)+" ");
}
System.out.println("\n=================");
/*转为字符串*/
System.out.println(buffer.toString());
}

2.4 三者效率对比

@Test
public void test2() {
//初始设置
long startTime = 0L;
long endTime = 0L;
String text = "";
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
//开始对比
startTime = System.currentTimeMillis();// System.currentTimeMillis()获取当前时间
for (int i = 0; i < 20000; i++) {
buffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime)); startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
builder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime)); startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String的执行时间:" + (endTime - startTime));
}

效率从高到低排列:StringBuilder > StringBuffer > String

java 常用类-StringBuffer-StringBuilder的更多相关文章

  1. Java 常用类——StringBuffer&StringBuilder【可变字符序列】

    一.字符串拼接问题 由于 String 类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象. Demo: 1 public class StringDemo { 2 pub ...

  2. java常用类-StringBuffer,Integer,Character

    * StringBuffer: * 线程安全的可变字符串. * * StringBuffer和String的区别? * 前者长度和内容可变,后者不可变. * 如果使用前者做字符串的拼接,不会浪费太多的 ...

  3. Java常用类:StringBuilder

    一.介绍 2 3 4 5 //同样,StringBuilder也是final修饰的不可变,相比String来说,继承了AbstractStringBuilder,StringBuffer也是同样继承了 ...

  4. Java常用类StringBuffer详解

    内容多为最近学习的自我总结,可能有些地方写的不严谨,甚至会有错误的地方,仅供参考,如发现错误敬请指出,谢谢! 灰色字体为补充扩展内容,多为帮助自己理解. StringBuffer概述: 线程安全的可变 ...

  5. Java基础 —— Java常用类

    Java常用类: java.lang包: java.lang.Object类: hashcode()方法:返回一段整型的哈希码,代表地址. toString()方法:返回父类名+"@&quo ...

  6. Java常用类学习笔记总结

    Java常用类 java.lang.String类的使用 1.概述 String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String ...

  7. Java 常用类总结(SE基础)

    本篇博客对java常用类相关知识进行了归纳总结,比较详细,适用于学习和复习. 1. 字符串相关的类 1.1 String String是一个final类,代表不可变的字符序列.不可被继承. Strin ...

  8. Java常用类的使用

    Java常用类 1. Optional 在我们的开发中,NullPointerException可谓是随时随处可见,为了避免空指针异常,我们常常需要进行 一 些防御式的检查,所以在代码中常常可见if( ...

  9. Java常用类之要点总结

    Java常用类之要点总结

  10. Java常用类:包装类,String,日期类,Math,File,枚举类

    Java常用类:包装类,String,日期类,Math,File,枚举类

随机推荐

  1. 0基础掌握接口测试神器-Postman

    一:Postman环境搭建 1:postman是什么?Postman是一款功能强大的网页调试与发送网页HTTP请求的接口测试工具.2:postman有几种安装方式?两种,应用程序和浏览器插件 3:po ...

  2. Java线上问题排查神器Arthas快速上手与原理浅谈

    前言 当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题: 程序在稳定运行了,可是实现的功能点了没反应. 为了修复Bug而上线的新版本,上线后发现Bug依然在,却想不通哪里有问题? 想到可 ...

  3. 标准git请求

    initCate() // 定义加载文章分类的方法 function initCate() { $.ajax({ method: 'GET', url: '/my/article/cates', su ...

  4. springMVC使用JSR303数据校验

    JSR303注解 hibernate validate是jsr 303的一个参考实现,除支持所有的标准校验注解外,他还支持扩展注解 spring4.0拥有自己独立的数据校验框架,同时支持jsr 303 ...

  5. 接口测试中GET方法的获取

    今天在这里给大家介绍一下get方法,其实这些方法大家可以看一下源码里面的介绍只需要在代码中输入: import requests help(requests) 就可以看到带有示例的解释: 现在我们来完 ...

  6. python数值运算 四则运算

    数值运算 描述 获得用户输入的一个字符串,格式如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬ ...

  7. Urule开源版系列4——Core包核心接口之规则解析过程

    Urule运行规则文件,是如何进行的,通过一个请求doTest来探一下 com.bstek.urule.console.servlet.respackage.PackageServletHandler ...

  8. UniRapidJson

    https://github.com/takezoh/UniRapidJson 如何编译安卓 cd ~/UniRapidJson/build/android make 生成的so可以在 /Users/ ...

  9. 终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!

      本文已经同步到微信公众号「极客起源」 . 现在都在谈论全场景开发,也就是用一套开发工具,可以开发包括但不限于桌面.移动.IOT.游戏.Web等平台的应用.这样对于开发人员是非常爽的.本文将介绍微软 ...

  10. 二.spring boot第一个web服务

    通过<一.spring boot初始化项目>我们已经会初始化spring boot项目,那本篇文章就说明下初始化项目的具体内容,并编写第一个Hello页面. 项目结构 mvnw.mvnw. ...