阿里面试实战题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. ...
随机推荐
- isNotBlank()和isNotEmpty()总结
import org.apache.commons.lang.StringUtils; import org.junit.Test; public class Test{ //总结:isNotBlan ...
- 松软科技课堂:JS HTML DOM
通过 HTML DOM,JavaScript 能够访问和改变 HTML 文档的所有元素. HTML DOM(文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Objec ...
- BOM对象——Location
BOM对象--location <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- sessionstorage中存储JSON数据
在web开发时,可能经常会用到sessionstorage存储数据,存储单个字符串数据变量时并不困难 var str = 'This is a string'; sessionstorage.setI ...
- scrapy框架(三)
scrapy框架(三) CrawlSpider类 创建CrawlSpider # 创建项目后 $ scrapy genspider -t crawl spider_name website_doma ...
- num2str(A, format)
str = num2str(A, format)A: 数值类型的数组或者是单个的数值format:指定数字转换为字符串的格式,通常’%11.4g’是默认的.也可以指定转换为几位的字符串,不足用0填充, ...
- zuul实现的限流
限流一般可以根据客户端IP,请求的URL,用户登陆信息进行限制,每秒钟限制多次数,这从别一方面也提升了系统的性能,无用的并发没那么多了. 依赖包 <dependency> <grou ...
- 在Dynamics CRM中使用Bootstrap
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- QGIS练手 - 数据
又熬夜了... 这篇博客可能会将QGIS数据管理部分和ArcGIS数据管理进行对比学习. 1. 本地数据文件与数据库(矢量) 1.1 文件 QGIS用的是shp文件.kml文件.geojson文件较多 ...
- arcgis api 4.x for js 结合 Echarts4 实现统计图(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...