博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【面试篇】Java中String、StringBuilder与StringBuffer的区别?
阅读量:1888 次
发布时间:2019-04-26

本文共 2087 字,大约阅读时间需要 6 分钟。

【面试篇】Java中String、StringBuilder与StringBuffer的区别?

每天进步一点点!

在这里插入图片描述

在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。但String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。

因此引进了两个新的类-StringBuffer类和StringBuilder类来对这种变化的字符串进行处理。

与String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用的对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lmahz15s-1606403306809)(C:\Users\lcz\AppData\Roaming\Typora\typora-user-images\image-20201126225133604.png)]

  • String:不可变的字符串序列
  • StringBuffer:可变的字符串序列、线程安全效率低
  • StringBuilder:可变的字符串序列、线程不安全效率高

补充知识:字符串的拼接操作

1: “+” 号操作符

String s1 = "hello";String s2 = "world";System.out.println(s1 + s2);

但实际上在编译的时候“+”是被替换成了StringBuilder里面的append方法。即

System.out.println((new StringBuilder(String.valueOf(s1))).append(s2).toString());

2: StringBuilder

StringBuilder中的append方法就是常用的字符串拼接方法。

SpringBuilder类中的append方法源码如下:

public StringBuilder append(String str) {
super.append(str); return this;}

这 3 行代码没啥可看的,可看的是父类 AbstractStringBuilder 的 append 方法:

public AbstractStringBuilder append(String str) {
if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this;}123456789

1)判断拼接的字符串是不是 null,如果是,当做字符串“null”来处理。appendNull 方法的源码如下:

private AbstractStringBuilder appendNull() {
int c = count; ensureCapacityInternal(c + 4); final char[] value = this.value; value[c++] = 'n'; value[c++] = 'u'; value[c++] = 'l'; value[c++] = 'l'; count = c; return this;}1234567891011

2)拼接后的字符数组长度是否超过当前值,如果超过,进行扩容并复制。ensureCapacityInternal 方法的源码如下:

private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value, newCapacity(minimumCapacity)); }}

3)将拼接的字符串 str 复制到目标数组 value 中。

str.getChars(0, len, value, count);

3.StringBuffer

StringBuffer相比较StringBuilder区别在于线程安全。

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

StringBuffer 类的 append 方法比 StringBuilder 多了一个关键字 synchronized。

转载地址:http://ykwdf.baihongyu.com/

你可能感兴趣的文章
服务器免密配置
查看>>
linux安装jdk
查看>>
redis单点环境搭建
查看>>
zookeeper环境搭建
查看>>
linux中mysql配置安装
查看>>
ElasticSearch集群环境搭建
查看>>
Cassandra CQL v3.3中文文档(一)
查看>>
MongoDB命令之SplitVector实现并发数据迁移
查看>>
Java中String的常用API
查看>>
Yarn功能简介
查看>>
linux下的定时任务
查看>>
通过shell界面访问其他机器mysql数据库的方法
查看>>
使用mysql自带工具mysqldump进行全库备份以及source命令恢复数据库
查看>>
决策树笔记(入门)
查看>>
Taro中如何使用cssModules
查看>>
taro中别名引入路径
查看>>
taro中hook的使用
查看>>
使用element-ui的table组件,使用三元表达式筛选数据
查看>>
vue打包项目报错Failed to load resource: the server responded with a status of 500 (Internal Server Error)
查看>>
解决小程序在高层级页面滑动时,低层级页面会跟着滑动的问题
查看>>