String类的两种实例化方式与区别
在Java中只有字符char这一数据类型的存在,并没有字符串这一数据类型的存在,但是通过设计的形式提供了String类,并且还有两种实例化方法
1.通过直接赋值的形式为String类对象实例化
Public class Demo{
Public Static void main(String args[]) {
String str = "www.youkuaiyun.com"; //【直接赋值实例化】String类对象实例化
System.out.println("str");
}
}
String本身属于一个系统类,除了可以利用直接赋值的形式进行对象实例化之外,同时也提供了相应的构造方法进行实例化。
2.通过构造方法实例化String类对象
public class Demo{
public static void main(String args[]){
String str = new String("www.youkuaiyun.com"); //【构造方法实例化】String类对象实例化
System.out.println(str);
}
}
两种实例化方式比较
1.直接赋值的对象实例化模式
Public class Demo{
Public Static void main(String args[]) {
String str = "www.youkuaiyun.com"; //采用直接赋值实例化对象
}
}
这时候在内存中会开辟出一块堆内存,内存空间中保存有“www.youkuaiyun.com”字符串数据,并且栈内存中将直接引用此堆内存空间,如图所示:

通过直接赋值的方式为String类对象实例化会开辟一块堆内存空间,而且对同一字符串的多次赋值还可以实现对堆内存空间的重用,即采用直接赋值的方式进行String类对象实例化,在内容相同的情况下不会开辟新的堆内存空间,而会直接指向已有的堆内存空间。
(1).观察直接赋值时堆内存的内存自动引用:
public class Demo{
public static void main(String args[]){
String strA = "csdn";
String strB = "csdn";
String strC = "string";
System.out.println(strA == strB); //在java中,关系运算符==如果用在String类上则表示内存地址数值的比较是否相同
System.out.println(strA == strC);
}
}
程序运行结果:
true (“strA == strB”代码执行结果)
false (“strA == strC”代码执行结果)
在本程序中,由于使用了直接赋值实例化操作方式,而且内容相同,所以即使没有直接发生对象的引用操作,最终两个String对象(strA、strB)也都自动指向了同一块堆内存空间。但是如果在直接赋值时内容与之前不一样,则会自动开辟新的堆内存空间(String strC = “string”;),如图所示:

String strA = “csdn”;
(a)直接赋值

String strB = “csdn”;
(b)自动引用

String scrC = “string”;
(c)开辟新内存
Tips:
实际上,在JVM的底层存在有一个对象池(String只是对象池中保存的一种类型,此外还有多种其他类型),当代码中使用了直接赋值的方式定义了一个String类对象时,会将此字符串所使用的匿名对象入池保存,如果后续还有其他String类对象也采用了直接赋值的方式,并且设置了同样内容,那么将不会开辟新的堆内存空间,而是使用已有的对象进行引用的分配,从而继续使用。
2.构造方法实例化
如果要调用String类中的构造方法进行String类对象的实例化操作,那么一定要使用关键字new,而每当使用关键字new就表示要开辟新的堆内存空间,而这块堆内存空间的内容就是传入构造方法中的字符串数据。
构造方式实例化对象
public class Demo{
public static void main(String args[]){
String str = new String("csdn");
}
}
如图所示:

由于每一个字符串都是一个String的匿名对象,所以当使用构造方法实例化String对象时会先在堆内存中开辟一块空间来保存字符串,之后再使用运算符new来新开辟一块内存空间来实例化的那个字符串。而之前定义的字符串所开辟的堆内存空间将不会被任何栈内存所指向,而是成为一片垃圾空间等待被回收。
参考资料:
[1]:《Java:从入门到项目实战》中国水电水利出版社
[2]:https://www.runoob.com/java/java-string.html
386



被折叠的 条评论
为什么被折叠?



