第二十天总结

这里是java的自学,如果有问题欢迎提出哦。

目录

前言

一、面向对象与面向过程相比,有哪些优势?

1.面向对象与面向过程的区别

2.面向过程与面向对象的优缺点

二、比较顺序表与链表的异同和优缺点

三、分析调试程序常见的问题及解决方案

四、分析队列与循环队列的优缺点。

总结


前言

1.面向对象与面向过程相比,有哪些优势?

2.比较顺序表与链表的异同。

3.分析顺序表和链表的优缺点。

4.分析调试程序常见的问题及解决方案。

5.分析队列与循环队列的优缺点。


一、面向对象与面向过程相比,有哪些优势?

1.面向对象与面向过程的区别

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

2.面向过程与面向对象的优缺点

下面是在网上找到的资料:

用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。所谓盖浇饭,北京叫盖饭,东北叫烩饭,广东叫碟头饭,就是在一碗白米饭上面浇上一份盖菜,你喜欢什么菜,你就浇上什么菜。我觉得这个比喻还是比较贴切的。

蛋炒饭制作的细节,我不太清楚,因为我没当过厨师,也不会做饭,但最后的一道工序肯定是把米饭和鸡蛋混在一起炒匀。盖浇饭呢,则是把米饭和盖菜分别做好,你如果要一份红烧肉盖饭呢,就给你浇一份红烧肉;如果要一份青椒土豆盖浇饭,就给浇一份青椒土豆丝。

蛋炒饭的好处就是入味均匀,吃起来香。如果恰巧你不爱吃鸡蛋,只爱吃青菜的话,那么唯一的办法就是全部倒掉,重新做一份青菜炒饭了。盖浇饭就没这么多麻烦,你只需要把上面的盖菜拨掉,更换一份盖菜就可以了。盖浇饭的缺点是入味不均,可能没有蛋炒饭那么香。

到底是蛋炒饭好还是盖浇饭好呢?其实这类问题都很难回答,非要比个上下高低的话,就必须设定一个场景,否则只能说是各有所长。如果大家都不是美食家,没那么多讲究,那么从饭馆角度来讲的话,做盖浇饭显然比蛋炒饭更有优势,他可以组合出来任意多的组合,而且不会浪费。

盖浇饭的好处就是"菜"“饭"分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是"可维护性"比较好,“饭” 和"菜"的耦合度比较低。蛋炒饭将"蛋”“饭"搅和在一起,想换"蛋”"饭"中任何一种都很困难,耦合度很高,以至于"可维护性"比较差。软件工程追求的目标之一就是可维护性,可维护性主要表现在3个方面:可理解性、可测试性和可修改性。面向对象的好处之一就是显著的改善了软件系统的可维护性。

总结就是:

面向过程:

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展

面向对象:

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程

二、比较顺序表与链表的异同和优缺点

1.顺序表存储(典型的数组)
     原理:顺序表存储是将数据元素放到一块连续的内存存储空间,相邻数据元素的存放地址也相邻(逻辑与物理统一)。
     优点:(1)空间利用率高。(局部性原理,连续存放,命中率高) 
                (2)存取速度高效,通过下标来直接存储。
     缺点:(1)插入和删除比较慢,比如:插入或者删除一个元素时,整个表需要遍历移动元素来重新排一次顺序。
                (2)不可以增长长度,有空间限制,当需要存取的元素个数可能多于顺序表的元素个数时,会出现"溢出"问题.当元素个数远少于预先分配的空间时,空间浪费巨大。  
     时间性能 :查找 O(1) ,插入和删除O(n)。
2.链表存储
    原理:链表存储是在程序运行过程中动态的分配空间,只要存储器还有空间,就不会发生存储溢出问题,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点关系间的指针。
    优点:(1)存取某个元素速度慢。 
            (2)插入和删除速度快,保留原有的物理顺序,比如:插入或者删除一个元素时,只需要改变指针指向即可。
            (3)没有空间限制,存储元素的个数无上限,基本只与内存空间大小有关. 
    缺点:(1)占用额外的空间以存储指针(浪费空间,不连续存放,malloc开辟,空间碎片多) 
            (2)查找速度慢,因为查找时,需要循环链表访问,需要从开始节点一个一个节点去查找元素访问。
    时间性能 :查找 O(n) ,插入和删除O(1)

三、分析调试程序常见的问题及解决方案

在我们写程序的过程中遇到bug是常见的,我们解决bug可以通过打印输出相关的信息,在打印信息方法中最有可能发生错误的那一行上一行或下一行,将程序执行的参数、返回结果值在控制台进行输出,检查输出的结果值是否为程序执行咱们想要的结果,进而判断错误发生点。这种打印输出信息的方法也是在某些不支持debug的系统调试的一个重要方法。

当然我们常用的还是设置断点,进行debug模式进行调试。当程序运行到断点,这时程序在一个暂停状态,我们需要进行程序单步向下执行,观察每一步中的输入参数数据是否正确或调用方法的返回值数据是否正确,当程序运行到一个方法时我们可以继续单步向下执行不管方法内部的逻辑只关心返回值,也可以使用程序调试方法中的进入方法内部继续追踪程序(进入方法内部后继续单步执行或跳出方法内部),直到程序执行发生错误,判断是否为程序错误发生的实际位置。

四、分析队列与循环队列的优缺点。

从时间上,其实它们的基本操作都是常数时间,即都为0(1)的,不过循环队列是事先申请好空间,使用期间不释放,而对于链队列,每次申请和释放结点也会存在一些时间开销,如果入队出队频繁,则两者还是有细微差异。

从空间上,循环队列有一个固定的长度,而链队列是在理论上是无限大的,不用考虑队列为满的情况。

总的来说,在可以确定队列的长度下,推荐使用循环队列。如果无法确定队列的长度则推荐使用链队列。


总结

二十天过去了,比较简单的数据结构也是有了一定的了解,接下来就要学习树和图的数据结构了,大一下学期的数据结构课在树和图的章节自己也是掌握的不太好,对最短路径也基本只会用Floyd算法,但是这种算法的时间复杂度是O(n^3)代价实在是太大了,希望之后的学习能够掌握迪杰斯特拉算法求最短路径,能够掌握dfs深度搜索加剪枝的算法。关于老师留下的最后一个问题即第十八天建立的两个队列,其区别仅在于基础数据不同,一个是int,一个是插入,按这种思路,对于不同的基础数据结构,都需要重写一个类,这样合理吗?你想怎么样?这个问题我开始是想用泛型来尝试着实现的,但是一直给我报错,自己又觉得用泛型是能够实现的,想着多了解一些泛型的知识,再来尝试着实现这个问题。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值