String、StringBuffer、StringBuilder有什么区别呢?

1、String:

  1. 首先String是不可变的这是家喻户晓的,它的底层是用一个final修饰的char数组来保存数据的
  2. 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是因为他们都指向同一个字符串对象。
  3. 当然以上情况要注意的是:String  a = new String("123”) ,String  b = new String("123”)这样的写法,a == b返回的就是false了。
  4. 计算中注意的两点,String a = "123" + "123 + "2341";这种写法,在编译期就已经确定了字符串“1231232341”,所以速度还是很快的。但是如果用下面这种字符串拼接方式,那么就会导致性能大减,这也是String拼接字符串效率最低的原因之一了吧。String a = "123",a  += "23"; a += "cb";这种情况下,String底层会实例化一个一个有一个的StringBuilder对象并且利用append方法来拼接字符串。当字符串拼接量比较大的时候,可想而知创建那么多StringBuilder对象造成的性能开销和内存开销了。

2、StringBuilder

  1. StringBuilder是非线程安全的,少了同步造成的性能开销,所以在大部分场景中,StringBuilder仍然是拼接字符串的首选。

3、StringBuffer

  1. StringBuffer与StringBuilder是大致相同的,都有相同的方法相同的属性,相同的特性等。不同的是加了synchronized关键字到所有操作字符串的方法上(append等),保证了操作字符串的线程安全。
  2. StringBuffer与StringBuilder底层都是用一个char[] value来保存数据的,而在append时候仅仅是对这个数组进行扩容,所以在性能上相比反复创建StringBuilder对象的String来说,性能提升了很多。

搞懂String、StringBuffer、StringBuilder的区别的更多相关文章

  1. String,StringBuffer,StringBuilder的区别

    public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...

  2. [置顶] String StringBuffer StringBuilder的区别剖析

    这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...

  3. String,StringBuffer,StringBuilder的区别及其源码分析

    String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...

  4. Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?

    Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系 创建成功的String对象,其长度是固定的,内容 ...

  5. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  6. 深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)

    String.StringBuffer.StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别 ...

  7. Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用

    Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...

  8. 在JAVA中,String,Stringbuffer,StringBuilder 的区别

    首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String  不是线程安全的,这意味着在不同线程共享一个String ...

  9. String,StringBuffer,StringBuilder三者区别

    String:每次改变,String都会重新构造,内存指针都会改变 StringBuffer:主要用在全局变量中 StringBuilder:在线程内完成字符拼接,因为线程是不安全的,所以完成后可以丢 ...

  10. 从源码看String,StringBuffer,StringBuilder的区别

    前言 看了一篇文章,大概是讲面试中的java基础的,有如题这么个面试题.我又翻了一些文章看了下,然后去看源码.看一下源码大概能更加了解一些. String String类是final的,表示不可被继承 ...

随机推荐

  1. PHP学习之工厂方法模式

    <?php //工厂方法模式 interface Doing { function eat(); function sleep(); } class Cat implements Doing { ...

  2. Android中利用jsoup解析html页面

    学习jsoup :jsoup学习网站 Android 中使用: 添加依赖 implementation 'org.jsoup:jsoup:1.10.1' 直接上代码: package com.load ...

  3. Queue class

    #pragma once#include <iostream>#include <iomanip> using namespace std; class Queue{ stru ...

  4. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_05-vuejs研究-vuejs基础-v-text指令

    把js移到body 的下面 网速改慢一点 通过模拟网速慢的情况.刷新页面的时候会有闪烁的效果 速度快的情况下也会闪烁 ,只不过是不明显. 2.解决插值表达式闪烁问题,使用v-text v-text可以 ...

  5. swift 第四课 随意 设置button 图片和文字 位置

    项目中经常遇到按钮改变文字和图片位置的情况,所以尝试写一个 button 的分类: 参照连接 http://blog.csdn.net/dfqin/article/details/37813591 i ...

  6. Python 调试工具PySnooper

    相信很多小伙伴平时写python的时候都是需要调试程序的,出问题了,需要了解函数内部是怎么跑的,而这个时候很多人都会想到在疑惑的地方使用print函数来打印一下参数来调试.虽然用print也是不失为是 ...

  7. Redis安装与配置问题

    Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  8. 最新 易车java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.易车等10家互联网公司的校招Offer,因为某些自身原因最终选择了易车.6.7月主要是做系统复习.项目复盘.LeetCode ...

  9. Spring 视图层如何显示验证消息提示

    1.示例 <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}" ></p&g ...

  10. zookeeper的shell下操作

    zookeeper的shell下操作 进入%ZK_HOME%/bin 执行zkCli.sh [-server ip:port] #如不指定,则连接本机   创建: create [-s] [-e] p ...