zoukankan      html  css  js  c++  java
  • 堆栈与堆的区别

    堆栈与堆都是存放在内存之中。

    堆栈:必须确定存放数据的大小与生存期,因此速度很快,仅次于位于处理器内部的寄存器。但不灵活。常用来存放句柄和基本类型。

    堆:动态分配内存大小与生存期,因此牺牲了速度,但很灵活,常用来存放对象。

    基本类型中,例如int a = 3,b= 3。

    首先会在栈中寻找字面值为3的地址,如果有,则让a指向该地址,如果没有,则开辟一个新的空间存储字面值3,同时将a指向该地址。而b由于已经在栈中存在字面值为3的空间,直接让b指向字面值为3的地址。因此a == b,因为它们两个指向同一个地址。

    如果再另a = 4。

    首先会在栈中寻找字面值为4的空间,如果存在则将a指向该地址,否则,开辟一个新的空间存储字面值4,再将a指向该地址。原来的b不受影响。此时a != b,因为它们地址不同。

    String类型中,例如String str = "abc";

    编译器首先会执行String str;

    然后在栈中寻找字面量为"abc"的地址,如果没有,则开辟新的空间,存放字面值为"abc",同时new一个String,句柄为o,然后将"abc"的地址返回给o,再将o的地址返回给str。如果有,则寻找o的地址,然后将o的地址返回给str。

    用代码来说则是:

    String a = "abc";

    String b = "abc";

    System.out.print(a == b) //true

    因为他们指向的是同一个o的地址。

    然后另a = "bcd";

    则此时System.out.pring(a == b); //false

    因为a已经指向了另外一个地址。

    如果此时再另b="bcd";

    则System.out,print(a == b); //true

    因为他们又重新指向了一个指向同一个字面量的句柄。

    而如果一旦使用String a = new String();来创建对象,则地址一定不会相同,即使在栈中已经存在同一个字面量的值,仍会开辟一个新的空间出来存放地址。

  • 相关阅读:
    linux的find命令详解
    在接口中的静态方法来获取model的实例对象
    php函数decbin
    cookie的默认有效目录
    html的base标签
    mysql多位小数字段用decimal类型
    vmware在桥接模式下配置centos7网络
    iis_rewrite3突然无法使用(因为它过期啦)
    LightGBM 调参方法(具体操作)
    沪深股票的复权计算(复权因子的应用)--代码实现
  • 原文地址:https://www.cnblogs.com/yxth/p/8377689.html
Copyright © 2011-2022 走看看