专栏首页程序员的成长之路String、StringBuilder、StringBuffer的解析和比较?

String、StringBuilder、StringBuffer的解析和比较?

一、String的解析 1.String的含义 ①String是不可以被继承的,String类是final类,String类是由char[]数组来存储字符串。 ②String是不可变的字符序列,如果存储abc则在字符串常量池中开辟长度固定为3的字符数组,无论怎么改变均会产生新的实例。

2.String的方法

由上图可知String的方法,不是在原有字符串的基础上进行修改的,都是new出了新的实例,因为String是不可变的字符序列。Sring对象的任何改变都不会改变原有的字符串。

二、字符串常量池的概念 1.String c = “abc” String cc = new String(“abc”)在内存中分布情况?

①Sting c = “abc” 先在字符串常量池中查找,如果常量池中没有,就实例化该字符串,并放到常量池中;如果池中存在abc,直接将字符串的地址赋值给c,c指向常量池的abc。 ②String cc = new String(“abc”) 先在字符串常量池中找abc,如果存在再在堆中开辟一个空间指向常量池中的abc,栈中的cc指向堆中的0x12. ③一共开辟了4块内存空间,String cc = new String(“abc”)如果池子中有abc则,创建一个对象,如果池子中没有abc则创建2个对象。 ④String cc = new String (“dec”) 的执行顺序是先从右向左。先判断dec在常量池中是否存在。如果不存在实例化一个放入池子中,再new堆中的对象。 2.分情况说明 ①非new实例,结果是true,都是指向的字符串常量池中123。

②new实例,结果是false一个指向池子,一个指向堆内存,地址不一致。

③new实例2,结果是false,只要是new 出的实例在内存中就会开辟空间,二者的地址不一致,所以返回false。

④一个字符串由多个字符串拼接而成时,它本身也是字符串常量。 new出的对象不能再编译期间确定,cz02和cz03也不能再编译器确定。cz04和cz05都指向堆内存,cz04的值是在程序运行时确定的。 【常量找池,变量找堆】

⑤编译期优化,jvm将+连接优化为连接后的值,在编译期其值就是”a1”.

⑥字符串常量拼接和字符串引用的拼接,常量的”+”拼接是在编译期完成的,而字符串引用拼接(“+”),是在程序运行时确定的。一个在指向字符串常量池,一个指向堆内存。

三、String、StringBuilder、StringBuffer解析和比较 1.String简单总结 ①String不可变的字符序列 ②new的对象,一定是创建了对象,在堆中开辟空间。 ③直接赋值和new两种方式创建String类型的对象。 ④直接赋值不一定创建对象,如果字符串常量池中有的话就直接堆中的实例指向常量池中,不需要创建对象。 ⑤final修饰类,不能被继承。 ⑥String a = “1”+“2”+“3”+“4”;这个字符串拼接过程要产生多个对象完成,效率比较低。 2.String和StringBuilder、StringBuffer的区别? ①可变性:String不可变的字符序列,Builder和Buffer是可变的字符序列。 ②线程安全:String是线程安全的,StringBuilder是线程不安全的,StringBuffer是线程安全。StringBuidler效率高于StringBuffer。因为String是不可变的一般情况下,效率最低。

③使用方式:如果字符串变换较少,使用String类型,如果拼接操作较多使用StringBuilder,如果要求线程安全使用StringBuffer。 3.StringBuffer可变字符序列的解析 ①初始容量为16

②自动扩容:初始容量的2倍加2

本文分享自微信公众号 - 程序员的成长之路(cxydczzl)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 当我遵循了这 16 条规范写代码,同事只对我说了三个字: 666

    Many of the happiest people are those who own the least. But are we really so ha...

    良月柒
  • 是否注意过isEmpty 和 isBlank 区别?

    org.apache.commons.lang.StringUtils 类提供了 String 的常用操作,最为常用的判空有如下两种 isEmpty(Strin...

    良月柒
  • 用String实现同步锁,你会吗?

    在某些时候,我们可能想基于字符串做一些事情,比如:针对同一用户的并发同步操作,使用锁字符串的方式实现比较合理。因为只有在相同字符串的情况下,并发操作才是不被允许...

    良月柒
  • Java String Krains 2020-08-05

    String源码中是这样定义的,String底层在jdk8及以前是用char数组存储的,而jdk9之后改用byte数组存储,由于都加了final关键字,Stri...

    Krains
  • 深入Java源码剖析之字符串常量

    字符串在Java生产开发中的使用频率是非常高的,可见,字符串对于我们而言非常关键。那么从C语言过来的同学会发现,在C中是没有String类型的,那么C语言要想实...

    wangweijun
  • 一个高频面试题,考考大家对 Java String 常量池的理解。

    作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串...

    纯洁的微笑
  • String字符串—详细总结

    不可变的,每一次修改实际上生成新的字符串,并且该字符串的值是修改后的值。new String都是在堆上创建字符串对象

    用户5325874
  • 基础面试,为什么面试官总喜欢问String?

    关于 Java String,这是面试的基础,但是还有很多童鞋不能说清楚,所以本文将简单而又透彻的说明一下那个让你迷惑的 String

    码农小胖哥
  • 基础面试,为什么面试官总喜欢问String?

    关于 Java String,这是面试的基础,但是还有很多童鞋不能说清楚,所以本文将简单而又透彻的说明一下那个让你迷惑的 String

    用户4172423
  • 基础面试,为什么面试官总喜欢问String?

    关于 Java String,这是面试的基础,但是还有很多童鞋不能说清楚,所以本文将简单而又透彻的说明一下那个让你迷惑的 String

    黄泽杰

扫码关注云+社区

领取腾讯云代金券