当前位置: 首页 > news >正文

面试攻略,Java 基础面试 100 问(十)

StringBuffer、StringBuilder、String区别

线程安全

StringBuffer:线程安全,StringBuilder:线程不安全。

因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 synchronized 修饰。

StringBuffer 代码片段:

@Override
public synchronized StringBuffer append(String str) {toStringCache = null;super.append(str); return this;
}

缓冲区

StringBuffer 代码片段:

private transient char[] toStringCache;@Override
public synchronized String toString() {if (toStringCache == null) {toStringCache = Arrays.copyOfRange(value, 0, count);}return new String(toStringCache, true);
}

StringBuilder 代码片段:

@Override 
public String toString() {// Create a copy, don't share the array return new String(value, 0, count); 
}

可以看出,StringBuffer 每次获取 toString 都会直接使用缓存区的 toStringCache 值来构造一个字符串。

而 StringBuilder 则每次都需要复制一次字符数组,再构造一个字符串。

所以,缓存冲这也是对 StringBuffer 的一个优化吧,不过 StringBuffer 的这个toString 方法仍然是同步的。

性能

StringBuffer 是线程安全的,它的所有公开方法都是同步的,StringBuilder 是没有对方法加锁同步的,所以毫无疑问,StringBuilder 的性能要远大于 StringBuffer。

StringBuilder > StringBuffer > String

String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

有没有哪种情况用+做字符串连接比调用 StringBuffer / StringBuilder 对象的 append 方法性能更好?

如果连接后得到的字符串在静态存储区中是早已存在的,那么用+做字符串连接是优于 StringBuffer / StringBuilder 的 append 方法的。

 

http://www.lryc.cn/news/13004.html

相关文章:

  • Zero-shot(零次学习)简介
  • 51单片机简易电阻电感电容RLC测量仪仿真设计
  • [软件工程导论(第六版)]第6章 详细设计(课后习题详解)
  • 【2.19】算法题2:贪心算法、动态规划、分治
  • 【Redis】Redis 发布订阅通信模式 ( 发布订阅模式 | 订阅频道 | 发布消息 | 接收消息 )
  • VNCTF 2023复现
  • python基础知识有哪些需要背(记住是基础知识)我是初学者
  • Linux下TCP连接断开后不释放的解决办法
  • 1.关于嵌入式开发软件工程师的理解
  • 1760字,让你拿捏 [‘列表‘]
  • A562基于android的养老APP
  • java面试题-并发基础
  • 用纯C语言实现3D空间中的点坐标转化为屏幕二维点坐标,包含主视图、侧视图、俯视图、正等轴投影
  • .sh脚本文件的执行方式
  • Android 基础知识4-2.5View与VIewGroup的概念、关系与区别
  • 【ESP 保姆级教程】玩转巴法云篇① ——初识巴法云
  • Python学习-----模块3.0(正则表达式-->re模块)
  • JSP中http与内置对象学习笔记
  • Windows Server 2016远程桌面配置全过程
  • SPI通讯简介
  • Python 迭代器
  • Python语言零基础入门教程(二十七)
  • Redis基础操作以及数据类型
  • 自抗扰控制ADRC之反馈控制律(NLSEF)
  • “生成音乐“ 【循环神经网络】
  • 能否手写vue3响应式原理-面试进阶
  • 前端工程师leetcode算法面试必备-简单的二叉树
  • 【什么程度叫熟悉linux系统】
  • 编译安装MySQL
  • Kubernetes一 Kubernetes之入门