栈(stack) 堆(heap)是用java在ram(运行内存)中存放数据的地方
栈:优点:存取速度快,
缺点:数据的大小和生存期必须明确,缺乏灵活性。
堆:优点:可以动态的分配内存大小,生存期也不需要提前告诉编译器,编译器的垃圾回收机制会自动回收不需要的数据
缺点:需要动态的分配内存,所以存取速度慢
栈: 在栈中存放的数据可以被共享,如
int a=3;
int b=3;
首先编译器会在栈中创建一个变量a的引用,然后查找是否存在3这个值,如果没有就开辟一个存放3这个值的地址,然后将a指向3的地址。
然后处理b=3;先在栈中创建b的引用,在查找3这个值是否存在,存在便将b指向这个地址,这样a和b就共享了一个数据了。
java的基本数据类型存放在栈中,基本数据类型的包装对象存放在堆中。
用new创建的对象都在堆中
(1)我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,我们创建了String类的对象str。担心陷阱!对象可能并没有被创建!唯一可以肯定的是,
指向 String类的引用被创建了。至于这个引用到底是否指向了一个新的对象,必须根据上下文来考虑,除非你通过new()方法来显要地创建一个新的对象。因 此,
更为准确的说法是,我们创建了一个指向String类的对象的引用变量str,这个对象引用变量指向了某个值为"abc"的String类。
清醒地认 识到这一点对排除程序中难以发现的bug是很有帮助的。
比较包装类的值时用equals()方法,判断两包装的引用地址是否指向一个对象的时候用==。
栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量。所有的基本类型和对象的引用都存在栈中,栈中生存空间一般在当前scopes内就是由{}扩起来的部分
堆(heap):是一个可动态申请的内存空间,new出来的对象存在堆里面的,生存空间是由编译器回收垃圾机制来处理(根据对象是否被引用)。