1.java变量存储域
java变量的存储区域主要放在以下几个地方:
(1)寄存器:可以说是最快的存储区,在C/C++中可以声明寄存器变量,但是在java中不能声明寄存器变量,只是编译器在编译时确定。
(2)栈:存放关于基本类型数据和对象的引用,但是对象本身并不在栈里,(通过new出来的)对象放在堆里或者常量池中(字符串的常量对象就放在常量池中)。
(3)堆:用于存放new出来的对象。
(4)常量池:存放字符串常量和基本类型数据的常量(通过 public static final修饰)。
(5)静态域:用于存放静态的成员(static)。
(6)非RAM存储:比如硬盘等。
在这里主要说说堆、栈和常量池。存放在栈里的数据的大小和生命周期是确定的,当所引用的数据消失时,该栈数据就会被JVM回收。存放在堆里的数据具有不确定性,当满足一定条件时,会被JVM的垃圾回收机制回收。
2.例子
比如以下代码:
1 String s1 = "example"; 2 String s2 = "example"3 String s3 = new String("example"); 4 String s4 = new String("example");
对于s1、s2将会存放在常量池中,对于s3(new出来的对象),会先去常量池中查找有没有"example"的对象,如果有,就会在堆里创建一个"example"的拷贝对象;如果没有,就会先在常量池中创建一个"example"的对象,然后再在堆里创建拷贝对象。
所以有道题:String str = new String("abc")创建了几个对象?
答曰:一个或两个。
原文地址:https://www.cnblogs.com/yuxiuyan
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。