首页 > 编程语言 >Java 基础复习——StringBuffer 和 StringBuilder

Java 基础复习——StringBuffer 和 StringBuilder

时间:2023-07-01 09:55:44浏览次数:63  
标签:Java String int StringBuilder System StringBuffer 字符串

StringBuffer 和 StringBuilder

StringBuffer 类 简介

  • java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删

  • 很多方法和 String 相同,但 StringBuffer 是可变长度的

  • StringBuffer 是一个容器

image

注意:

  1. StringBuffer 的直接父类是 AbstractStringBuilder 有属性 char[] value,不是 final 修饰
  2. StringBuffer 实现了 Serializable,即 StringBuffer 的对象可以串行化(可以网络传输,可以保存到文件)
  3. StringBuffer 是一个 final 类,不能被继承

StringBuffer 和 String 对比

  • String 保存的是字符串常量,里面的值不能更改,每次 String 类的更新实际上就是更改地址,效率较低 // private final char[ ] value
  • StringBuffer 保存的是字符串变量,里面的值可以更改,不用每次更新地址,效率较高 // char[ ] value 放在堆中

StringBuffer的构造器

// Constructor and Description
StringBuffer()
// 构造一个其中不带字符的字符串缓冲区,其初始容量为16个字符
StringBuffer(CharSequence seq)
// 构造一个字符串缓冲区,包含与指定的CharSequener相同的字符
StringBuffer(int capacity)
// 构造一个其中不带字符,但具有指定初始容量的的字符串缓冲区,即对char[]大小进行指定
StringBuffer(String str)
//// 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容

StringBuffer 和 String 的相互转换

String ---> StringBuffer

String s = "hello";

方式一:

 StringBuffer b1 = new StringBuffer(s);

方式二:

StringBuffer b2 = new StringBuffer();
b2.append(s);

StringBuffer ---> String

方式一:

String s2 = b1.toString()

方式二:

String s3 = new String(b1);

StringBuffer 常用方法

StringBuffer	append()	// 增
StringBuffer	delete(int start, int end)	// 删
StringBuffer	insert() // 插入
StringBuffer	replace(int start, int end, String str)	// 改
int	indexOf(String str) // 查
int	length() // 获取长度

练习题

String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str);  // 调用的AbstractStringBuilder的 appendNull方法
System.out.println(sb.length()); // 4 null --> value = {'n', 'u', 'l', 'l'}
System.out.println(sb.capacity()); // 16


System.out.println(sb);
StringBuffer sb1 = new StringBuffer(str); //NullPointerException super(str.length() + 16);
System.out.println(sb1);

StringBuilder 类 简介

  • 一个可变的字符序列。此类提供与 StringBufffer 兼容的API,但不保证同步。被设计作为 StringBuffer 的建议替换,用在字符串被单个线程使用的时候。如果可能,建议有限采用该类,因在在大多数实现中,他比 StringBuffer 要快。两者的方法基本相同

image

注意:

  1. StringBuilder 是 final 类,不能被继承
  2. 继承了 AbstractStringBuilder,属性 Char[ ] value,因此字符序列是在堆中
  3. 实现了 Serialzable 接口,序列号(所谓序列号即可以保存类型和数据本身)
  4. StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用

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
    */
    

    效率测试

long startTime = 0L;
long endTime = 0L;
// StringBuffer
StringBuffer stringBuffer = new StringBuffer("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
    stringBuffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime));

// StringBuilder
StringBuilder stringBuilder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
    stringBuilder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime));

//String
String text = "";
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
    text += i;
}
endTime = System.currentTimeMillis();
System.out.println("String的执行时间:" + (endTime - startTime));

// StringBuffer的执行时间:5
//StringBuilder的执行时间:2
//String的执行时间:1463
// 测试结果:StringBuilder > StringBuffer > String

String、StringBuffer 和 StringBuilder 的选择

使用的原则、结论:

  1. 如果字符串存在大量的修改操作,一般使用StringBuffer 和 StringBuilder

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

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

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

标签:Java,String,int,StringBuilder,System,StringBuffer,字符串
From: https://www.cnblogs.com/ai135/p/17518877.html

相关文章

  • Java的MVC设计模式,带你深刻理解MVC
    什么是MVC?就是ModelViewControl,模型视图控制器。MVC流程图解1.MVC概念:MVC本来是存在于Desktop程序中的,M(Model)是指数据模型,V(View)是指用户界面,C(Control)是控制器。使用MVC的最直接目的就是将M和V实现代码分离,C则是确保M和V的同步,一旦M改变,V应该同步更新。2.MVC工作方......
  • Java中的内部类,代码块
    前言学习Java过程中,对内部类和代码块部分知识比较模糊,容易忘掉。今天再学的时候有一些其他的收获,整理记录一下。1.代码块代码块的作用可以为初始化变量。都在在构造器方法之前执行,分为静态代码块和匿名代码块。静态代码块是在类加载时执行,因此只执行一次。匿名代码块在new实......
  • JAVA石头迷阵游戏
    大家帮我看看这个代码有没有问题,为什么将z设为作弊器但是在IDE中运行出来没有用//测试类importjavax.swing.*;publicclassTest{publicstaticvoidmain(String[]args){newMainFrame();}}importjavax.swing.*;importjava.awt.event.ActionEvent;......
  • java相关
    1、java环境建立2、windows系统下maven环境设置windows系统下下载二进制包apache-maven-3.6.0-bin.zip,然后解压。 第二种方法:使用绝对路径添加maven环境变量,直接在path里面的最前面添加c:\maven\bin;4、windows安装tomcat  设置环境变量也用绝对路径下载https://tomcat.apache.......
  • Java 期中考试及pta4、5总结
    菜单计价1~3(1)前言:期中考试的题目比较简单但是具有典型意义,ptA的题和之前的大差不差,所以会省略一些总体来说这几次作业还是对Java的学习有较大的帮助的,需要认真对待(2)设计与分析:一测验1-圆类设计下面是题目要求:7-1测验1-圆类设计分数 12......
  • centos7安装java
    1.tar-zxvfjdk-8u11-linux-x64.tar.gz 2.编辑环境变量vim/etc/profile 3.source/etc/profile4.java-version ......
  • [转]前台传递给后台的JSON字符串中的引号 “” 在JAVA后台被转义为 &quot
    1、问题:前台数据,JSON字符串带有引号“”,数据被传递到后台,引号被转义为&quot,后台无法解析。前台数据如下:正常后台数据如下:大部分正常,只有JSON字符串中的“”被转义为&quot2、解决:方法一:使用apache的lang包里的方法StringappJson=StringEscapeUtils.un......
  • 深入学习 Java 类加载机制
    博主介绍:✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,阿里云专家博主,华为云云享专家✌......
  • Java-语法基础
    JDK8复习用Java前置知识JavaSEJavaStandardEdition标准版支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API此版本以前称为J2SEJavaEEJavaEnterpriseEdition企业版一套用于企业环境下的应用程序的应用方案(包含:Servlet、Jsp),主要针......
  • Java基础语法
    1、Java的八种基本数据类型1、byte1字节取值范围:-128~1272、short2字节取值范围:-32768~327673、int4字节取值范围:-231~231-1#int是开发中最常用的,也是Java中默认的数据类型4、long8字节取值范围:-263~263-1#声明超过int取值范围的lon......