字符串类String
一.两种实例化方式以及区别
1.直接赋值 String 变量 = "字符串";
直接赋值就是讲一个字符串的匿名对象设置了一个名字。String 变量 = 字符串常量(匿名对象)
String stra = "hello";
String strb = "hello";
String strc = "hello";
发现以上所有采用直接赋值的String类对象的内存地址完全指向了同一个内存空间。
共享设计模式:
在JVM的底层实际上会存在一个对象池(不一定只保存String对象),当代码之中使用
了直接赋值定义了一个String对象,会将此字符串对象所使用的匿名对象入池保存,而
后如果后续还有其他的对象也采用直接赋值的方式,并且设置了同样内容的时候,那么将
不会开辟新的堆内存空间,而是使用已有对象进行引用的分配。
在JVM的底层实际上会存在一个对象池(不一定只保存String对象),当代码之中使用
了直接赋值定义了一个String对象,会将此字符串对象所使用的匿名对象入池保存,而
后如果后续还有其他的对象也采用直接赋值的方式,并且设置了同样内容的时候,那么将
不会开辟新的堆内存空间,而是使用已有对象进行引用的分配。
2.构造方法String stra = new String(“hello”);
通过分析,如果使用的是构造方法的方式进行String类对象实例化的开辟了两块堆内存
空间(其中一块堆内存空间将成为垃圾空间).
除了内存的浪费之外,如果使用了构造方法定义的String类对象,其内容不会入对象池,
因为是new开辟的新的内存。
空间(其中一块堆内存空间将成为垃圾空间).
除了内存的浪费之外,如果使用了构造方法定义的String类对象,其内容不会入对象池,
因为是new开辟的新的内存。
public String intern();//intern()方法
//使用构造方法定义了新的内存,而后入池。
String stra = new String("hello").intern();//手工入池
String strb = "hello";
System.out.println(stra == strb);//true,==判断对象指向的堆内存地址是否一致。
//使用构造方法定义了新的内存,而后入池。
String stra = new String("hello").intern();//手工入池
String strb = "hello";
System.out.println(stra == strb);//true,==判断对象指向的堆内存地址是否一致。
字符串一旦定义则不可改变,所谓字符串的内容实际上根本就没有改变(Java本身规定字符串不可改变)
对于字符串对象内容的改变,是利用了引用关系的变化而实现的,而每一次的变化都会产生垃圾空间。
String的内容不要过多频繁修改。
对于字符串对象内容的改变,是利用了引用关系的变化而实现的,而每一次的变化都会产生垃圾空间。
String的内容不要过多频繁修改。