• java--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

  • 相关阅读:
    第07节-开源蓝牙协议BTStack框架代码阅读(上)
    第06节-开源蓝牙协议BTStack框架分析
    第05节-BLE协议物理层(PHY)
    第04节-BLE协议抓包演示
    第03节-BLE协议各层数据格式概述
    【重点声明】此系列仅用于工作和学习,禁止用于非法攻击。一切遵守《网络安全法》
    海外信息安全资源
    从浏览器攻击思考入门的问题。
    攻击载荷免杀技术
    聊聊NTLM认证协议
  • 原文地址:https://www.cnblogs.com/rootcz/p/9446455.html
Copyright © 2020-2023  润新知