首先表达一下我最初的看法:刚做这个实验我特别难受,尤其是第一步,需要更改我以往的“编程习惯”。就比如说Google和Oracle对每一行代码开头缩进的要求:我从大一编程到该实验之前,都是使用4个空格缩进,而Google规范要求2个空格缩进,Oracle规范要求8个缩进
我以为自己会很不适应,但是改完了代码规范之后发现,2个空格也没什么,即使对于“强迫症”的人来说也不是啥大事儿,马上就能习惯新的编程风格了。而且,考虑到今后工作的时候,每个地方要求的代码规范可能都不同,团体不可能去适应你一个人,所以我要提前做好随时更改自己变成规范的准备,就渐渐接受了。
一、代码规范
关于Google编程规范的描述,我完全参考的下面这篇文章,我认为写得非常好:
https://www.cnblogs.com/LeoBoy/p/6006540.html
二、读写文件
注:我第一次写文件的时候,是建立了一个String str对象。每读一行,就让str += line,然后把最终的str写入新的文件中。总共几十万行信息的文件,这种方式根本实现不了(我运行了40多分钟也没出结果,果断放弃了):因为String是不可变类型,一旦对String进行+=操作,那么str += line就会被当做一个新的String对象被创建出来,当前的str就会变成这个新的String对象的引用,而不是在不改变引用的基础上修改str中的值。
所以str += line的速度非常非常慢,可以在控制台输出一下子试试(每循环一次输入计数器count + 1并输出count的值)。
如果想用String来存储读入的文件内容,可以使用StringBuilder类的对象来存储,因为StringBuilder是可变类型,速度会比String快很多,快出几个数量级!
三、更改数据结构
如果选用的数据结构简单,时间性能很好,很可能导致空间性能很差!比如我的SocialNetworkCircle类中,我用一个10万*10万的二维数组来存储两个人之间的亲密度:
double intimacy[][] = new double[100000][100000];
运行时会抛出异常:Java Heap Size异常:Java.Lang.OutOfMemoryError。然后我直接的解决办法是,更改JVM参数,让堆能够使用的内存空间扩大为最大,但是仍然抛出该异常。然后我计算了以下这个intimacy数据结构占用的空间的内存大小:8 * 100’000 * 100’000:800亿个字节!不溢出才怪呢。
也就是说,10万个用户之间最多可以有100亿个亲密度。
首先,由于亲密度是无向的,所以该intimacy二维数组有一半的空间会浪费掉;
其次,该实验给的样例文件,亲密度只有80万左右。课件该数据结构浪费了太多的空间。
所以我把该doubla[][]改成了HashMap,用Map来存储亲密度,存储的就全都是有用的信息了。
该实验中其余的内容几乎都是对工具的使用,不再赘述。