最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

StringBuffer

互联网 admin 12浏览 0评论

StringBuffer

1、诞生原因

StringBuffer适用于作为共享变量使用,因为它通过排它锁来保证线程安全,也就是用了synchronized关键字修饰了相关操作方法,而这些方法的用法及特性与StringBuilder相同,只不过StringBuffer增加了一个缓存字符数组toStringCache,在执行每个操作时都将toStringCache清空,用于优化toString调用:若该缓存为空,则拷贝赋予当前最新的字符数组,若不为空,则直接读取缓存中数据。更多内容详见公众hao:云水致诚

另外,需要注意的是JDK5开始,优化String使用+拼接字符串时,底层默认使用的是StringBuilder,而不是StringBuffer。

2、有哪些特点

A、线程安全:作为共享变量使用,用于拼接多个字符串;

B、字符数据:存储的字符串与String类似,均被转为char数组形式存储,JDK9开始,存储的字符串被转为字节数组存放;

C、可存储任何类型,但最终都会被转为字符串,如:整形、字符、浮点、布尔、字节等;

D、最大可存储长度为2的31次幂减1,即Integer.MAX_VALUE;

3、与String的关系

顾名思义,与String相同,StringBuffer也是用来处理字符串的引用类,它也提供了很多便捷操作字符串的方法。同时,StringBuffer通过append方法拼接多个字符串时,只需要一个StringBuffer对象即可,而String主要是通过+号拼接,若作为共享变量使用时,请不要使用String和StringBuilder,因为它们均为非线程安全,而是使用StringBuffer替代。另外,String是固定不变的,而StringBuffer则是一种可存储任何类型的可变容器。

4、常见的操作

A、拼接字符串

StringBuffer sb = new StringBuffer(16);
sb.append("hell");
sb.append("o");  // hello

B、插入字符串

StringBuffer sb = new StringBuffer ("hell"); 
sb.insert(4, "o-insert");  // hello-insert

C、反转字符串

StringBuffer sb = new StringBuffer ("hello"); 
sb.reverse();  // olleh

D、替换字符串

StringBuffer sb = new StringBuffer ("hello"); 
sb.replace(1,2,"o");  // hollo

E、删除字符串

StringBuffer sb = new StringBuffer ("hello"); 
sb.delete(1,2);  // hllo

StringBuffer sb = new StringBuffer ("hello"); 
sb.deleteCharAt(1);  // hllo

F、长度及转为字符串

StringBuffer sb = new StringBuffer ("hello");
System.out.println(sb.length());  // 5
System.out.println(sb.toString());  // hello

5、什么场景使用

作为共享变量且存在线程安全环境下使用:

A、循环中拼接字符串时,替代String拼接;

B、JDK5以前,替代String拼接多个字符串,比如:超过4个串拼接等;

C、便捷字符串拼接、反转、插入、替换及链式样调用等;

6、常见面试问题

A、StringBuffer是线程安全的吗?原因是什么?

B、循环中如何使用StringBuffer拼接字符串呢?

C、StringBuffer拼接的字符串是如何存储的呢?

D、StringBuffer能够无限存储字符串吗?

StringBuffer

1、诞生原因

StringBuffer适用于作为共享变量使用,因为它通过排它锁来保证线程安全,也就是用了synchronized关键字修饰了相关操作方法,而这些方法的用法及特性与StringBuilder相同,只不过StringBuffer增加了一个缓存字符数组toStringCache,在执行每个操作时都将toStringCache清空,用于优化toString调用:若该缓存为空,则拷贝赋予当前最新的字符数组,若不为空,则直接读取缓存中数据。更多内容详见公众hao:云水致诚

另外,需要注意的是JDK5开始,优化String使用+拼接字符串时,底层默认使用的是StringBuilder,而不是StringBuffer。

2、有哪些特点

A、线程安全:作为共享变量使用,用于拼接多个字符串;

B、字符数据:存储的字符串与String类似,均被转为char数组形式存储,JDK9开始,存储的字符串被转为字节数组存放;

C、可存储任何类型,但最终都会被转为字符串,如:整形、字符、浮点、布尔、字节等;

D、最大可存储长度为2的31次幂减1,即Integer.MAX_VALUE;

3、与String的关系

顾名思义,与String相同,StringBuffer也是用来处理字符串的引用类,它也提供了很多便捷操作字符串的方法。同时,StringBuffer通过append方法拼接多个字符串时,只需要一个StringBuffer对象即可,而String主要是通过+号拼接,若作为共享变量使用时,请不要使用String和StringBuilder,因为它们均为非线程安全,而是使用StringBuffer替代。另外,String是固定不变的,而StringBuffer则是一种可存储任何类型的可变容器。

4、常见的操作

A、拼接字符串

StringBuffer sb = new StringBuffer(16);
sb.append("hell");
sb.append("o");  // hello

B、插入字符串

StringBuffer sb = new StringBuffer ("hell"); 
sb.insert(4, "o-insert");  // hello-insert

C、反转字符串

StringBuffer sb = new StringBuffer ("hello"); 
sb.reverse();  // olleh

D、替换字符串

StringBuffer sb = new StringBuffer ("hello"); 
sb.replace(1,2,"o");  // hollo

E、删除字符串

StringBuffer sb = new StringBuffer ("hello"); 
sb.delete(1,2);  // hllo

StringBuffer sb = new StringBuffer ("hello"); 
sb.deleteCharAt(1);  // hllo

F、长度及转为字符串

StringBuffer sb = new StringBuffer ("hello");
System.out.println(sb.length());  // 5
System.out.println(sb.toString());  // hello

5、什么场景使用

作为共享变量且存在线程安全环境下使用:

A、循环中拼接字符串时,替代String拼接;

B、JDK5以前,替代String拼接多个字符串,比如:超过4个串拼接等;

C、便捷字符串拼接、反转、插入、替换及链式样调用等;

6、常见面试问题

A、StringBuffer是线程安全的吗?原因是什么?

B、循环中如何使用StringBuffer拼接字符串呢?

C、StringBuffer拼接的字符串是如何存储的呢?

D、StringBuffer能够无限存储字符串吗?

发布评论

评论列表 (0)

  1. 暂无评论