日期:2014-05-20  浏览次数:20721 次

关于内存物理结构和序列化的问题?有懂的请指教下
我对物理结构的一点点理解,不知道靠谱吗?为什么要序列化?是不是就是因为对象在物理结构里的关系?

这东西看不见摸不着,我想举个例子来形容下,我们知道内存条里都是一个单元一个单元的挨着的地址空间对吧,那数据首先是存内存里的,但是,数据不会是按着内存条里的一个单元一个单元的按着顺序去存的,其实这么说不太对,是可以这么存,但也可以不这么存,我们把这些不同方式保存数据的方式叫物理结构?

之所以有时候不安顺序保存是为了提高查找数据或者删除数据 遍历数据 什么的能提高效率,所以不能都是一种按顺序存储。

于是有了
集合、线性结构、树形结构、图状结构等等不同的存储结构。

但是无论是什么结构,对于物理内存条里的一个单元一个单元还是固定不变的,变的只是这些数据在内存里的存储方式,这就是我想要具体了解下的东东。

我举个例子,比如一个内存条里有100个单元地址,一个挨着一个的。我有10个苹果标号1-10吧(苹果就是数据)

我可以一个一个的按顺序保存在内存里。比如:
1234567890(假设这是1-10个苹果的数据)
但是如果我要找10号苹果,那程序要一个一个从第一个开始按顺序找,很麻烦,影响效率。

但是如果我换个方法存,又比如

13579          24680
这就不是按顺序结构在内存存的,假设这也是一种物理结构,假如我起名为单双结构!
专门用来处理单数和双数查找用的,那以后有需要查找单数或者双数的就用这种结构肯定比上面的顺序结构提高效率,因为上面的要从头到尾找10次,而我这种只找5次就找到了10号苹果,把单号省略了一半!

那我们可以看出,内存单元没有变还是一个一个的地址,变化的是存储数据的方式,有人说数据方式怎么变了?是这么变的,我们把系统分配给程序的内存总空间分成2部分了,一部分用来存单数,一部分用来存双数,这不就是数据结构吗,上面的是不分内存统一连续存放,下面这个是单双结构,分开存储数据。看你要实现具体的功能来才取不同的数据结构!

这就是我对数据结构的理解!不知道靠谱嘛。。。。。
如有不对,还望纠正!

通过这个问题,我想我就明白了序列化这个概念,为什么要序列化,就是因为java虚拟机对对象在内存里的组织安排,所以才序列化,因为对象可能在内存里被单独或者按某个格式存放,目的就是为了让虚拟机处理的时候更便捷,如果我们不序列化,那么保存文件后,虚拟机下次读取的时候,就不知道那个是对象了,那就没法在内存里进行对象的安排了,不能安排对象了,那效率就降低了,所以保存文件之前,弄个序列化的意思就是把哪些是对象,相当于做个标记,然后等下次读取的时候,看到这个标记我就知道,哦这小子是个对象,我要把它放到某某个内存区里单独保存。这样就不至于什么数值啊 变量啊 有用没用的都混在一起了。

我感觉好像就是这个意思。

但是对于普通的文本文件来说,里面没有涉及到对象的东东,保存的时候可能不需要徐序列化吧,毕竟文本文件里都是一堆文字而已,对于这些字符串保存时候又有必要每次保存读取都序列化吗?

------解决方案--------------------
引用:
这样啊,可是你说的好像是在硬盘上,我说的是在内存里,也是一样的吗?在内存里跳来跳去的找也有碎片啊?

对了,还一个,你知道序列化吧,之所以用序列化是不是就是因为要保存对象的结构,所以才序列化的?为的是下次读取这个文件的时候,还能把对象的结构在内存里还原?


内存没有碎片问题,内存一断电就清空了,有什么碎不碎片的

序列化,差不多就是你说的这个意思,把对象整个状态保存成文件,存储或传输,然后反序列化就是从文件构建出对象