常见对象(StringBuffer类的概述)
在我之前的一篇博客中,讲解了字符串拼串,在这里大概提一下:
- 在一个主方法中执行
s = "world" + "java";
语句时,因为方法区中的常量池中不存在字符串常量"world"
、"java"
,所以会在常量池中先创建这两个字符串常量,要注意:字符串一旦定义之后,长度是不可变的 - 之后会将这两个字符串常量拼接在一起之后创建一个新的字符串常量之后将地址值赋给局部变量
s
,也就是说,在执行到s = "world" +"java"
语句时,会在常量池中创建三个字符串常量,
上述就是在字符串拼串的时候会发生的情况,这样做比较浪费空间,所以为了解决这种情况,就产生了StringBuffer
StringBuffer
类概述:
- 我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的
String
对象,既耗时,又浪费空间。而StringBuffer
就可以解决这个问题。 - 它是线程安全的可变字符序列,一个类似于
String
的字符串缓冲区,不能修改,但通过某些方法调用可以改变该序列的长度和内容。 - 可以将它看成一个长度可变的字符容器,可以存储多个字符,可以不断的往容器中追加内容
常见对象(StringBuffer类的构造方法)
构造方法摘要:
StringBuffer()
构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。StringBuffer(int capacity)
构造一个不带字符,但具有指定初始容量的字符串缓冲区。StringBuffer(String str)
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
StringBuffer
的两个基本方法:
-
public int capacity()
:返回当前容量,是理论值 -
public int length()
:返回长度(字符数),是实际值
代码示例1:
package org.westos.demo2;
/**
* @Author: Administrator
* @CreateTime: 2019-04-27 09:14
*/
public class MyTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
int capacity = sb.capacity();
System.out.println(capacity);
int length = sb.length();
System.out.println(length);
System.out.println("...................................");
StringBuffer sb2 = sb.append(100);
/*往容器中追加了一个int类型的数据,该方法的返回值类型依然是StringBuffer类型 ,是它本身*/
capacity = sb.capacity();
System.out.println(capacity);
//获取长度
length = sb.length();
System.out.println(length);
sb2.append("abdefafdasfasdfasdfasdfasdfwfsefesfesfd");
capacity = sb.capacity();
System.out.println(capacity);
//获取长度
length = sb.length();
System.out.println(length);
}
}
通过上述的讲解可知上面的代码最终运行结果为:
16
0
...................................
16
3
42
42
从上述执行结果可以看出在执行完StringBuffer sb2 = sb.append(100);
语句时,sb2
和sb
都指向那段容器
常见对象(StringBuffer的添加功能)
在上述代码中使用到了StringBuffer
的添加功能,以下是对该类的相关功能的详解
StringBuffer
的添加功能:
public StringBuffer append(String str)
:可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身,因为返回值是字符串缓存区本身,所以可以使用链式编程不断往容器之中添加内容
代码示例2:
package org.westos.demo2;
/**
* @Author: Administrator
* @CreateTime: 2019-04-27 09:26
*/
public class MyTest2 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
//追加那个完之后返回的还是原来的容器
StringBuffer sb2 = sb.append("abc");
sb2.append(100);
System.out.println(sb==sb2);
System.out.println(sb2);
}
}
通过之前的讲解可以知道上述代码最终运行结果为:
true
abc100
在上述代码中:
- 由于append方法返回值类型是对象即字符串缓冲区也就是通俗上讲的容器本身,所以
System.out.println(sb==sb2);
语句执行结果为true
- 使用的是
StringBuffer
的第三个构造方法,将字符串缓冲区中初始化为abc
之后又添加了100
,在执行System.out.println(sb2)
语句时,会默认在对象的后面加上.toString
方法来打印该对象即字符串缓冲区中的内容(toString
方法被重写了)
代码示例3:
package org.westos.demo2;
/**
* @Author: Administrator
* @CreateTime: 2019-04-27 09:28
*/
public class MyTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append(100).append(true).append("abv").append("cccc");
sb.append(new char[]{'a','c','d'});
sb.append(new Object());
//把容器中的内容取出来转成字符
String string = sb.toString();
System.out.println(string);
String string1 = new StringBuffer("abc").append("100").toString();
System.out.println(string1);
}
}
代码运行结果为:
100trueabvccccacdjava.lang.Object@1540e19d
abc100
- 在上面讲到
append
方法可以把任意类型数据添加到字符串缓冲区中,并且把任意类型数据用黑体标注出来,上面代码就是关于这句话的示例:append
方法会将括号中的内容转换为字符串之后添加到字符串缓冲区中,对象的话就会将该对象的地址的字符串形式加入字符串缓冲区中 - 同样,在将字符串拼接完成后,可以使用
toString
方法来获取缓冲区中的内容 - 链式编程格式
public StringBuffer insert(int offset,String str)
:在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身,同样可以使用链式编程,不需要接收返回值,和上述类似,在这里不做详解
代码示例4:
package org.westos.demo3;
/**
* @Author: Administrator
* @CreateTime: 2019-04-27 09:34
*/
public class MyTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append(100).append(200);
//在指定的索引处插入内容
sb.insert(1, "abc");//返回的还是原来的容器
System.out.println(sb);
}
}
可以知道上述代码运行结果为:
1abc00200
常见对象(StringBuffer的删除功能)
StringBuffer
的删除功能:
public StringBuffer deleteCharAt(int index)
:删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end)
:删除从指定位置开始指定位置结束的内容(含头不含尾),并返回本身
代码示例5:
package org.westos.demo3;
/**
* @Author: Administrator
* @CreateTime: 2019-04-27 09:37
*/
public class MyTest2 {
public static void main(String[] args) {
//删除相关的方法
StringBuffer sb = new StringBuffer("abcafeadsfaewfasdf你好啊");
//根据指定索引删除单个字符,返回的还是容器本身
sb.deleteCharAt(0);
sb.delete(0, sb.length());//根据开始索引,和结束索引删除一段数据 含头不含尾 返回的还是容器本身
System.out.println(sb);
}
}
代码运行结果为:
缓冲区中的字符串被删除完了,所以没有输出结果
常见对象(StringBuffer的替换和反转功能)
StringBuffer
的替换功能
public StringBuffer replace(int start,int end,String str)
: 从start
开始到end
用str
替换,同样含头不含尾
代码示例6:
package org.westos.demo3;
/**
* @Author: Administrator
* @CreateTime: 2019-04-27 09:50
*/
public class MyTest {
public static void main(String[] args) {
//替换的方法
StringBuffer sb = new StringBuffer("abc ccc ddd fff");
//从开始索引,到结束索引,替换成新的内容,返回的还是容器本身
sb.replace(0, sb.length(), sb.toString().substring(0,sb.indexOf(" ")));
System.out.println(sb);
}
}
上述代码的最终运行结果为:
abc
StringBuffer
的反转功能
public StringBuffer reverse()
:字符串反转
代码示例7:
package org.westos.demo3;
/**
* @Author: Administrator
* @CreateTime: 2019-04-27 09:55
*/
public class MyTest4 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abcd");
//反转容器中的内容,返回的还是容器本身
sb.reverse();
System.out.println(sb);
}
}
运行结果为:
dcba
常见对象(StringBuffer 检索的功能)
int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引。
int indexOf(String str, int fromIndex)
从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
int lastIndexOf(String str)
返回最右边出现的指定子字符串在此字符串中的索引。
int lastIndexOf(String str, int fromIndex)
返回最后一次出现的指定子字符串在此字符串中的索引。
常见对象(StringBuffer的截取功能及注意事项)
StringBuffer
的截取功能:
public String substring(int start)
: 从指定位置截取到末尾
public String substring(int start,int end)
: 截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
注意事项
注意:返回值类型不再是StringBuffer
本身,而是字符串类型
常见对象(StringBuffer和String的相互转换)
String --------> StringBuffer
-
通过构造方法(构造方法指的是StringBuffer类的构造方法)
-
通过append()方法
StringBuffer --------> String
-
使用substring方法
-
通过构造方法
-
通过toString()方法
代码示例8:(省略主方法)
StringBuffer sb5= new StringBuffer("abc");
//方式1
String string = sb5.toString();
//方式2
String substring = sb5.substring(0);
//方式3
//String(StringBuffer buffer)
//分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。
String s = new String(sb5); //构造方法是指String类的构造方法