首页 > 编程语言 >javase-14、StringBuffer

javase-14、StringBuffer

时间:2024-12-16 19:57:29浏览次数:15  
标签:字符 14 int StringBuffer str 字符串 javase String

一、StringBuffer

由于String是常量,因此一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,则只能创建新的字符串。
为了对字符串进行【修改】,Java提供了一个StringBuffer类(也称字符串缓冲区)。StringBuffer类和String类最大的区别在于它的内容和长度都是可以改变的。StringBuffer类似一个字符容器,当在其中添加或删除字符时,并不会产生新的StringBuffer对象。
  • java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符 串内容进行增删,此时不会产生新的对象。
  • 很多方法与String相同。

1、构建字符串对象

StringBuffer()
    构造一个其中没有字符且初始【容量】为 16 个字符的字符串缓冲区。
  	new StringBuffer() 
StringBuffer(int capacity)
    构造一个其中没有字符和指定初始容量的字符串缓冲区。
    new StringBuffer(160)
StringBuffer(String str)
    构造一个字符串缓冲区,初始化为指定字符串的内容。
    字符串缓冲区的初始容量是16加上字符串参数的长度。
	new StringBuffer("abc")  3+16

2、常用操作方法

1)追加
StringBuffer append(xxx);
	提供了很多的append()方法,用于追加拼接 
       StringBuffer sb = new StringBuffer("abc");
		sb.append(1);
        sb.append(2.0);
        sb.append("abc");
StringBuffer append(char[] str, int offset, int len)
    从str字符数组中,取出内容,并【追加】到StringBuffer中。
    str - 字符数组。
    offset - 偏移量。
    len - 长度【要保证够用,否则报错】
2)插入
StringBuffer insert(int offset, xxx)
    提供了很多的insert()方法,在指定位置【前】插入xxx
StringBuffer insert(int index, char[] str, int offset, int len)
    从str字符数组中,取出内容,并【插入】到StringBuffer中。
    index - 要插入的位置
    str - 字符数组。
    offset - 偏移量。
    len - 长度。
3)删除
StringBuffer delete(int start, int end)
    删除 start 到 end - 1 处的字符。
StringBuffer deleteCharAt(int index)
    删除此序列中指定位置的 char。
4)修改
StringBuffer replace(int start, int end, String str)
    用 str 中的字符串,替换从 start 到 end - 1 处的字符。
StringBuffer reverse()
	把当前字符序列逆转
void setCharAt(int index, char ch)
    指定索引处的字符设置为 `ch` 。
void setLength(int newLength)
    设置字符序列的长度,newLength参数可以小于已有长度,但必须 >= 0,
    当长度不够时,舍去已有尾部字符串
5)查询
char charAt(int index);   //取指定位置的字符
String substring(int start); //从指定位置开始,取字符串
String substring(int start, int end);//从指定位置开始-结束,取字符串
int indexOf(String  str); //返回子串在原字符串中的位置索引
int indexOf(String  str, int fromIndex);//返回子串在原字符串中的位置索引
int lastIndexOf(String  str);
int lastIndexOf(String  str, int fromIndex);
...

二、StringBuilder类

StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样。

  • 对比String、StringBuffer、StringBuilder

    • String(JDK1.0):不可变字符序列

    • StringBuffer(JDK1.0):可变字符序列、效率低、线程安全【性能不咋高】

    • StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全【性能高】

  • 注意:

    • 作为方法的参数传递时,方法内部不会改变String的值
    • 作为方法的参数传递时,方法内部可能会改变StringBuffer 和 StringBuilder的值

三者的效率测试

long startTime = 0L;
long endTime = 0L;
String text = "";
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
//开始对比
startTime = 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));

【面试题】程序输出

String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str);
System.out.println(sb.length());// 4
System.out.println(sb);//  null

StringBuffer sb1 = new StringBuffer(str);报错
System.out.println(sb1);// 

三、StringTokenizer

利用 java.util.StringTokenizer 的方法,可以将一个字符串拆分为一系列的标记(token)。StringTokenizer是为了兼容性原因而保留的遗留类,在新的代码中,不建议使用,而建议使用String类的split方法来完成拆分的功能。

1、构造方法

StringTokenizer(String str);
    str要被拆分的字符串
    构造一个字符串分词器,分词器使用默认的分隔符集,即 "空格\t\n\r\f"
StringTokenizer(String str, String delim);
    构造一个字符串分词器,并提供一个指定的分隔符。
StringTokenizer(String str, String delim, boolean returnDelims) 
   构造一个字符串分词器,并提供一个指定的分隔符,同时,指定是否返回分隔符。

注意:

分隔符的任意组合,仍然是分隔符

2、方法简介

int countTokens():返回【当前】token(单词)的个数,通extToken()取了过后countTokens()会发生变化
    
boolean hasMoreTokens():分词器中,是否还有token
boolean hasMoreElements():同上
    
String nextToken():从分词器中取出一个token;
Object nextElement():同上,但返回类型是 Object 而不是 String

3、例子

获取单词个数

String str = "you are welcome(thank you),nice to meet you";
StringTokenizer tokenizer = new StringTokenizer(str, ",() ");
System.out.println("共" + tokenizer.countTokens() + "单词");
while (tokenizer.hasMoreTokens()) {
    System.out.println(tokenizer.nextToken());
}

标签:字符,14,int,StringBuffer,str,字符串,javase,String
From: https://blog.csdn.net/weixin_42238065/article/details/144516022

相关文章

  • javase-15、正则表达式
    一、初识正则表达式1、概念正则表达式是对字符串操作的一种逻辑公式,它会将事先定义好的一些特定字符,以及这些特定字符的组合,组成一个规则字符串,并且通过这个规则字符串表达对给定字符串的过滤逻辑。一条正则表达式也称为一个模式,使用每个模式可以匹配指定文本中与表达式......
  • Spark向量化计算在美团生产环境的实践14
     1什么是向量化计算1.1并行数据处理:SIMD指令让我们从一个简单问题开始:假设要实现“数组a+b存入c”,设三个整型数组的长度都是100,那么只需将“c[i]=a[i]+b[i]”置于一个100次的循环内,代码如下:voidaddArrays(constint*a,constint*b,int*c,intnum){for(in......
  • 20222314 2024-2025-1 《网络与系统攻防技术》实验八实验报告
    202223142024-2025-1《网络与系统攻防技术》实验八实验报告1.实验内容1.1Web前端HTML能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML1.2Web前端javascipt理解JavaScript的基本功能,理解DOM在1的基础上,编写JavaScript验证用户名、密......
  • 找不到vcruntime140_1.dll无法执行该怎么恢复?dll丢失的解决方法
    在Windows操作系统中,我们经常会遇到一些运行时错误,其中一个常见的问题就是“找不到vcruntime140_1.dll”。这个错误通常发生在运行依赖于VisualStudio2015运行时库的应用程序时。本文将为您提供一些解决方案,帮助您恢复和解决这个问题。1.什么是vcruntime140_1.dll?vcrunti......
  • 数码管显示芯片/点阵LED驱动VK1624 SOP24/DIP24内置RC振荡器/可支持14×4点阵
    产品品牌:永嘉微电/VINKA产品型号:VK1624封装形式:SOP24/DIP24概述VK1624是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁存器、LED驱动等电路。SEG脚接LED阳极,GRID脚接LED阴极,可支持14SEGx4GRID、13SEGx5GRID、12SEGx6GRID、11SEGx7GRID的点阵LED显示......
  • springboot学生购书平台-毕业设计源码21403
    目录目录基于VUE的学生购书平台的设计与实现摘 要Abstract第1章绪论1.1选题背景及意义1.2研究现状1.3研究内容第2章关键技术介绍2.1Springboot技术框架2.2JAVA语言功能2.3B/S结构2.4MyMysql数据库2.5小程序框架以及目录结构介绍......
  • leetcode 1481. 不同整数的最少数目
    1481.不同整数的最少数目classSolution{public:intfindLeastNumOfUniqueInts(vector<int>&arr,intk){unordered_map<int,int>numAdded;for(int&num:arr)++numAdded[num];vector<pair<int,int>>num......
  • 11.14
    2. 返转返转(wraparound)是指当时钟的时标计数器值到达最大值后,如果再增加就变为 0 的过程。12 小时制的模拟时钟在每天的正午和午夜各会进行一次返转。Windows98 在连续运行 49 天后会因 32 位毫秒时标计数器的返转而挂起(请参见 Q216641)。当两位数的年份返转时会发生 Y......
  • 代码随想录算法训练营第四十四天|leetcode1143.最长公共子序列、leetcode1035.不相交
    1leetcode1143.最长公共子序列题目链接:1143.最长公共子序列-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划子序列问题经典题目|LeetCode:1143.最长公共子序列哔哩哔哩bilibili思路:其实我比较清楚的是和上面一道题目的思路,差不太多,但是我不知道非连续的位置应该如何......
  • USACO备考冲刺必刷题 | P1460 Healthy Holsteins
    学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考学习过程中的题目,记录每一个瞬间。附上汇总贴:USACO备考冲刺必刷题|汇总-CSDN博客【题目描述】农民John以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,......