阿里面试实战题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. ...
随机推荐
- 深入探索Java设计模式(四)之享元模式
享元模式适用于需要大量相同类型对象的情况.在此,设计布局可以减少创建多个对象的方式.对象在运行时会消耗资源,因此最好在内存中使用较少的对象.它减少了内存占用并利用了程序的整体性能.本文是在学习完优锐课 ...
- Python 单线程下实现多个socket并发
## 客户端 import socket import gevent import threading import multiprocessing ip_bind = ('127.0.0.1',80 ...
- iis部署网站后出现未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\106f9ae8\cc0e1
在本地开发环境没问题,但是发布到服务器出现:未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Fil ...
- java8-Stream流API
一回顾与说明 经过前面发布的三章java8的博客,你就懂得了我们为什么要用Lamda表达式,Lamda表达式的原理与函数式接口的关系,从Lamda表达式到方法引用和构造引用. 想要学Stream流你必 ...
- Java使用ObjectMapper做数据转换的常用工具类实现
1.介绍 ObjectMapper类是Jackson库的主要类,它提供一些功能将数据集或对象转换的实现 2.依赖包 <!-- https://mvnrepository.com/artifact ...
- OpenSSL 自述
1995 年, Eric A. Young 和 Tim J. Hudson 发明了 SSLeay,它是 SSL(Open-source Secure Sockets) 协议的实现.1998 年,You ...
- Github挂载大文件解决方案
正常情况下,我们上传代码之类的文本文件,都不会太大,可以直接通过[Upload Files]选项直接上传. 但是这样的操作仅限文件大小在25MB以内. 如果你选择的文件超过25MB,那么Github会 ...
- Scrcpy用电脑控制Android手机(支持Windows/macOS/Linux)
一.scrcpy简介 注意:拼写是scrcpy,非Python爬虫框架Scrapy. scrcpy可以通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备.它可以通过U ...
- Kali_Linux 中文乱码 修改更新源及更新问题
Kali_Linux 中文乱码 修改更新源及更新问题 中文乱码问题 kali默认没有中文字符 当以中文安装或者切换编码换为中文后会出现乱码的情况 解决方法: 确定locales已经安装好, 使用 ap ...
- JavaScript数组循环
JavaScript数组循环 一.前言 利用Javascript map(),reduce()和filter()数组方法可以遍历数组.而不是积累起来for循环和嵌套来处理列表和集合中的数据,利用这些方 ...