Java拾遗——存储位置

栈和堆

栈(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创建的存在栈中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值