方式一:直接赋值 String s=”hsp”;
方法二:调用构造器 String s2=new String(“hsp”);
两种方法创建String对象jvm的内存布局
方式一:直接赋值 String s=”hsp”;
1. 先看常量池有没有”hsp”的数据空间,如果有直接指向。没有则在常量池创建”hsp”,然后s指向它(常量池的空间地址)。
方法二:调用构造器 String s2=new String(“hsp”);
2.先在堆中创建空间,里面有value属性(char value[]),指向常量池的hsp空间。如果常量池有没有”hsp”的数据空间,就在常量池创建”hsp”。如果有则通过value(复制常量池”hsp”地址)指向,最终指向的是堆中的空间地址。
例题:
public class String01 {
public static void main(String[] args) {
//1.直接赋值创建Syring对象
String a1="hsp";
String a2="hsp";
//2.调用构造器
String b=new String("hsp");
System.out.println(a1.equals(a2)); //equals已被重写,比较的是值或内容是否相等
System.out.println(a1==a2); //比较是否是同一对象
System.out.println(a1.equals(b));
System.out.println(a1==b);
}
}
输出结果:
true
true
true
false
a1、a2的对象和值相同。
因为a1、a2对象指向的都是常量池中的字符串"hsp"对象,所以它们的对象是相同的,且值相同,输出结果都为true。
a1、b1的对象不同,值相同。
因为b1是先在堆中创建空间(value),用value来指向常量池中的字符串"hsp",而a1是直接指向常量池中的字符串"hsp",所以两个的对象不同,所以输出为false。
内存布局如下: