js网站繁体,学产品设计的可以找什么工作,无锡网站制作推广,免费域名注册网中国万网涉及三块区域#xff1a;栈#xff0c;堆#xff0c;字符串常量池#xff08;jdk1.7之前在方法区#xff0c;jdk1.7之后在堆中#xff09; 关于字符串常量池到底在不在堆中#xff1a;
jdk1.6及以前#xff0c;方法区独立存在#xff08;不在堆里面#xff09;…涉及三块区域栈堆字符串常量池jdk1.7之前在方法区jdk1.7之后在堆中 关于字符串常量池到底在不在堆中
jdk1.6及以前方法区独立存在不在堆里面字符串常量池存在方法区
jdk1.7及以后字符串常量池被移到堆中 两种创建字符串的方式
1.直接创建 String stest
只在栈中创建一个对象堆中不创建对象
这个栈对象中保存的就是字符串的地址 2.new的方式创建 String snew String(test)
总共创建两个对象栈中创建一个对象堆中创建一个对象
堆中对象保存的是字符串的地址栈中对象保存的是堆中对象的地址所以栈中对象保存的是地址的地址 String s1 new String(abc) 这句代码创建了几个对象
答案1个或者2个
其实就是问栈和堆里面总共有几个对象
如果堆里面已经有一个对象保存了“abc“这个对象的地址那就只需要在栈中创建一个对象保存堆中对象的地址即可所以只需要创建一个对象
如果没有那就要创建两个对象先在堆中创建一个对象保存字符串的地址然后再在栈中创建一个对象保存堆中对象的地址总共创建两个对象 public class StringTest
{public static void main(String[] args) {String str1 abc;String str2 abc;String str3 new String(abc);String str4 new String(abc);System.out.println(str1 str2); //trueSystem.out.println(str1 str3); //falseSystem.out.println(str1.equals(str3)); //trueSystem.out.println(str3 str4); //false}
}第一个 str1和str2这两个对象里面存的都是字符串中的地址所以是true
第四个new一次就要在堆中创建一个新对象所以str3和str4存的堆中对象地址不相等