当前位置: 首页 >  资讯 > 资讯 > 正文

Java 基础复习——StringBuffer 和 StringBuilder

时间:2023-07-01 10:20:03 编辑:admin

StringBuffer 和 StringBuilderStringBuffer 类 简介

java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删


(资料图)

很多方法和 String 相同,但 StringBuffer 是可变长度的

StringBuffer 是一个容器

注意:

StringBuffer 的直接父类是 AbstractStringBuilder 有属性 char[] value,不是 final 修饰StringBuffer 实现了 Serializable,即 StringBuffer 的对象可以串行化(可以网络传输,可以保存到文件)StringBuffer 是一个 final 类,不能被继承StringBuffer 和 String 对比String 保存的是字符串常量,里面的值不能更改,每次 String 类的更新实际上就是更改地址,效率较低 // private final char[ ] valueStringBuffer 保存的是字符串变量,里面的值可以更改,不用每次更新地址,效率较高 // char[ ] value 放在堆中

StringBuffer的构造器

// Constructor and DescriptionStringBuffer()// 构造一个其中不带字符的字符串缓冲区,其初始容量为16个字符StringBuffer(CharSequence seq)// 构造一个字符串缓冲区,包含与指定的CharSequener相同的字符StringBuffer(int capacity)// 构造一个其中不带字符,但具有指定初始容量的的字符串缓冲区,即对char[]大小进行指定StringBuffer(String str)//// 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容
StringBuffer 和 String 的相互转换String ---> StringBuffer
String s = "hello";

方式一:

StringBuffer b1 = new StringBuffer(s);

方式二:

StringBuffer b2 = new StringBuffer();b2.append(s);
StringBuffer ---> String

方式一:

String s2 = b1.toString()

方式二:

String s3 = new String(b1);
StringBuffer 常用方法
StringBufferappend()// 增StringBufferdelete(int start, int end)// 删StringBufferinsert() // 插入StringBufferreplace(int start, int end, String str)// 改intindexOf(String str) // 查intlength() // 获取长度

练习题

String str = null;StringBuffer sb = new StringBuffer();sb.append(str);  // 调用的AbstractStringBuilder的 appendNull方法System.out.println(sb.length()); // 4 null --> value = {"n", "u", "l", "l"}System.out.println(sb.capacity()); // 16System.out.println(sb);StringBuffer sb1 = new StringBuffer(str); //NullPointerException super(str.length() + 16);System.out.println(sb1);
StringBuilder 类 简介一个可变的字符序列。此类提供与 StringBufffer 兼容的API,但不保证同步。被设计作为 StringBuffer 的建议替换,用在字符串被单个线程使用的时候。如果可能,建议有限采用该类,因在在大多数实现中,他比 StringBuffer 要快。两者的方法基本相同

注意:

StringBuilder 是 final 类,不能被继承继承了 AbstractStringBuilder,属性 Char[ ] value,因此字符序列是在堆中实现了 Serialzable 接口,序列号(所谓序列号即可以保存类型和数据本身)StringBuilder 的方法,没有做互斥的处理,即没有 synchronized关键字,因此在单线程的情况下使用String、StringBuffer 和 StringBuilder 的比较

StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,且方法也一样

String 不可变字符序列,效率低,但是复用率高

StringBuffer:可变字符序列,效率较高(增删)、线程安全

StringBuilder:可变字符序列,效率最高,线程不安全

String 使用注意说明:

String s = "a"; // 创建一个字符串 s += "b";/*实际上原来的 "a" 字符串对象已经丢弃了,现在又产生了一个字符串是 s + "b" (即"ab")。如果多次执行这些改变串内容的操作,会导致的大量副本字符串对象存在内存中,降低效率。如果这样的操作放到循环中,会极大的影响程序的性能==> 结论:如果我们对String做大量修改,不要使用String*/
效率测试
long startTime = 0L;long endTime = 0L;// StringBufferStringBuffer stringBuffer = new StringBuffer("");startTime = System.currentTimeMillis();for (int i = 0; i < 20000; i++) {    stringBuffer.append(String.valueOf(i));}endTime = System.currentTimeMillis();System.out.println("StringBuffer的执行时间:" + (endTime - startTime));// StringBuilderStringBuilder stringBuilder = new StringBuilder("");startTime = System.currentTimeMillis();for (int i = 0; i < 20000; i++) {    stringBuilder.append(String.valueOf(i));}endTime = System.currentTimeMillis();System.out.println("StringBuilder的执行时间:" + (endTime - startTime));//StringString text = "";startTime = System.currentTimeMillis();for (int i = 0; i < 20000; i++) {    text += i;}endTime = System.currentTimeMillis();System.out.println("String的执行时间:" + (endTime - startTime));// StringBuffer的执行时间:5//StringBuilder的执行时间:2//String的执行时间:1463// 测试结果:StringBuilder > StringBuffer > String
String、StringBuffer 和 StringBuilder 的选择

使用的原则、结论:

如果字符串存在大量的修改操作,一般使用StringBuffer 和 StringBuilder

如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder

如果字符串存在大量的修改操作,并在多线程的情况,使用StringBuffer

如果字符串很少修改,被多个对象引用,使用 String,比如配置信息等

标签:

标签: 面包 主食

猜你喜欢

网站简介 | 合作推广 | 法律声明 | 友情链接 | 联系我们 | 意见反馈

Copyright ? 2012 - 2015 www.shunvfan.com All Rights Reserved 淑女范 版权所有

豫ICP备19008436号-1 联系我们:317 493 128@qq.com

提示:本站信息仅供参考,不能作为诊断及医疗的依据;请谨慎参阅,本站不承担由此引起的法律责任。本网站敬告网民:身体若有不适,请及时到医院就诊。所有文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站不接受任何赞助和广告