当前位置: 首页 > news >正文

JAVA学习

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 中,有属性 byte[] value,但不是final // 该 value 数组存放字符串内容,因此是存放在堆中的 // 4. StringBuffer 是一个 final 类,不能被继承。 StringBuffer sb = new StringBuffer(); } }

String vs StringBuffer

特性StringStringBuffer
底层存储private final char[] value(JDK8)/byte[](JDK9+)char[] value(无 final 修饰)
可变性不可变(值不能改,只能改引用地址)可变(直接修改数组内容,地址不变)
内存 / 效率每次修改新建对象,效率低、耗内存原地修改内容,效率高、省内存
线程安全天然线程安全(不可变)线程安全(方法加了synchronized

构造器

public class StringBuffer01 { 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()+16 StringBuffer hello = new StringBuffer("hello"); } }

String和StringBuffer相互转换

public class StringAndStringBuffer { public static void main(String[] args) { // String ---> StringBuffer String str = "hello tom"; // 方式1 使用构造器 // 注意:返回的才是StringBuffer对象,对str 本身没有影响 StringBuffer stringbuffer = new StringBuffer(str); // 方式2 StringBuffer stringbuffer1 = new StringBuffer(); stringbuffer1 = stringbuffer1.append(str); // StringBuffer ---> String StringBuffer stringbuffer2 = new StringBuffer("hello java"); // 方式1 使用 StringBuffer 提供的 toString 方法; String s = stringbuffer2.toString(); // 方式2 使用构造器 String s1 = new String(stringbuffer2); } }

常见方法

1)增 append
2)删 delete(start,end)
3)改 replace(start,end,string)//将start----end间的内容替换掉,不含end
4)查indexOf//查找子串在字符串第1次出现的索引,如果找不到返回-1
5)插 insert
6)获取长度length

public class StringBufferMethod { public static void main(String[] args) { // 增 StringBuffer s1 = new StringBuffer("hello,world"); s1.append("*and*you"); System.out.println(s1); // hello,world*and*you s1.append("*java,").append(12).append(true); System.out.println(s1); // hello,world*and*you*java,12true // 删 delete(start,end) s1.delete(12,19); System.out.println(s1); // hello,world**java,12true // 改 replace(start,end,string) s1.replace(11,13,"##"); System.out.println(s1); // 查indexOf int a = s1.indexOf("##"); System.out.println(a); // 11 // 插 insert s1.insert(11,"**"); System.out.println(s1); // hello,world**##java,12true // 获取长度length System.out.println(s1.length()); // 26 } }

测试题

判断下面代码的输出结果:

public class StringBufferExercise01 { public static void main(String[] args) { String str = null; StringBuffer sb = new StringBuffer(); sb.append(str); System.out.println(sb.length()); System.out.println(sb); StringBuffer sb1 = new StringBuffer(str); System.out.println(sb1); } } /* * 结果: * sb.append(str); // 追溯源码,底层调用的是AbstractStringBuilder 的appendNull() * System.out.println(sb.length()); // 输出 4 * System.out.println(sb); // 输出null StringBuffer sb1 = new StringBuffer(str); // 追溯源码:AbstractStringBuilder(String str) { // int length = str.length(); ... }在这里会抛出空指针异常 * */

StringBuilder类

基本介绍

1)一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。
2)在StringBuilder上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。

常用方法

StringBuilder 和 StringBuffer 均代表可变的字符序列,方法是一样的,所有使用StringBuffer一样。

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

String、StringBuilder 和 StringBuffer的比较

1)StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
2)String:不可变字符序列,效率低,但是复用率高。
3)StringBuffer:可变字符序列、效率较高(增删)、线程安全
4)StringBuilder:可变字符序列、效率最高、线程不安全
5)String使用注意说明:
String s="a"; //创建了一个字符串
s+=“b";//实际上原来的”a”字符串对象已经丢弃了,现在又产生了一个字符串s+“b”(也 就是”ab”)。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在 内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。所有如果我 们需要对String做大量修改,不要使用String。

效率比较:StringBuilder > StringBuffer > String

String、StringBuilder 和 StringBuffer的选择

使用的原则,结论:
1.如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuilder
2.如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder
3.如果字符串存在大量的修改操作,并在多线程的情况,使用StringBuffer
4.如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等

http://www.jsqmd.com/news/463227/

相关文章:

  • Java基础——类和对象
  • HoRain云--BIOS快速检查硬盘识别全攻略
  • 腾讯云部署 OpenClaw:云服务器真的需要图形界面(GUI)吗?顶级工程师的深度复盘
  • 企业级BI选型终极指南:2026年五大平台深度横评与关键决策指标
  • Winscope高级疑问“Invisible due to”是如何来的呢?
  • HoRain云--Python爬虫必看:NoneType错误终极解决指南
  • 3种方法:如何将PPT文件变成PPS放映格式
  • 多租户数据隔离实战:衡石科技如何保障企业级SaaS服务的数据安全?
  • 论文人狂喜!Paperxie 界面深度拆解:毕业论文初稿 + 绘图 + 排版 + AI 率,一个页面全搞定
  • HoRain云--MySQL锁机制:高并发与数据安全艺术
  • 论文写作新范式:Paperzz 如何破解毕业论文初稿、绘图、排版与 AI 率四大难题
  • 【游戏设计】潜行游戏
  • 2026 毕业论文破局指南:Paperzz 一站式搞定初稿、绘图、排版与 AI 率,告别毕业季焦虑
  • 消费增值:商业新赛道上绿色积分的“王者”
  • ssm+java2026年毕设商场后台管理系统【源码+论文】
  • 拒绝 API 堆砌:当“AI 龙虾”打破传统软件工程的确定性边界
  • 孩子沉迷手机不用愁!oppo远程管控vivo,家长高效兼顾工作和管娃
  • 音视频对齐 webrtc解决方案
  • 01---js基础
  • Python 底层调试和性能分析的高级技巧,主要用于解决 C 扩展、解释器内核级别的问题,或者对 Python 程序进行深度性能剖析
  • Matlab _ Simulink仿真设计 自动化,电气工程和电子信息相关专业仿真都可电力电子仿真,整流逆变电路仿真,电机双闭环调速、模糊 PID 仿真, LQR 仿真,风力发电、光储微电网系统、电机
  • 工业架构实战:打通MES与AGV机器人梯控系统的通信与状态机设计
  • 图像算法中难样本优化策略
  • 云端部署避坑指南:OpenClaw 3.2 接入 DeepSeek、Kimi 与通义千问的深度复盘
  • ssm+java2026年毕设商超零售送货到家购物系统【源码+论文】
  • 一文理清端口、ARP、ICMP、CDN 核心逻辑,新手也能轻松入门(兼顾通俗与专业)
  • 2026新疆中央空调优质服务商推荐指南 - 优质品牌商家
  • matlab anybody opensim包括人机耦合建模、缩放、运动学_逆动力学分析,以及自由度扩建、肌肉重建、RRA_CMC仿真,从理论到代码手把手教会运动生物力学数据代处理、辅导
  • B级数据中心机房建设规划设计方案(PPT文件)
  • 告别论文焦虑:PaperXie 手把手带你搞定毕业论文初稿,绘图排版 AI 率一步到位