一、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