阿里面试实战题3----String,StringBuilder,StringBuffer区别
String
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
可以特别明显的看出。String是final类型,不可被继承。同时底层的数据结构--数组,也是final不可变的。
StringBuilder
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
public StringBuilder() {
super(16);
} } abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value; AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
}
同样可以看出,StringBuilder不同于String,char数组是非final类型,可被修改。
StringBuffer
他是安全版的StringBuilder,他所有方法都加了synchronized。
例子如下:
public class Main {
public static void main(String[] args) {
String s1 = "aaa";
String s2 = s1.concat("bbb");
System.out.println(s2.equals(s1));
}
}
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}

其实我们可以看到,在contact方法的第17行。他其实是return了一个新的String类型,而不是旧的String类型。
所以s1和s2肯定不会是相同的。
public class Main {
public static void main(String[] args) {
StringBuilder s1 = new StringBuilder("aaa");
StringBuilder s2 = s1.append("bbb");
System.out.println(s2.equals(s1));
}
}
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;
}

可以看到,在append的16行,他返回的是return this。也就是当前对象的内存,也就是当前内存发生了变化。
所以s1和s2也就相等了。
适用场景
如果频繁的要修改字符串的内容的话,那么就使用StringBuilder。
否则建议使用String。
因为String的不可变,使得其非常的“安全”。包括在HashSet,HashMap中使用,都十分的“安全”。
可以参考这篇回答:String和StringBuffer以及StringBuilder的性能差异 ?
阿里面试实战题3----String,StringBuilder,StringBuffer区别的更多相关文章
- String StringBuilder StringBuffer区别
String StringBuilder StringBuffer String类是final类,不可以被继承,且它的成员方法也是final方法,当一个字符串对象进行操作操作时,任何的改变不会影响到这 ...
- 阿里面试实战题2----ReentrantLock里面lock和tryLock的区别
ReentrantLock ReentrantLock(轻量级锁)也可以叫对象锁,可重入锁,互斥锁.synchronized重量级锁,JDK前期的版本lock比synchronized更快,在JDK1 ...
- 阿里面试实战题1----TreeSet,HashSet 区别
TreeSet,HashSet 区别 TreeSet public class TreeSet<E> extends AbstractSet<E> implements Nav ...
- JAVA记录-String/StringBuilder/StringBuffer区别
- 深入源码剖析String,StringBuilder,StringBuffer
[String,StringBuffer,StringBulider] 深入源码剖析String,StringBuilder,StringBuffer [作者:高瑞林] [博客地址]http://ww ...
- String, StringBuilder, StringBuffer问题
1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ...
- String,StringBuilder,StringBuffer的对比测试
public class TestString { private static final int COUNT = 10000000; public static void main(String ...
- difference among String,StringBuilder,StringBuffer
difference among String,StringBuilder,StringBuffer String常用构造函数 String(byte[] bytes) String(byte[] b ...
- JDK源码分析系列---String,StringBuilder,StringBuffer
JDK源码分析系列---String,StringBuilder,StringBuffer 1.String public final class String implements java.io. ...
随机推荐
- Springboot 项目源码 Activiti6 工作流 vue.js html 跨域 前后分离 websocket即时通讯
特别注意: Springboot 工作流 前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0.0+ mybaits+maven+接 ...
- web端百度地图API实现实时轨迹动态展现
最近在工作中遇到了一个百度地图api中的难题,恐怕有的程序员可能也遇到过.就是实时定位并显示轨迹,网上大部分都是通过创建polyline对象贴到地图上.当然,百度地图的画线就是这样实现的,但是好多人会 ...
- linux 文件管理命令
一,文件查看more,less,head,tail,cat,tac 分屏查看文件内容 more:和man用法一样,但翻屏到尾部自动推出. less:和man用法一样. head:查看文件的前n行.n默 ...
- 剑指offer-47:不用加减乘除做加法
参考:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html <原码,反码,补码 详解> 题目描述 ...
- 利用Fiddler对Jmeter的请求进行抓包
前言 有时候,为了得到更详细的请求结果,我们可能需要使用Fiddler结合Jmeter来抓包分析,从而更好的辅助测试. 遇到的问题 这里以一个获取学生信息的接口为例进行说明. 当我在Jmeter里按接 ...
- Dubbo学习系列之十四(Seata分布式事务方案AT模式)
一直说写有关最新技术的文章,但前面似乎都有点偏了,只能说算主流技术,今天这个主题,我觉得应该名副其实.分布式微服务的深水区并不是单个微服务的设计,而是服务间的数据一致性问题!解决了这个问题,才算是把分 ...
- mysql存储4字节的表情包数据报异常_Emoji表情包_Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F
本文章转载自:https://www.cnblogs.com/coprince/p/7485968.html 原文如下: 问题描述:从新浪微博抓取消息保存到MySQL数据中,对应数据库字段为varch ...
- [css flex布局]实例一,本来还想挺简单的,弄了挺久呢,先写一部分
全是代码,直接拷走吧,看是不怎么好看的 参考:http://www.ruanyifeng.com/blog/search.html?cx=016304377626642577906%3Ab_e9ska ...
- C#NULL条件运算符
C#6.0新增的特性 NULL条件运算符 ?. 之前我们在需要判断某个对象是否为空的是这样的 Person per = null; if (per != null) { Console.Write(& ...
- QGIS练手 - 标注
又熬夜了... QGIS的标注就是标签,在QGIS3.x中有了改进. 不得不说,就光速度这一项,就能把ArcMap按在地上摩擦,更别说各种高级的标注样式了——除了标注功能面板UI有点“缺审美化”就是了 ...