栈和堆
栈(stack)和堆(heap)是Java中用来在RAM中存储数据的地方,与C++不同,Java自动管理栈和堆,程序员不能直接设置栈或堆。
栈:
在通用RAM中,通过堆栈指针从处理器获得直接支持,访问速度很快,仅次于寄存器。创建程序时,Java系统必须知道堆栈内所有项的确切的生命周期。这一条件限制了程序的灵活性,所以java对象并没有存储在堆栈中。而是存在了堆中。
堆:
也位于通用RAM中,存放Java对象。不同于堆栈的地方就是:编译器不需要知道存储的数据在堆里的存活时间,因此十分灵活。new一个对象就会将对象存到堆中。当然用堆进行数据存储相对堆栈要花费更多的时间。
以上可知Java中new的对象存储在堆中
其他
引用:
对于方法中局部变量的引用存储在java运行时数据区的栈中,而对于实例变量则存储在java运行时数据区的堆中。
例子:
void func()
{
Object obj = new Object();//这个obj在函数的栈里。
}
class Test
{
private Object obj = new Object();//这个obj随对应的Test对象分配在堆里
}
基本类型:
存在堆栈里
创建很小的变量存储在堆中的效率太低,这些变量直接存值并不是存引用
字符串:
字符串是个比较特殊的例子由下面这种形式定义的存储在栈中
String str = "abc";
这种方式定义的存在堆中
String str = new String("abc");
例子:
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
str1 = new String("abc");
str2 = new String("abc");
System.out.println(str1 == str2);
str1 = "abc";
str2 = "abc";
System.out.println(str1 == str2);
}
输出结果为:
true
false
true
总结:用new创建的存在堆中,不用new创建的存在栈中。