String内存解析

一、String的特性:

  • String是一个final类,代表不可变的字符序列。
    • 体现:当对字符串重新赋值时,需要重新制定内存区赋值,不能使用原有的value进行赋值。
    • 当对现有的字符串进行连接操作时,也需要重新制定内存区域赋值,不能使用原有value进行赋值。
    • 当调用String的replace()修改指定字符或字符串时,也需要重新指定内存区域赋值。 
  • 字符串是常量,用双语号引起来表示。它们的值在创建之后不能更改。
  • String对象的字符内容是存储在一个字符数组value【】中的。
  • 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串声明在字符串常量池中

二、String的实例化方式:

方式一:通过字面量的方式:

String s1 = “123”;
String s2 = “123”;
//通过字面量定义的方式:此时s1和s2的数据都是声明在方法区中的字符串池中。

方式二:通过new+构造器的方式:

String s1 = new String(“123”);
String s2 = new String(“123”);
//此时的s1和s2保存的是地址值,是数据在堆空间开辟空间后对应的地址。

内存结构图如下:

而前面我们在讲述其他自定义类中,比较字符串类型的大小也可以有一份内存结构图如下:

因此可以推导:String s = new String(“abc”);方式创建对象,在内存中其实是创建了2个对象:一个是堆空间中new的结构,另一个是char【】对应的常量池的数据:“abc”。

关于拼接还有一个特性:

三、String的其他转换:

  • 字节数组——>字符串
    • String(byte【】):通过使用平台的默认字符集解码指定的byte数组,构造一个新的String。
    • String(byte【】,int offset,int length):用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象。
  • 字符串——>字节数组
    • public byte【】 getBytes():使用平台默认字符集将此String编码为byte序列,并将结果储存到一个新的byte数组中。
    • public byte【】 getBytes(String charsetName):使用指定的字符集将此String编码到byte序列,并将结果存储到新的byte数组。
原文地址:https://www.cnblogs.com/liuhuan425/p/10846789.html