zoukankan      html  css  js  c++  java
  • 关于装箱和拆箱的学习笔记

    关于装箱和拆箱的概念:

    1. 最早的时候,我以为将对象转换为Object类型就是装箱,将转换后的Ojbect转换回具体的类型就是拆箱。后来才知道,值类型和引用类型之间的互相转换才叫装箱,拆箱。
    2. 装箱和拆箱是有一定的性能损耗的,尽量避免无意义的装箱拆箱,比如用泛型。

    装箱的具体步骤:

    int x=2;
    object o=x;//这里是装箱
    1. 生成一个新的引用对象(比如上面代码中的o最后引用的对象)并在托管堆上为其分配内存。(我理解为这里有个隐藏的 new object() )
    2. 将要装箱的对象数据复制到新生成的对象上。(将x的值赋给 new object())
    3. 返回新对象的引用。(o被赋值,指向赋过值的new object())

    在这3步中,生成一个新的对象分配内存和复制数据是性能损耗的根本。而值得注意的是o指向的对象是一个新的在托管堆中的对象,而不是在栈中的x,所以对这个新的对象作任何的改动都不会影响到原先的值对象。

    拆箱的具体步骤:

    1. 获取引用对象在托管堆中原值类型对象的值。((int)o)
    2. 将值赋值给值对象。(int y=)

    假如这里没有第二步,直接这样写"((int)o).DoSomeThing();",假如这个DoSomeThing会改变值对象的值,那么此时改变的是一个临时的值对象的值,而不是o的值。我理解为这里在栈上又生成了一个新的值对象。并且这个对象是临时的,你没法在下一条语句中获它的值。

    而如果是这样的写法"int y=(int)o;"则不会生成临时的值对象。

  • 相关阅读:
    Django---Blog系统开发之注册页面(验证码&ajax发送文件)
    Django---Blog系统开发之建库
    Eclipse下导入外部jar包的3种方式
    linux 下 .sh 文件语法
    热备,冷备,云备的区别
    plsql 中如何清除曾经登录过的用户名
    Mac 查看python安装路径
    mac terminal终端怎么退出python命令行
    PyCharm 2017 Mac 免注册版破解安装说明
    PL/SQL恢复默认窗口样式
  • 原文地址:https://www.cnblogs.com/xxfss2/p/2619476.html
Copyright © 2011-2022 走看看