java中 关于常量池 栈内存 堆内存
Stringa=“abc”;inta=1;上面的a是存放在栈内存中,然后指向常量池中的abc么?那么inta=1中的a是不是也是放在栈内存中,指向常量池中的1啊????...
String a=“abc”;
int a=1;
上面的a是存放在 栈内存中,然后指向常量池中的abc么?
那么int a=1中的a是不是也是放在栈内存中,指向常量池中的1 啊???? 展开
int a=1;
上面的a是存放在 栈内存中,然后指向常量池中的abc么?
那么int a=1中的a是不是也是放在栈内存中,指向常量池中的1 啊???? 展开
3个回答
展开全部
Java中所有局部变量和对象的引用都是存储在栈内存中的,int a = 1;它是局部变量肯定是在栈内存,但是它与常量池没有关系;
常量池是堆内存中的一部分,专门用来存储字符串常量;所以String a="abc"中,引用a是存储在栈内存的,指向常量池中的"abc";
但是如果是String a = new String("abc");就又不一样了,对于通过构造函数得到的"abc"字符串对象,引用a还是在栈内存,但是"abc"不会存到字符串常量池中,而是在常量池之外的其他堆内存中再生成一个"abc",由于这个对象与原先常量池中的"abc"对象是equal关系,它们之间会建立起一种联系;
常量池是堆内存中的一部分,专门用来存储字符串常量;所以String a="abc"中,引用a是存储在栈内存的,指向常量池中的"abc";
但是如果是String a = new String("abc");就又不一样了,对于通过构造函数得到的"abc"字符串对象,引用a还是在栈内存,但是"abc"不会存到字符串常量池中,而是在常量池之外的其他堆内存中再生成一个"abc",由于这个对象与原先常量池中的"abc"对象是equal关系,它们之间会建立起一种联系;
展开全部
java中空间分为3个,串池、堆、栈、其中串池是放字符串的,比如“1234”,堆是放对象的。栈是放变量的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2016-02-29 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = "java"这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和
multianewarray等指令建立,不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事
先告诉编译器,因为是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和
multianewarray等指令建立,不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事
先告诉编译器,因为是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |