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

【高级编程】实用类详解(补充)StringBuffer类 和 StringBuilder类

文章目录

    • 为什么使用StringBuffer?
    • StringBuffer
      • 1.声明
      • 2.常用方法
      • 3.举例
      • 4.时间戳
    • StringBuilder
    • StringBuffer VS StringBuilder


为什么使用StringBuffer?

StringBuffer 是 Java 中的一个可变字符序列类,允许在原始对象上进行修改,而不会生成新的字符串对象。与 String 比较,StringBuffer 具有以下优势:

  1. 可变性: StringBuffer 对象的内容可以被修改而不创建新的对象,适合需要频繁修改字符串的场景。
  2. 性能: 对于需要大量字符串拼接或修改的操作,StringBuffer 性能更优,因为它减少了内存分配和垃圾回收的开销。

使用 String

public class StringExample {public static void main(String[] args) {String str = "Hello";str += " World"; // 每次拼接都会创建新的 String 对象str += "!";System.out.println(str); // 输出: Hello World!}
}

每次使用 + 操作符时,都会创建一个新的 String 对象并复制内容,性能较低。

使用 StringBuffer

public class StringBufferExample {public static void main(String[] args) {StringBuffer sb = new StringBuffer("Hello");sb.append(" World"); // 直接在原始对象上修改sb.append("!");System.out.println(sb.toString()); // 输出: Hello World!}
}

StringBuffer 在同一个对象上进行修改,性能更好,适合频繁修改字符串的场景。


StringBuffer

对字符串频繁修改(如字符串连接)时,使用StringBuffer类可以大大提高程序执行效率

1.声明

StringBuffer strb = new StringBuffer();
StringBuffer strb = new StringBuffer("aaa");

2.常用方法

方法描述
append(String str)将指定的字符串追加到此 StringBuffer 对象的末尾
insert(int offset, String str)将指定的字符串插入到此 StringBuffer 对象的指定位置
delete(int start, int end)删除从指定开始索引到结束索引之间的字符
replace(int start, int end, String str)用指定的字符串替换从指定开始索引到结束索引之间的字符
reverse()将此 StringBuffer 对象中的字符序列反转
charAt(int index)返回指定索引处的字符
setCharAt(int index, char ch)用指定的字符替换指定索引处的字符
length()返回 StringBuffer 对象的当前长度(字符数)
capacity()返回当前 StringBuffer 对象的容量(可容纳的字符数)
toString()StringBuffer 对象的内容转换为 String 对象
StringBuffer sb = new StringBuffer("Hello");
// 追加字符串
sb.append(" World");
System.out.println("After append: " + sb);
// 插入字符串
sb.insert(6, "Amazing ");
System.out.println("After insert: " + sb);
// 删除字符
sb.delete(6, 14);
System.out.println("After delete: " + sb);
// 替换字符
sb.replace(6, 11, "Java");
System.out.println("After replace: " + sb);
// 反转字符串
sb.reverse();
System.out.println("After reverse: " + sb);
// 获取字符
char ch = sb.charAt(3);
System.out.println("Character at index 3: " + ch);
// 设置字符
sb.setCharAt(3, 'X');
System.out.println("After setCharAt: " + sb);
// 获取长度和容量
int length = sb.length();
int capacity = sb.capacity();
System.out.println("Length: " + length);
System.out.println("Capacity: " + capacity);
// 转换为字符串
String str = sb.toString();
System.out.println("Converted to String: " + str);
After append: Hello World
After insert: Hello Amazing World
After delete: Hello World
After replace: Hello Java
After reverse: avaJ olleH
Character at index 3: J
After setCharAt: avaX olleH
Length: 10
Capacity: 21
Converted to String: avaX olleH

3.举例

将一个数字字符串格式化为带有千位分隔符的形式(即在每三位数字之间添加逗号)

//将一个数字字符串转换成逗号分隔的数字串,即从右边开始每三个数字用逗号分隔 
public class NumberFormatter {public static String formatNumber(String number) {// 检查字符串是否为空if (number == null || number.trim().isEmpty()) {return number;}StringBuffer formattedNumber = new StringBuffer();int length = number.length();// 从右到左遍历字符串for (int i = length - 1; i >= 0; i--) {if (i < length - 1 && (length - i -1) % 3 == 0) {formattedNumber.append(',');}formattedNumber.append(number.charAt(i));}// reverse() 方法将字符串缓冲区中的字符顺序反转回正常的顺序// (因为之前是从右到左添加的)formattedNumber.reverse();// 将 StringBuffer 转换为 String 并返回格式化后的结果return formattedNumber.toString();}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入一串数字:");String inputNumber = scanner.next();System.out.println(formatNumber(inputNumber));}
}

另一种写法:

long begin = System.currentTimeMillis();
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一串数字:");
String inputNumber = scanner.next();StringBuffer formattedNumber = new StringBuffer(inputNumber);
for (int i = inputNumber.length() - 3; i > 0; i -= 3) {formattedNumber.insert(i, ",");
}System.out.println("格式化后的数字: " + formattedNumber);
long time = System.currentTimeMillis() - begin;
System.out.println("处理时间: " + time + "毫秒");

上述例子中用到了 System.currentTimeMillis() ,下面介绍一下时间戳。

4.时间戳

System.currentTimeMillis() 是 Java 中的一个静态方法,用于获取当前时间的时间戳(即自1970年1月1日00:00:00 UTC起经过的毫秒数)。该方法属于 java.lang.System 类。

long currentTime = System.currentTimeMillis();

  • 返回一个 long 类型的值,表示当前时间的毫秒值。

StringBuilder

StringBuffer 是可变的字符串,String 是不可变对象,经常改变内容的字符串最好不要使用 String,可使用更高效的 StringBuffer,JDK5.0 后提供了 StringBuilder,等价 StringBuffer。

StringBuffer VS StringBuilder

stringBuffer 虽速度慢,但是线程安全,方法是同步的。

StringBuffer sb = new stringBuffer();
sb.append("he11o");
sb.append(",gmy"); // 向后追加
sb.insert(0,"HZ"); // 指定位置进行插入
System.out.printin("sb: " + sb.tostring()); // 转换为string类型
sb: HZhe11o,gmy

stringBuilder 速度快,但是线程不安全,方法不是同步的。

StringBuilder sb = new stringBuilder();
sb1.append("he11o");
sb1.append(",gmy"); // 向后追加
sb1.insert(0,"HZ"); // 指定位置进行插入
System.out.print]n("sb: " + sbl.tostring()); // 转换为string类型
sb: HZhe11o,gmy

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • UE5 C++ 读取图片插件(一)
  • 【刷题笔记】删除并获取最大点数粉刷房子
  • 2024国赛数学建模A题思路模型代码
  • 计算机网络 第1章 概述
  • C++的四种规范的类型转换
  • 坐牢第三十四天(c++)
  • shell判断、if语句
  • 探索C++编程技巧:计算两个字符串的最长公共子串
  • 内网Exadata使用git的配置过程
  • 一、VSCode安装IDF5.3
  • 数据结构---->内核链表
  • 解决:使用Charles查看本机的ip地址
  • 数学建模常见模型(下)
  • 【HTTP、Web常用协议等等】前端八股文面试题
  • 【 WPF 中常用的Brush类的简要介绍、使用方法和适用场景】
  • php的引用
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • CentOS7简单部署NFS
  • Java编程基础24——递归练习
  • log4j2输出到kafka
  • maya建模与骨骼动画快速实现人工鱼
  • python_bomb----数据类型总结
  • React Native移动开发实战-3-实现页面间的数据传递
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • TCP拥塞控制
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue自定义指令实现v-tap插件
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 力扣(LeetCode)56
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 硬币翻转问题,区间操作
  • 1.Ext JS 建立web开发工程
  • Spring第一个helloWorld
  • 函数计算新功能-----支持C#函数
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (分布式缓存)Redis分片集群
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (利用IDEA+Maven)定制属于自己的jar包
  • (四)stm32之通信协议
  • (转)我也是一只IT小小鸟
  • (转载)Linux 多线程条件变量同步
  • .NET技术成长路线架构图
  • .NET中的Exception处理(C#)
  • .Net中的集合
  • @我的前任是个极品 微博分析
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [20171102]视图v$session中process字段含义
  • [Android]使用Retrofit进行网络请求
  • [Android]通过PhoneLookup读取所有电话号码
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [C++]unordered系列关联式容器
  • [FlareOn6]Overlong