装箱拆箱中内存分布的流程

问题描述

装箱拆箱中内存分布的流程

装箱问题,我在msdn上看到的说明又变糊涂了;
object o=1;
我们知道这里发生了装箱,在堆上开辟了内存空间并且返回了一个引用给o,这个o现在是谁?(我原来理解就是这个新开辟的内存就是o,那这个引用返回给谁?)
我在msdn上看到说是栈上面的“The result of this statement is creating an object reference o, on the stack, that references a value of the type int, on the heap.”
希望大家能给我详细讲下这个内存上的流程,谢谢了!

解决方案

你这个东西,在编译期的时候,JVM 应该会这样处理
第一步:Integer.valueOf(1) 这就是一个Integer对象了
第二部:让o 指向 这个Integer对象
o只是一个指向Integer对象的引用
o是在栈中的,Integer对象是放在堆中的

这样做类型转换是没问题的
Object o = 1;
Integer i = (Integer)o;

解决方案二:

多态机制,object o = new Integer(0);

1:在栈中创建一块区域,变量类型暂时为object,变量名为o,
2:在堆中new Integer(1);将堆中地址值赋给o。
3:在运行时期,o通过地址值找到堆中区域对象,这时object就代表integer对象。

时间: 2024-10-27 06:10:24

装箱拆箱中内存分布的流程的相关文章

list-link中使用List<object>还需要装箱拆箱么?

问题描述 link中使用List<object>还需要装箱拆箱么? link中使用List还需要装箱拆箱么? 解决方案 首先搞清楚,装箱拆箱在什么情况下发生,当你将堆栈上的变量放入维持object引用的集合的时候,必然要装箱.试想,如果List不装箱,而直接存int,那么它存另一种类型,比如string 存入的是引用(地址),岂不是乱套了,它怎么知道这个是int的值还是string的引用.所以必须都装箱成对象. 所以结论就是,需要.

java自动装箱拆箱深入剖析_java

这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱): 其实按照我自己的理解自动装箱就可以简单的理解为将基本数据类型封装为对象类型,来符合java的面向对象:例如用int来举例: 复制代码 代码如下: //声明一个Integer对象 Integer num = 10; //以上的声明就是用到了自动的装箱:解析为 Integer nu

java 自动装箱拆箱实现方法

java 自动装箱拆箱实现方法 什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自j2se 5.0开始提供的功能.  一般我们要创建一个类的对象的时候,我们会这样: class a = new class(parameter); 当我们创建一个integer对象时,却可以这样: integer i = 100; (注意:不是 int i = 100; ) 实际上,上面那句代码相当于:integer i = new integer(100); 此即基本

Java基础笔记 – 增强的for循环For each循环 自动装箱拆箱 可变参数

1.For each循环:1.1.语法:1.2.For each循环的使用:1.3.嵌套For each循环:1.4.三种循环遍历集合的列举:1.5.增强的for循环的缺点:2.自动装箱/拆箱(Autoboxing/unboxing):2.1.自动装箱:2.2.自动拆箱:2.3.Integer类相关的源代码:2.3.1.valueOf方法:3.可变参数:3.1.包含可变参数的函数:3.2.接收参数:3.3.说明: 1.For each循环: JDK5.0中提供的新特性For each循环的加入简

Java 性能要点:自动装箱/ 拆箱 (Autoboxing / Unboxing)

[编者按]本文作者为 Ali Kemal TASCI,最早于2016年4月9日发布于DZONE社区.文章主要介绍通过改进 Java 1.5 就已存在的骨灰级特性大幅度提高应用性能. 本文系 OneAPM 工程师编译呈现,以下为正文. 如果我告诉你:"只要修改一个字符,下面这段代码的运行速度就能提高5倍.",你觉得可能么? long t = System.currentTimeMillis(); Long sum = 0L;for (long i = 0; i < Integer.

C#装箱拆箱操作演示代码

  C#装箱和拆箱操作的演示代码,不知道什么是装箱和拆箱的这里就不介绍了,是栈和堆的使用方面的东西,C#专业达人应该都知道,所以这里就不哆嗦了,代码也是面向C#新手的,挺简单:

Java中的装箱和拆箱深入理解_java

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: 复制代码 代码如下: Intege

深入剖析Java中的装箱和拆箱

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i = new I

深入剖析Java中的装箱和拆箱(转)

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题 一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE