1.String类的理解
1.1类的声明
public final class String
>final :String是不可继承的。
>Serializable :可序列化的接口,凡是实现此接口的类的对象就可以通过网络或本地流进行数据的传输
>comparable:凡是实现此接口的类,其对象都可以比较大小.
1.2内部声明的属性
jdk8:
private final char [ ] value;//储存字符串数据的容器
>final :指明此value数组一旦初始化,其地址就无法改变.
jdk9之后:为了节省内存空间而做的优化.
private final byte [ ] value;//储存字符串数据的容器
2.字符串常量的储存位置
>字符串常量都存储在字符串常量池(StringTable)中
>字符串常量池中不允许存放两个相同的字符串常量
>字符串常量池,在不同的jdk版本中,存放位置不同.
jdk7及之前,字符串常量池储存在方法区中.
jdk7之后,字符串常量池储存在堆空间中,静态变量也在堆空间中.
3.String的不可变性:每个点会配一个例子和一个运行图
①
当对字符串变量重新赋值时,需要重新指定一个字符串常量的位置进行赋值,不能再原有的位置更改
下面这个例子s1输出是hello,内部的原理在下图.
@Test
public void test()
{
String s1 ="hello";
String s2 ="hello";
s2="hi";
System.out.println(s1);
}
②
当对现有的字符串进行拼接操作时,需要重新开辟空间保存拼接以后的字符串,不能在原有的位置修改
下面这个例子s1输出是hello,s2输出是helloworld,内部的原理在下图.
@Test
public void test1()
{
String s1 ="hello";
String s2 ="hello";
s2+="world";
System.out.println(s1);
System.out.println(s2);
}
③
当调试字符串的replace( )替换现有的某个字符时,需要重新开辟空间保存修改以后的字符串,不能在原有位置修改.
下面这个例子s1输出是hello,s2输出是hello,s3输出是hewwo,内部的原理在下图.
@Test
public void test2()
{
String s1 = "hello";
String s2 = "hello";
String s3 = s2.replace('l','w');
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}