`
defrag_sly
  • 浏览: 129736 次
  • 性别: 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支持任意精度的定点数字。例如,可用它进行精确的币值计算。
分享到:
评论

相关推荐

    图片保存到sd卡

    // 获取到要保存的Bitmap对象 FileOutputStream outStream = null; try { outStream = new FileOutputStream(new File(myAppDir, "image.jpg")); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); ...

    微信小程序实现保存图片到相册功能

    另外,要注意的细节包括,微信小程序的权限管理并不是一劳永逸的,用户可以在任何时候更改其对某个权限的授权状态,因此在应用的任何部分需要使用到权限的地方,都应当检查用户的权限状态。 除此之外,开发者的代码...

    易语言EXCEL对象常用操作

    以上内容详细介绍了易语言中Excel对象的常用操作,包括创建对象、打开工作簿、操作工作表、读写数据、处理公式、格式化单元格、保存与关闭工作簿,以及错误处理。通过这些基本操作,开发者可以构建出功能丰富的Excel...

    C#保存图片(手动与自动)

    在C#编程中,保存图片是一项常见的任务,无论是从网页抓取、数据库读取还是用户交互后生成的图像,都需要将其保存到本地文件系统。本篇文章将深入探讨两种方法:手动保存和自动保存图片。 首先,手动保存图片是指...

    如何保存窗口状态

    另一种方法是使用序列化技术,将窗口状态对象转化为字节流并保存到磁盘,然后在需要时反序列化回原来的对象。例如,在C#中,可以使用`BinaryFormatter`或`XmlSerializer`来实现。这种方法更适用于保存复杂的对象状态...

    vb6保存窗口界面为图片

    5. **文件操作**: 保存图像文件到磁盘时,需要使用`CreateObject`创建一个`Scripting.FileSystemObject`对象,然后通过它的`CreateTextFile`或`OpenTextFile`方法创建文件,再写入图像数据。 6. **内存位图**: 在...

    第13篇-QTP对象管理机制(1)

    如果对象因应用程序更新或更改而丢失,QTP提供了对象恢复功能,帮助重新识别和添加这些对象到对象库中。 了解并掌握QTP的对象管理机制是高效利用该工具的关键。通过精确地识别和管理对象,测试人员可以创建稳定、...

    VC60下实现串口数据收发并可选择保存到文件及数据转发

    最后,考虑到错误处理和异常安全,我们还需要在每个可能出错的地方添加适当的错误检查和异常处理代码。例如,当打开串口失败时,应显示错误消息;读写文件时,要捕获可能的CFileException并提供适当的反馈。 总结,...

    asp上传图片 保存的是二进制数据

    标题"asp上传图片 保存的是二进制数据"指的是在ASP环境中,当用户上传图片时,服务器会接收到图片文件,然后将其转换为二进制格式并存储到数据库中,而不是存储图片的原始路径或者文件名。这种做法的优点是能够确保...

    保存登录的信息

    在Android开发中,保存用户登录信息是一个常见的需求。标题“保存登录的信息”指的是...这样,任何需要保存或读取登录信息的地方,都可以直接调用`LoginPreferences`类的相关方法,避免了重复代码,提高了代码质量。

    GDI绘图序列保存加载

    4. **保存绘图序列**:完成绘图后,我们可以通过位图对象(Bitmap)来保存内存DC的内容。首先创建一个与内存DC兼容的位图,然后用`CreateCompatibleBitmap`函数创建位图,再用`SelectObject`函数将位图选入内存DC。...

    域对象在持久化层的状态

    2. **同步数据变更**:缓存可以暂时保存对象的变更,直到事务结束时一次性同步到数据库,避免了频繁的单个更新操作,减少了数据库负载,提高了整体性能。 #### 三、Session缓存的清理时间点 Session缓存的清理(即...

    VC序列化-存储文件又方法,可用于系统配置,或者系统状态的保存

    VC++序列化是编程中一个重要的概念,它主要用于对象数据的持久化存储,例如系统配置或系统状态的保存。在Microsoft Visual C++中,我们可以利用MFC(Microsoft Foundation Classes)库提供的序列化机制来实现这一...

    MFC 编程 绘图有保存有打开

    8. **保存和打开绘图**:为了保存绘图,可以将图形转换为位图(`CBitmap`对象),然后使用`CFile`和`SaveBitmapFile`(非MFC标准函数,可能需要自己实现)将位图写入文件。打开时,读取位图文件并将其加载到`CDC`,...

    文件对话框打开保存

    对于保存文件,你需要创建一个`ofstream`对象并写入数据: ```cpp std::ofstream outFile(filePath); // 写入文件内容... outFile.close(); ``` 以上就是使用VC++和VS2010实现文件对话框打开和保存文件的基本步骤...

    mfc 使用gdi画图、打开图片、保存图片

    首先,创建一个设备无关位图(DIB),然后将视图的内容复制到这个DIB中,最后使用SaveBitmapFile函数将DIB保存为文件。 - 这些API使用起来比较复杂,通常会封装成一个辅助函数或类。 5. **GDI+的扩展** - 虽然GDI...

    java+mysql 保存图片

    当用户上传图片时,我们通常会先将其保存到服务器的某个目录,然后进行后续处理。 2. **图片数据转换为字节流**: 在保存图片到数据库之前,我们需要将图片文件转换为字节数组。这可以通过`FileInputStream`读取...

    C# 保存数据文件方法

    3. **灵活性**:这种方式非常灵活,可以在任何地方使用`File.AppendAllText`方法来方便地追加文本到文件中。 #### 六、总结 通过以上介绍,我们可以看到C#提供了多种方式来处理文件的读写操作。不同的应用场景可以...

    SharedPreferences 保存用户设置

    此外,为了确保数据的一致性,你应该在`onPause()`或`onStop()`等适当的地方保存SharedPreferences,而不是在用户进行设置时立即保存,因为这可能导致不必要的写入操作。同时,考虑到多线程环境,多个线程同时修改...

    Winform中实现ZedGraph曲线图的图像复制到剪切板、打印预览、获取图片并保存、另存为的功能示例代码.zip

    通过调用ZedGraphControl的CopyToClipboard方法,可以将图表的图像数据复制到系统剪贴板,让用户能够通过粘贴操作在其他地方使用。 打印预览是另一个重要的功能,允许用户在打印前检查图表的布局和效果。实现这个...

Global site tag (gtag.js) - Google Analytics