• String的实例化及内存解析


    字符串相关的类

    String类

    String源码

    public final class String implements java.io.Serializable, Comparable<String>, CharSequence{
    	private final char value[];
    	private int hash;
    	...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    String的实例化

    String s1="hello";//字面量实例化
    String s2=new String();//本质是this.value=new char[0];
    String s3=new String(String original);//本质是this.value=original.value;
    String s4=new String(char[] a);//this.value=Arrays.copyOf(value, value.length);
    String s5=new String(char[] a, int startIndex, int count);
    
    总体来说:
    String的实例化方式:
     * 方式1:通过字面量定义的方式:存放到方法区中的字符串常量池中
     * 方式2:通过new + 构造器的方式:存放到堆中
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    String:字符串,使用一对""引起来表示

    • 1.String声明为final的,不可被继承
    • 2.String实现Serializable接口:表示字符串是支持序列化的
      实现Comparable接口:表示字符串可以比较大小
    • 3.String内部定义了final char[] value用于存储字符串数据
    • 4.String代表不可变的字符序列。简称:不可变性
      体现:1.当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值。//见内存解析
      2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。s1+="def";则内存地址已经变了
      3.当调用String的replace()方法修改指定的字符或字符串时,也需要重新指定内存区域赋值。String s3="abc"; String s4=s3.replace('a', 'm');
    • 5.通过字面量的方式(如String s1=“abc”;)(区别于new的方式)给一个字符串赋值,此时的字符串值声明在方法区的字符串常量池中
    • 6.字符串常量池中是不会存储相同内容的字符串的

    面试题

    面试题:String s=new String(“abc”);方式创建对象,在内存中创建了几个对象?
    2个:1个是堆空间中new的String的结构value,另一个是char[]对应的字符串常量池中的数据,即"abc"

    内存解析1

    在这里插入图片描述

    内存解析2

    在这里插入图片描述

    内存解析3

    在这里插入图片描述

    内存解析4

    小结论

    1.常量与常量的拼接结果在常量池中,且常量池中不会存在相同内容的常量
    2.只要其中有一个是变量,结果就在堆中
    3.intern()方法可以返回字符串常量池中的地址值

    String s1="hello";
    String s2="world";
    String S3="helloworld";
    String s4="hello"+"world";
    String s5=s1+"world";
    String s6=s1+s2;
    String s7=s5.intern();//此时返回的s7是常量池中已经存在的"helloworld"的地址值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    解析:
    在这里插入图片描述

  • 相关阅读:
    MFC Windows 程序设计[331]之帮助静态框实例(附源码)
    每日一练<4>
    Swift类型属性底层研究
    LongLoRA:不需要大量计算资源的情况下增强了预训练语言模型的上下文能力
    如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题
    代码随想录-017-19.删除链表的倒数第N个节点
    MotoSimEG-VRC软件:冲压机添加以及与机器人信号交互虚拟仿真
    Python 与 Qt c++ 程序共享内存,传递图片
    Haproxy集群
    libcurl库安装和使用
  • 原文地址:https://blog.csdn.net/qq_57780419/article/details/126593002