`
defrag_sly
  • 浏览: 126376 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

对象保存到什么地方

    博客分类:
  • java
阅读更多
程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以保存数据:
(1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。
(2) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。
(3) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
(4) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。
(5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
(6) 非RAM存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复成普通的、基于RAM的对象。Java 1.1提供了对Lightweight persistence的支持。未来的版本甚至可能提供更完整的方案。

主要类型
有一系列类需特别对待;可将它们想象成“基本”、“主要”或者“主”(Primitive)类型,进行程序设计时要频繁用到它们。之所以要特别对待,是由于用new创建对象(特别是小的、简单的变量)并不是非常有效,因为new将对象置于“堆”里。对于这些类型,Java采纳了与C和C++相同的方法。也就是说,不是用new创建变量,而是创建一个并非句柄的“自动”变量。这个变量容纳了具体的值,并置于堆栈中,能够更高效地存取。
Java决定了每种主要类型的大小。就象在大多数语言里那样,这些大小并不随着机器结构的变化而变化。这种大小的不可更改正是Java程序具有很强移植能力的原因之一。

主类型   大小  最小值     最大值         封装器类型

boolean 1-bit  –           –             Boolean

char    16-bit Unicode 0  Unicode 216- 1 Character

byte    8-bit  -128        +127           Byte

short   16-bit -215       +215 – 1        Short①

int     32-bit -231       +231 – 1        Integer

long    64-bit -263       +263 – 1         Long

float   32-bit IEEE754    IEEE754          Float

double  64-bit IEEE754    IEEE754          Double

void    –       –          –               Void①


①:到Java 1.1才有,1.0版没有。

数值类型全都是有符号(正负号)的,所以不必费劲寻找没有符号的类型。
主数据类型也拥有自己的“封装器”(wrapper)类。这意味着假如想让堆内一个非主要对象表示那个主类型,就要使用对应的封装器。例如:
char c = 'x';
Character C = new Character('c');
也可以直接使用:
Character C = new Character('x');


高精度数字
Java 1.1增加了两个类,用于进行高精度的计算:BigInteger和BigDecimal。尽管它们大致可以划分为“封装器”类型,但两者都没有对应的“主类型”。
这两个类都有自己特殊的“方法”,对应于我们针对主类型执行的操作。也就是说,能对int或float做的事情,对BigInteger和BigDecimal一样可以做。只是必须使用方法调用,不能使用运算符。此外,由于牵涉更多,所以运算速度会慢一些。我们牺牲了速度,但换来了精度。
BigInteger支持任意精度的整数。也就是说,我们可精确表示任意大小的整数值,同时在运算过程中不会丢失任何信息。
BigDecimal支持任意精度的定点数字。例如,可用它进行精确的币值计算。
分享到:
评论

相关推荐

    jsp九大内置对象

     ● public void setAttribute(String key,Object obj):将参数Object指定的对象obj添加到Session对象中,并为添加的对象指定一个索引关键字。  ● public Object getAttribute(String key):获取Session对象中...

    深入Java对象及元素的存储区域

    换句话说,在程序运行的时候,才会最终确定对象的归属,即对象应该存储在什么地方。由于存储在不同的区域,其在性能上会有所不同。为此作为Java程序开发人员需要了解各个存储区域的特点以及对性能的影响。然后再根据...

    angular-parse:使用 Parse 查询和对象保存在 angular 生命周期内的服务

    角度解析Angular-Parse 是一组服务,用于使用 Parse 查询和对象保存在 Angular 生命周期内,使用promises并且无需使用$scope.$apply安装通过 $ npm install angularparse 通过$ bower install angularparse演示检查...

    【05-面向对象(下)】

    •但对引用类型的变量而言,它仅仅保存的是一个引用,final只能保证他的地址不变,但不能保证对象,所以引用 类型完全可以改变他的对象。 可执行“宏替换”的final变量 •对一个final变量来说,不管它...

    PHP 面向对象技术(全面讲解).txt

    架构,OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成,OOP 达到了软件工程的三个目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收 信息、处理数据和向其它...

    VB用GDI+把图片保存为JPEG(即JPG)格式

    这个功能用到的地方很多,GDI+是系统的工具,但是发布较晚,所以没有完全普及。...这个函数可以将 StdPicture 对象用 GDI+解码器保存为 JPEG格式文件。 Quality参数是清晰度,越低越模糊,但是压缩更高。

    人大-面向对象程序设计-个人资料管理工具(免费下载)如需指导请加QQ2945047042

    ◆ 剪切/复制(可选):子树搬家,就是将某个节点(包括其所有的子节点)移到另一个地方成为那个节点的新儿子。 可以在标准的TreeView控件基础之上实现。 2、信息的编辑 每个树节点都关联着一个简单的文本...

    超级有影响力霸气的Java面试题大全文档

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    QUALCOMM平台BUIW开发文档

     为什么创建对象总是失败 31 程序架构基本规范 31  程序结构标准化的需要 31  主程序结构不合理 31  窗口参数结构传递不合理 32  应用释放所有窗口过程不合理 33  主程序数据结构 34  窗口独立数据...

    PB扩展组件

    TScreen对象 没什么特殊的地方,可以取到当前屏幕的分辨率。 TExchange 数制转换对象。 TForm对象 基本的窗口对象,以上的可视化对象都必须放置在TForm继承的窗口中才会有作用。 4.Types库 一些Fir组件用到...

    Zend Framework教程之Zend_Registry对象用法分析

    本文实例讲述了Zend Framework教程之Zend_Registry对象用法。分享给大家供大家参考,具体如下: 使用对象注册表(Registry) 对象注册表(或称对象仓库...要保存一项内容到注册表中,我们可以使用静态方法 set()。 例 1

    Spring面试题

    -(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中; -(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; -(4)如果...

    使用预训练的开源模型 部署深度学习驱动的“魔术裁剪工具”_JavaScript_代码_下载

    随着后续图像的上传,它们将被添加到屏幕下方的轮播中,并使用 PouchDB 保存在浏览器中。从此轮播中,可以查看、删除图像或将图像加载到“工作室”中。 在应用程序的 Studio 部分,可以将两个图像加载到一个界面中...

    用.NET框架实现序列化

    在这种类型的序列化里,对象状态被以XML格式保存。这使得被序列化的对象能够被不同的系统取 得并修改,甚至是那些不是用.NET编写的系统。另外一个优势是被序列化的对象对于人来说是可读和可写的——因此更新对象的...

    在同步代码结束后,使用ReleaseMutex(THandle

    如果想保存快照,可以添加到搜藏。 (百度和网页http://blog.csdn.net/mygodsos/archive/2008/10/19/3097921.aspx的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) -----...

    c++1400行代码实现的控制台坦克大战(麻雀虽小,五脏俱全)

    * 关于坦克:地图中只保存当前坦克不能过的地方(墙、河流) * 关于子弹:地图中只保存子弹能撞到的东西(不在草地里的坦克,子弹,墙) * 游戏对象:地图中只保存障碍物 2. 地图的作用 * 坦克对象:根据当前模式,...

    thinkinjava.chm

    2.2.1 保存在什么地方 2.2.2 特殊情况:主类型 2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 ...

    java 设计模式资料

    这样以后就可将该对象恢复到保存的状态。 Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 Prototype:用原型实例指定创建对象的种类,...

    JAVA笔记??序列化

    所谓的对象序列化(在很多地方也被成为串行化),是指将对象转换成二进制数据流的一种实现手段。通过将对象序列化,可以方便地实现对象的传输及保存。  在Java中提供有ObjectInputStream与ObjectOutputStream这两...

    .NET程序编辑器(Reflexil)下载 v1.6

    可以作为一个Reflector插件修改程序集的IL并保存到磁盘文件,也可以在自己的.NET程序中调用进行更为灵活的.NET程序集修改。 修改方法 下载Reflector插件Reflexil,并添加到Relector中。 在左边的对象树中打开需要...

Global site tag (gtag.js) - Google Analytics