java中 关于常量池 栈内存 堆内存

String a=“abc”;

int a=1;
上面的a是存放在 栈内存中,然后指向常量池中的abc么?
那么int a=1中的a是不是也是放在栈内存中,指向常量池中的1 啊????

Java中所有局部变量和对象的引用都是存储在栈内存中的,int a = 1;它是局部变量肯定是在栈内存,但是它与常量池没有关系;
常量池是堆内存中的一部分,专门用来存储字符串常量;所以String a="abc"中,引用a是存储在栈内存的,指向常量池中的"abc";

但是如果是String a = new String("abc");就又不一样了,对于通过构造函数得到的"abc"字符串对象,引用a还是在栈内存,但是"abc"不会存到字符串常量池中,而是在常量池之外的其他堆内存中再生成一个"abc",由于这个对象与原先常量池中的"abc"对象是equal关系,它们之间会建立起一种联系;
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-10-28
java中空间分为3个,串池、堆、栈、其中串池是放字符串的,比如“1234”,堆是放对象的。栈是放变量的。
第2个回答  2016-02-29
常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = "java"这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和
multianewarray等指令建立,不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事
先告诉编译器,因为是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。本回答被网友采纳
相似回答