先回答第三个问题,我的理解是不一样的,内存时JVM运行时开辟的空间,数据结构是存储数据的方式,两者根本就不是一个东西,怎么能一样。第一二个问题,我以前也查过资料,整理如下: String是一种特殊的包装类数据,它有两种创建方式:String s1=”ab”
String s2=new String(“ab”)
注:String s1=”ab”, 这种方法先在栈中创建一个对String类的对象引用变量s1,然后再去查找”ab”是否被保存在字符串常量池中,如果没有则在栈中创建两个char型的值’a’、’b’,然后在堆中创建一个String对象,它的值是刚才在栈中创建的两个char类型值组成的数组{‘a’,’b’},接着这个String对象object被存放进字符串常量池,最后将是是s1指向这个对象的地址,如果’ab’已经保存在常量池中,则在字符串常量值中找到值为’ab’的对象object,然后将s1指向这个对象的地址。
String s2=new String(“ab”),这种可以分解成两步1、Stringobject = "ab"; 2、String s = newString(object); 第一步参考第一种创建方式,而第二步由于"ab"已经被创建并保存到字符串常量池中,因此jvm只会在堆中新创建一个String对象,它的值共享栈中已有的两个char型值。
|