1、字符串缓冲区
理解:Java内存层面的一款容器(crud操作)
引入场景:
?? ?根据需求需要对某字符串内容进行频繁的改动操作,
?? ?如果使用String类原生的方式进行处理,则会在内存中产生大量的对象;
?? ?面临的问题:内存压力剧增、程序的效率变低
?? ?此时Java设计者提出了字符串缓冲区这种技术,就是用来解决上述的问题
作用/价值:
?? ?对于字符串内容的频繁改动操作,自始至终不会产生新对象
类型:
1)、java.lang.StringBuffer类
2)、java.lang.StringBuilder类
【区别】:StringBuffer和StringBuilder的区别
都用于描述字符串缓冲区,并且是等价类,兼容api,所有api名字都相同;
StringBuffer类:
?? ??? ?jdk1.0就存在(古老)
?? ??? ?实行了同步,意味着是线程安全的类,效率低
StringBuilder类:
?? ??? ?jdk1.5版本才出现(较新)
?? ??? ?没有实行同步,意味着是线程不安全的类,效率高
常用构造方法:
StringBuilder()?
? ? ? ? ? 构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符。
StringBuilder(int capacity)?
? ? ? ? ? 构造一个不带任何字符的字符串生成器,其初始容量由 capacity 参数指定。?
StringBuilder(String str)?
? ? ? ? ? 构造一个字符串生成器,并初始化为指定的字符串内容。
?? ? ?
?2、常用方法:因为两个类的api名完全一样,下面只以StringBuilder为例,使用它的机率更大:
/*
1、增操作:
append
insert
*/
sb.append("abc").append(123).append(3.14).append(true);
sb.insert(5, "java");
/*
2、删操作:
delete
deleteCharAt
*/
sb.delete(5, 8); //含头不含尾
sb.deleteCharAt(5);
/*
2、改操作:
reverse
setCharAt
setLength
*/
sb.reverse();
sb.setCharAt(5, 'W');
sb.setLength(10); //将容量设为10
3、为了比较String、StringBuilder、StringBuffer的性能与空间使用率,需要讲一个拓展:
System类:
?? ?static long currentTimeMillis():返回以毫秒为单位的当前时间。?
?? ?解析方法:
?? ??? ?得到1970年1月1日0点0分0秒至这一刻的毫秒数?? ?称为:Unix时间戳
Runtime类:
?? ?static Runtime getRuntime():返回与当前 Java 应用程序相关的运行时对象。?
?? ?long totalMemory():返回 Java 虚拟机中的内存总量。?
?? ?long freeMemory():返回 Java 虚拟机中的空闲内存量。?
然后下面代码比较性能:
public class TestSB_2 {
public static void main(String[] args) {
// testString(); //String类耗时:5664 String类占用内存:315650056
// testStringBuffer(); //StringBuffer类耗时:20 StringBuffer类占用内存:5748280
testStringBuilder(); //StringBuilder类耗时:16 StringBuilder类占用内存:5748416
}
public static void testString() {
//记录当前时间
long start = System.currentTimeMillis();
String str = "";
for (int i = 1;i <= 100000;i++) {
str += i;
}
//记录当前时间
long end = System.currentTimeMillis();
System.out.println("String类耗时:" + (end - start));
Runtime rt = Runtime.getRuntime();
System.out.println("String类占用内存:" + (rt.totalMemory() - rt.freeMemory()));
}
public static void testStringBuffer() {
//记录当前时间
long start = System.currentTimeMillis();
StringBuffer sb = new StringBuffer("");
for (int i = 1;i <= 100000;i++) {
sb.append(i);
}
//记录当前时间
long end = System.currentTimeMillis();
System.out.println("StringBuffer类耗时:" + (end - start));
Runtime rt = Runtime.getRuntime();
System.out.println("StringBuffer类占用内存:" + (rt.totalMemory() - rt.freeMemory()));
}
public static void testStringBuilder() {
//记录当前时间
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder("");
for (int i = 1;i <= 100000;i++) {
sb.append(i);
}
//记录当前时间
long end = System.currentTimeMillis();
System.out.println("StringBuilder类耗时:" + (end - start));
Runtime rt = Runtime.getRuntime();
System.out.println("StringBuilder类占用内存:" + (rt.totalMemory() - rt.freeMemory()));
}
}
?本电子书目录:《Java基础的重点知识点全集》