静态变量在内存中是怎么存放的

lingfeng892 2015-04-13 09:36:03
例如:

//1、
static int a = 1;
//2、
static Integer b = 2;
//3、
static Map<String String> map = new HashMap<String String>();

能不能详细的说一下,主要是第三种情况,map存在在哪、new HashMap存在哪、里面String存在哪、String的值存在哪
...全文
2363 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
s7634800 2015-04-14
  • 打赏
  • 举报
回复

一个简单的内存解析图~
静态变量 应该都是直接在上图数据区中直接存放的,不用实例化对象就能调用......至于楼主说的第三种情况,个人认为:new关键字分配的对象应该是在堆内存中的,就是说new HashMap<String String>(); 分配的内存实在堆内存中,而static Map<String String> map 是在数据区,俩者之间有一个引用关系,类似指针什么的........水平有限,只能说出自己的理解,我也是新手~
阿木木的忧伤 2015-04-14
  • 打赏
  • 举报
回复
(1)首先static 称为类变量,它属于这个类,而不属于这个类的实例对象(但是可以通过实例对象去访问)当类连接的时候就为其分配空间并初始化默认值,空间分配在堆中。 (2)Integer是int的包装类型,其中采用了缓存机制,在缓存中-128~127这些数是在堆中本来就存在的,所以Integer a = new Integer(1); Integer b = new Integer(1); a与b其实是一个对象。如果你把数字改为128的话那就是两个对象了 (2)Map是一个接口, HashMap是map的一个实现类而已,在一个可变大小的容器,内存空间分配在堆中,map中存放的数据其实不是String的值,而是存放的String的引用(你可以理解为是String字符串的地址),以为String的创建是非常消耗资源的,所以在JVM中不希望你去反复的创建字符串对象,而是它维持了一个字符串池(在常量区),当你以String s=“abc”创建字符串的时候它会先去池中找,如果找到返回“abc”的引用,如果找不到那么才会去创建对象。 当你以String s = new(“abc”)的形式创建字符串时,其实是创建了两个对象,首先在堆中分配空间,其次把这个对象扔到字符串池中。 希望对你有所帮助
sg19911227 2015-04-14
  • 打赏
  • 举报
回复
1.创建的实例及成员变量(静、非静态)在堆中; 2、局部变量在栈中 3、类的基本信息和方法定义在方法区
xuyiranxiaosa 2015-04-14
  • 打赏
  • 举报
回复
new关键字分配对象在堆内存中的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧