装箱问题

线程堆栈(Thread Stack)和托管堆(Managed Heap)

孤人 提交于 2020-01-26 04:35:06
内存格局 通常分为四个区 全局数据区:存放全局变量,静态数据,常量 代码区:存放所有的程序代码 栈区:存放为运行而分配的局部变量,参数,返回数据,返回地址等, 堆区:即自由存储区 值类型变量与引用类型变量 的内存分配模型也不一样。为了理解清楚这个问题,首先必须区分两种不同类型的内存区域: 线程堆栈(Thread Stack)和托管堆(Managed Heap)。 每个正在运行的程序都对应着一个进程(process),在一个进程内部,可以有一个或多个线程(thread),每个线程都拥有一块“自留地”,称为“线程堆栈”,大小为1M,用于保存自身的一些数据,比如函数中定义的局部变量、函数调用时传送的参数值等,这部分内存区域的分配与回收不需要程序员干涉。所有值类型的变量都是在线程堆栈中分配的。 另一块内存区域称为“堆(heap)”,在.NET 这种托管环境下,堆由CLR 进行管理,所以又称为“托管堆(managed heap)”。用new 关键字创建的类的对象时,分配给对象的内存单元就位于托管堆中。 在程序中我们可以随意地使用new 关键字创建多个对象,因此,托管堆中的内存资源是可以动态申请并使用的,当然用完了必须归还。 打个比方更易理解:托管堆相当于一个旅馆,其中的房间相当于托管堆中所拥有的内存单元。当程序员用new 方法创建对象时,相当于游客向旅馆预订房间

java的封箱和拆箱

天涯浪子 提交于 2020-01-19 11:53:22
1、 基本概念 字节的单位:byte。位的单位:bit,1byte=8bit 2、 8种基本数据类型 4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型和1种用于表示真值的boolean类型。 数据类型 浮点型大小(占字节数,2的几次方) 范围 默认值 包装器类型 byte(字节) 8 -128 - 127 0 Byte shot(短整型) 16 -32768 - 32768 0 Short int(整型) 32 -2147483648-2147483648 0 Integer long(长整型) 64 -9233372036854477808-9233372036854477808 0 Long float(浮点型) 32 -3.40292347E+38-3.40292347E+38 0.0f Float double(双精度) 64 -1.79769313486231570E+308-1.79769313486231570E+308 0.0d Double char(字符型) 16 ‘ \u0000 - u\ffff ’ ‘\u0000 ’ Character boolean(布尔型) 1 true/false false Boolean 3、 包装类   包装类即使把基本类型变成对象类型,包含每种基本数据类型的相关属性如最大值、最小值等

(二十四)、装箱和拆箱

醉酒当歌 提交于 2020-01-19 11:50:33
一、什么是装箱?什么是拆箱? 首先,Java为每种基本数据类型都提供了对应的包装器类型。 在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样声明: Integer i = new Integer(10); 而从Java SE%开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样声明: Integer i = 10; 这个过程中会自动根据数值创建对应的Integer对象,这就是装箱。 那什么是拆箱呢?顾名思义,跟装箱对应,就是自动把包装器类型转换为基本数据类型: Integer i = 10; //装箱 int n = i; //拆箱 简单一点说,装箱就是 自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。 下表就是基本数据类型对应的包装器类型: 二、装箱和拆箱是如何实现的? 我们就以Integer类为例,下面看一段代码 public class test{ public static void main(String[] args) { Integer i = 10; int n = i; } } 经过javap - c test.class得到反编译文件内容: 从反编译的字节码内容可以看出,在装箱的时候自动调用的是Integer的valueOf(int)方法

剖析Java中的装箱和拆箱

こ雲淡風輕ζ 提交于 2020-01-19 11:49:00
  自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。   以下是本文的目录大纲:   一.什么是装箱?什么是拆箱?   二.装箱和拆箱是如何实现的   三.面试中相关的问题   若有不正之处,请谅解和批评指正,不胜感激。   请尊重作者劳动成果,转载请标明原文链接:    http://www.cnblogs.com/dolphin0520/p/3780005.html 一.什么是装箱?什么是拆箱?   在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料。在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: 1 Integer i = new Integer( 10 );   而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了: 1 Integer i = 10 ;   这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。   那什么是拆箱呢?顾名思义,跟装箱对应,就是自动将包装器类型转换为基本数据类型: 1 2 Integer

<NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型

家住魔仙堡 提交于 2020-01-18 03:53:32
5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句打开或关闭溢出检查,如: byte b = 100; b = checked((byte)(b + 200)); uint invalid = unchecked((uint)(-1)); checked { b += 200; } 在checked操作符或语句中调用方法,不会对该方法造成任何影响,如: checked { //假定SomeMethod试图把400加载到一个Byte中 SomeMethod(400); //SomeMethod可能会、也可能不会抛出OverflowException异常 //如果SomeMethod使用checked指令编译,就可能会抛出异常 //但这和当前的checked语句无关 } 尽量使用有符号数值类型(比如Int32和Int64)而不是无符号数值类型(比如UInt32和UInt64),这允许编译器检测更多的上溢/下溢错误.较少的强制类型转换也可以使代码更整洁,更易维护. System.Decimal在CLR中不被认为是基元类型.处理速度慢于CLR基元类型.常用于不容许舍入误差的金融计算.checked和unchecked操作符

装箱和拆箱

╄→尐↘猪︶ㄣ 提交于 2020-01-15 00:55:45
装箱和拆箱 1、装箱和拆箱   装箱转换是指将一个值类型隐式地转换成一个object 类型,或者把这个值类型转换成一个被该值类型应用的接口类型interface-type。把一个值类型的值装箱,也就是创建一个object 实例并将这个值复制给这个object。比如: int i = 10 ; object obj = i ; 装箱的过程 我们也可以用显式的方法来进行装箱操作: int i = 10 ; object obj = ( object ) i ; 2、拆箱转换 和装箱转换正好相反,拆箱转换是指将一个对象类型显式地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口的值类型。 拆箱的过程分为两步:首先,检查这个对象实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。 利用如下例子,查看一个对象拆箱的过程 。 int i = 10 ; object obj = i ; int j = ( int ) obj ; 可以看出拆箱过程正好是装箱过程的逆过程。必须注意,装箱转换和拆箱转换必须遵循类型兼容原则。 尽量避免装箱 我们之所以研究装箱和拆箱,是因为装箱和拆箱会造成相当大的性能损耗(相比之下,装箱要比拆箱性能损耗大),性能问题主要体现在执行速度和字段复制上。因此我们在编写代码时要尽量避免装箱和拆箱,常用的手段为: 1. 使用重载方法

深入理解java数据类型

穿精又带淫゛_ 提交于 2020-01-13 13:24:33
深入理解java数据类型 深入理解java数据类型 1. 整型 自动装箱与自动拆箱 java整型对java跨平台的支持: 2.浮点类型 3.总结 深入理解java数据类型 java是一种强类型语言,这就意味着必须为每一个声明变量声明一种类型。在java中,一共有8种数据类型,其中4种整型,2种浮点类型,1种字符类型和一种表示真值的boolean类型。 1. 整型 整型用于表示没有小数部分的整数部分,java提供了4中整型,如下表所示: 类 型 存储大小 取值范围 int 4字节 -2^31 ~ 2^31 - 1 short 2字节 -2^15 ~ 2^15 - 1 long 8字节 -2^63 ~ 2^63 - 1 byte 1字节 -2^7 ~ 2^7 - 1 但是java是一门面向对象的语言,所以对于基本类型java也有其包装类型:Integer,Short,Long,Byte. 自动装箱与自动拆箱 为了使基本数据类型灵活转变,java采用了自动装箱与自动拆箱。如下所示: Integer i = 9; // 装箱 int a = i; // 拆箱 装箱就是自动把基本类型转化为包装器类型,拆箱就是自动把包装器类型转化为基本数据类型。 那么java是怎么实现自动装箱和自动拆箱的呢?我们反编译一下: public static void main(java.lang.String[]

【CLR Via C#】第5章 基元类型、引用类型、值类型

霸气de小男生 提交于 2020-01-12 09:37:02
  第二遍看这本书,决定记录一下加深印象。 值类型可以存储在堆和栈上,它是局部变量时存储在栈上,如果值类型是作为类的一个属性,那么就会存储在堆上; 引用类型有两块内存,一块存储引用地址(栈上),一块存储实际的对象(堆上)。 1,基元类型   什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型。比如int直接映射到System.Int32类型,就像是添加了using应用:using sbyte=System.SByte. C#基元类型 FCL类型 说明 sbyte System.SByte 有符号8位 byte System.Byte 无符号8位 short System.Int16 有符号16位 ushort System.UInt16 无符号16位 int System.Int32 有符号32位 uint System.UInt32 无符号32位 long Syetem.Int64 有符号64位 ulong System.Int64 无符号64位 char System.Char 16位Unicode字符 float System.Single 32位浮点值,即带小数 double System.Double 64位浮点值 bool System.Boolean True/False decimal [英] 'desɪml

Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践

独自空忆成欢 提交于 2020-01-11 05:02:53
一  protobuf-net优化效果图   protobuf-net是Unity3D游戏开发中被广泛使用的Google Protocol Buffer库的c#版本,之所以c#版本被广泛使用,是因为c++版本的源代码不支持Unity3D游戏在各个平台上的动态库构建。它是一个网络传输层协议,对应的lua版本有两个可用的库:一个是proto-gen-lua,由tolua作者开发,另外一个是protoc,由云风开发。protobuf-net在GC上有很大的问题,在一个高频率网络通讯的状态同步游戏中使用发现GC过高,所以对它进行了一次比较彻底的GC优化。下面是优化前后的对比图: protobuf-net优化前GC和性能效果图 protobuf-net优化后GC和性能效果图 二  Unity3D游戏GC优化概述   有关Unity3D垃圾回收的基本概念和优化策略Unity官网有发布过文章: Optimizing garbage collection in Unity games 。这篇文章讲述了Unity3D垃圾回收机制,和一些简单的优化策略,讨论的不是特别深入,但是广度基本上算是够了。我罗列一下这篇文章的一些要点,如果你对其中的一些点不太熟悉,建议仔细阅读下这篇文章:   1、C#变量分为两种类型:值类型和引用类型,值类型分配在栈区,引用类型分配在堆区,GC关注引用类型   2

java 装箱和拆箱

风流意气都作罢 提交于 2020-01-07 13:05:23
每次看到某篇博客里面说要静下心来欣赏源码,我都很感慨,我的耐心没人家好。是真的要静下心来读源码,因为说不定就像作者说的那样 “说不定你就发现了一个优秀的设计呢!!!” 才不久就被同事说了,学知识的时候不要看野史,要看官方。我还是做不到。官方是一定要看的,但是野史还是照样翻,因为我觉得很多野史写的很生动,甚至有滋有味,有声有色,能从作者的言词中感受到人家的认真,不知不觉中能成为自己的榜样。 都是同行,为什么人家就能那么优秀,我要向其学习。 题外话 今天早上在学习公司代码,然后准备学习下MVP框架,于是找了个简单的MVP框架例子,结果在框架中,发现了一个类叫SparseArray的类,秉持着一种遇到问题就深究下去的精神,我就转去看SparseArray相关的知识,结果发现了一片新天地,顺带研究了一番Android里的几个集合类,主要是SparseArray和ArrayMap,然后我就想,Java里不是有了很多集合类了嘛,比如HashMap,TreeMap,ArrayList,LinkList等等,为啥Android还要再弄一个呢,何况Android本身就是基于Java的,于是我又屁颠屁颠去找相关资料,结果,又发现一个小岛(这个应该不是新大陆,额嘿嘿!),这个小岛就是Java装箱和拆箱,,为了弄清楚Android为啥还要专门弄个自己的集合类,于是就有了这篇文章