第三单元总结
本次作业最终需要实现一个社交关系模拟系统。可以通过各类输入指令来进行数据的增删查改等交互。
(1)总结分析自己实现规格所采取的设计策略
在阅读jml规格代码的基础上,加上自己的理解合理选择实现方式和存储结构。主要使用Arraylist数组来存储Person等结构,在对异常类的计数处理上,设置了counter计数器来存储该异常出发的次数和对象。
(2)结合课程内容,整理基于JML规格来设计测试的方法和策略
针对异常的测试编写一些边界数据进行测试,对于一般方法的测试,可以通过生成大量随机数据来进行验证,对前后文有一定依赖的方法的测试,在进行随机测试的基础上,使用手动构造边界样例的方式进行测试。
(3)总结分析容器选择和使用的经验
对几种容器的使用经验:
Arraylist:
其根据动态数组实现,里面自带扩容方法,有数组的访问特性(随机访问效率高,随机插入,删除效率低)。
其线程不安全,适合单线程环境使用。允许元素为null。new ArryList容器时可以指定大小,不指定则初始化为0。
Vector:
Vector是矢量队列,基于动态数组实现,可以自动扩容,和ArrayList的原理一样,但是相比较线程是安全的。
允许元素为null,
HashMap:
HashMap 是以key-value 键值对形式存储数据,允许 key 为 null(多个则覆盖),也允许 value 为 null。底层结构是数组 + 链表 + 红黑树。
只允许一个 key 为 null(多个则覆盖),但允许多个 value 为 null,查询、插入、删除效率都高,线程不安全,
(4)针对本单元容易出现的性能问题,总结分析原因如果自己作业没有出现,分析自己的设计为何可以避免
本次作业容易出现的性能问题,在我的作业设计中出现了两处:
1.iscircle的判断方式。
最开始我采用的是暴力查询是否构成circle关系,虽然通过了第一次作业,但在后面的作业中性能明显不足,查询资料后改用并查集的方式实现,提高了效率。
2.sendIndirectMessage的实现方式。
同样最开始采用的是暴力查询的方式实现,在debug阶段改用了Dijkstra算法实现,大大提高了代码性能。
(5)梳理自己的作业架构设计,特别是图模型构建与维护策略


浙公网安备 33010602011771号