您的位置:首页 > 编程语言 > Java开发

Java知识:数据存储位置&常量池

2017-07-04 15:48 295 查看

1.数据存储位置

常用到的数据存储位置有下面3个,其他的也有但是作者水平差,就先总结3个方便自己记忆。

       1.栈

1 基础数据类型 byte short int long float double char boolean
2 方法的形式参数,方法调用完后从栈空间回收
3 引用对象的地址,引用完后,栈空间地址立即被回收

2.堆

1 new出来的对象
2 数组

3.方法区

1 常量池2 static3 所有的class举些例子:
String s1 = "china";
String s2 = "china";
String s3 = "china";

String ss1 = new String("china");
String ss2 = new String("china");
String ss3 = new String("china");
这里解释一下黄色这3个箭头,对于通过new产生一个字符串(假设为“china”)时,会先去常量池中查找是否已经有了“china”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。  这也就是有道面试题:Strings=newString(“xyz”);产生几个对象?一个或两个,如果常量池中原来没有”xyz”,就是两个。
对于基础类型的变量和常量,变量和引用存储在栈中,常量存储在常量池中。
如以下代码:
int i1 = 9;int i2 = 9;int i3 = 9;final int INT1 = 9;final int INT2 = 9;final int INT3 = 9;
编译器先处理inti1 = 9;首先它会在栈中创建一个变量为i1的引用,然后查找栈中是否有9这个值,如果没找到,就将9存放进来,然后将i1指向9。接着处理int i2 = 9;在创建完i2的引用变量后,因为在栈中已经有9这个值,便将i2直接指向9。这样,就出现了i1与i2同时均指向9的情况。最后i3也指向这个9。我认为虽然两个栈和常量池中都是9但是还是有所区别的。我是从好几个博客摘抄的,自己能力有限,如果不对请指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java