搞懂String、StringBuffer、StringBuilder的区别
String、StringBuffer、StringBuilder有什么区别呢?
1、String:
- 首先String是不可变的这是家喻户晓的,它的底层是用一个final修饰的char数组来保存数据的。
- String a = "123",String b = "123", b == a 是会返回true的,这里牵扯到了字符串常量池,因为很多字符串都是常见的,不可能每个字符串都创建一个对象吧?你有一个“abc”字符串,他也有一个,有10000个“abc”字符串就要创建10000个“abc”字符串?这样对性能和内存肯定有损耗,所以JVM中就会有一个字符串常量池(Java6中被缓存的字符串是存在所谓 PermGen 里的,也就是臭名昭著的的“永久代”,这个空间是有限的,也基本不会被FullGC之外的垃圾收集照顾到。所以使用不当,OOM就会光顾。在后续版本中,这个缓存被放置在堆中,这样就极大避免了永久代占满的问题,甚至永久代在JDK8中被MetaSpace(元数据区)替代了。而且默认缓存大小也在不断扩大中,从最初的1009,到7u40以后被修改为60013。)来保存字符串常量,以上定义的变量a,和b之所以用"=="相比较返回true是因为他们都指向同一个字符串对象。
- 当然以上情况要注意的是:String a = new String("123”) ,String b = new String("123”)这样的写法,a == b返回的就是false了。
- 计算中注意的两点,String a = "123" + "123 + "2341";这种写法,在编译期就已经确定了字符串“1231232341”,所以速度还是很快的。但是如果用下面这种字符串拼接方式,那么就会导致性能大减,这也是String拼接字符串效率最低的原因之一了吧。String a = "123",a += "23"; a += "cb";这种情况下,String底层会实例化一个一个有一个的StringBuilder对象并且利用append方法来拼接字符串。当字符串拼接量比较大的时候,可想而知创建那么多StringBuilder对象造成的性能开销和内存开销了。
2、StringBuilder
- StringBuilder是非线程安全的,少了同步造成的性能开销,所以在大部分场景中,StringBuilder仍然是拼接字符串的首选。
3、StringBuffer
- StringBuffer与StringBuilder是大致相同的,都有相同的方法相同的属性,相同的特性等。不同的是加了synchronized关键字到所有操作字符串的方法上(append等),保证了操作字符串的线程安全。
- StringBuffer与StringBuilder底层都是用一个char[] value来保存数据的,而在append时候仅仅是对这个数组进行扩容,所以在性能上相比反复创建StringBuilder对象的String来说,性能提升了很多。
搞懂String、StringBuffer、StringBuilder的区别的更多相关文章
- String,StringBuffer,StringBuilder的区别
public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...
- [置顶] String StringBuffer StringBuilder的区别剖析
这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...
- String,StringBuffer,StringBuilder的区别及其源码分析
String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...
- Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?
Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系 创建成功的String对象,其长度是固定的,内容 ...
- java中 String StringBuffer StringBuilder的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- 深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)
String.StringBuffer.StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别 ...
- Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用
Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...
- 在JAVA中,String,Stringbuffer,StringBuilder 的区别
首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String 不是线程安全的,这意味着在不同线程共享一个String ...
- String,StringBuffer,StringBuilder三者区别
String:每次改变,String都会重新构造,内存指针都会改变 StringBuffer:主要用在全局变量中 StringBuilder:在线程内完成字符拼接,因为线程是不安全的,所以完成后可以丢 ...
- 从源码看String,StringBuffer,StringBuilder的区别
前言 看了一篇文章,大概是讲面试中的java基础的,有如题这么个面试题.我又翻了一些文章看了下,然后去看源码.看一下源码大概能更加了解一些. String String类是final的,表示不可被继承 ...
随机推荐
- Flutter移动电商实战 --(31)列表页_列表切换交互制作
点击左侧的大类右边的小类也跟着变化 新建provide 要改变哪里就建哪里的provide,我们现在要改变的是右边的商品列表的数组. category_goods_list.dart 这样我们的pro ...
- docker下搭建owncloud
在ubuntu下 搭建owncloud 用docker-compose启动,owncloud.yml文件内容 owncloud: image: owncloud: restart: always 开机 ...
- Flex 弹性盒子布局使用教程
本文转载于<https://blog.csdn.net/lyznice/article/details/53981062>
- (翻译) Poor misunderstood 'var'
It seems most programmers coming to JavaScript from C, C++, Java, and the like equate the var statem ...
- java+上传大文件
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- React Native npm第三方报错
添加npm install第三方报错: 使用: yarn add 组件名称 注意: 这里不需要像npm的--save
- 安装ELectron失败解决方案
npm安装Electron解决方案 Electron使用npm安装时,因为是国外的镜像源,所以速度会非常慢.而使用cnpm如下命令进行安装时,又会出现安装失败的问题: npm install elec ...
- centos(linux)-maven配置
1.确认已经安装jdk 2.下载 3.解压 tar -zxvf apache-maven-xxx(tab补全文件名) 4.配置环境变量 (1)sudo vim /etc/profile (2)在最下面 ...
- Volatility取证使用笔记
最近简单的了解了一下Volatility这个开源的取证框架,这个框架能够对导出的内存镜像镜像分析,能过通过获取内核的数据结构,使用插件获取内存的详细情况和运行状态,同时可以直接dump系统文件,屏幕截 ...
- 添加学生信息(java wb)
要求: 1.登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头: 2.登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成: 3.性别:要求用单选框或下拉框实 ...