• 堆栈与堆的区别


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

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

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

    基本类型中,例如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();来创建对象,则地址一定不会相同,即使在栈中已经存在同一个字面量的值,仍会开辟一个新的空间出来存放地址。

  • 相关阅读:
    Spring Boot Common application properties(转载)
    SVN中trunk,branches,tags用法详解(转载)
    约定优于配置
    JavaScript封装一个MyAlert弹出框
    JavaScript封装一个实用的select控件
    JavaScript的8行代码搞定js文件引入问题
    JavaScript处理数据完成左侧二级菜单的搭建
    SpringMVC+Mybatis实现的Mysql分页数据查询
    十步完全理解 SQL(转载)
    sql语句练习50题
  • 原文地址:https://www.cnblogs.com/yxth/p/8377689.html
Copyright © 2020-2023  润新知