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数组。
犹豫是必然的,结果却是偶然的。