作者pao0111 (Pao)
看板java
标题Re: [心得] 序列化的小细节
时间Thu Oct 26 20:25:16 2006
※ 引述《qrtt1 (愚者)》之铭言:
: Dear Pao,
: 请记得比较物件是用equals方法,不是用==
: 对於任何物件的制作我们都有责任覆写hashCode与equals
: 心有余力再写一下toString
: 另外,Serialization的目的是保持同样"内容的物件"
: 我可以有千百个内容相同的物件,但他们的记忆体位置都不同
以下恕删
Dear qrtt1,
在我的认知里:
比较「物件」的「内容」是否相同,使用equals方法。
比较「变数」的「值」是否相同,使用==(双等号)。
而在我提出的例子里,想表达的就是序列化的过程里,
可能会产生多个「内容相同」,但「记忆体位置不同」的物件。
(但严格来说,每个参照变数的内容已经不同了)
简单来说,就是会产生副本。
为了观察这现象,应该比较物件指向另一个物件的参照的值是否相同。
所以当我要比较两个物件的「参照变数」的「值」是否相同时,
采用了==来比较,而不是用equals方法。
这点我想是无庸置疑的吧!
关於後面两句,小弟我资质驽顿看不懂,所以等q大开释。
对於我为何想提出来给大家参考。
是因为我遇到了一个情形...
我有两个类别会互相参考到对方,这两种类别的实例(物件)还可能不少。
并且都存在於记忆体当中。
而不巧的是,我需要将它们保存至档案系统里。
万一读出来会产生多个副本时,那我「可能」遇到的「麻烦」有:
1.程式逻辑可能出大纰漏。
假设A1和A2都参考到B1,而我经由A1取得B1,
而修改了B1的内容。但事实上A2参考的是B2,
只不过B1.equals(B2) == true。但我修改B1以後
B1.equals(B2) == false。这不是我想见到的结果。
我想要的是A1和A2都「确实」参考到B1,那我只要
修改B1即可,大家都Happy。
2.记忆体占用会变多。
简单来说就是浪费,占用比原先还多的记忆体,
档案也会一起变大。A1和A2原先都参考到B1,
若产生了副本B2,那记忆体就要多占用B2的空间。
更不用说A可能从1到很大,B也可能从1到很大。
重复的部分会有多少乘上多少呢?
最可怕的还是B2.equals(B1) == true,这样我要
B2存在记忆体作啥呢?同样也不是我想见到的结果。
同样的内容存一份就好,大家都Happy。
我有遇到这样的问题,因此提出来给大家参考,小心其中的差异。
如果有人也遇到类似的情形,就晓得该如何小心的使用序列化了。
这样大家岂不都Happy...^^
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.113.80.187