学号 20172328 《程序设计与数据结构》实验二报告
学号 20172328 《程序设计与数据结构》实验二报告
课程:《程序设计与数据结构》
班级: 1723
姓名: 李馨雨
学号:20172328
实验教师:王志强
实验日期:2018年4月17~30日
必修/选修: 必修
1.实验内容
-
初步掌握单元测试和TDD
-
理解并掌握面向对象三要素:封装、继承、多态
-
初步掌握UML建模
-
熟悉S.O.L.I.D原则
-
了解设计模式
-
完成蓝墨云上 (1)-(5)实验。
2.实验过程及结果
码云链接
-
第一个提交点
- 考查JUnit会不会使用,测试用例要包含正常情况,错误情况,边界情况的测试 。
- 考查JUnit会不会使用,测试用例要包含正常情况,错误情况,边界情况的测试 。
-
第二个提交点
- 以 TDD的方式研究学习StringBuffer
,测试自己会不会写JUnit测试用例。
- 以 TDD的方式研究学习StringBuffer
-
第三个提交点
- 对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式。让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印。
- 对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式。让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印。
-
第四个提交点
- 以TDD的方式开发一个复数类Complex。
- 以TDD的方式开发一个复数类Complex。
-
第五个提交点
- 使用StarUML对实验二中的代码进行建模,类图中至少包含两个类。
- 使用StarUML对实验二中的代码进行建模,类图中至少包含两个类。
3.实验过程中遇到的问题和解决过程
问题1:StringBuilder、StringBuffer、String类之间的关系
问题1解决方案:
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象,StringBuffer和StringBuilder类功能基本相似。
-
String 类
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。 String a = "a"; //假设a指向地址0x0001
a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。
因此String的操作都是改变赋值地址而不是改变值操作。 -
StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。
StringBuffer buf=new StringBuffer(16); //分配长16字节的字符缓冲区
StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区
StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。
3.StringBuffer
StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。
问题2:多线程和单线程的概念
问题2解决方案:
- 多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行程序。
- 单线程:线程是程序中的一个执行流,每个线程都有自己专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
问题3:编写Complex后进行测试驱动Complextest时出现的问题。
问题3解决方案:这个问题一直不知道是自己哪里错误。后来经同学帮助,是前面Complex类中编写错误,形式参数中变量a的实部和虚部不能直接调用,应该用我之前写在前面的get方法去调用具体值。(不好意思,忘记截图)
问题4:在做第三个提交点问题时,有一个小错误。一直红线提示。
问题4解决方案:后来发现是浮点数程序系统默认double,所以float型在后面初始化时应该用数值f
。
其他(感悟、思考等)
我的实验二中的几个实验做的有点吃力,但是还是收获了很多。尤其是测试驱动开发(TDD),直接提供了一种很好用的方法去测试编写的程序是否有些纰漏,之前用命令行的时候总是找编译类错误和语法错误,现在可以具体系统的去找编程中的逻辑错误,所以junit是一种对程序员很实用的工具。
参考资料
1.全面解释java中StringBuilder、StringBuffer、String类之间的关系
2.《Java程序设计与数据结构教程(第二版)》学习指导