目录
六、第18天建立的两个队列,其区别仅在于基础数据不同,一个是int,一个是char。按照这种思路,对于不同的基础数据类型,都要重写一个类,这样合理吗?你想怎么样?
前言
今天已经是学习的第20天了,为了更透彻地理解前20天的内容以及便于顺利地进入下一阶段,我们进行一个小结,通过以下6个问题来回顾一下之前的内容。
一、面向对象和面向过程相比,有哪些优势?
面向过程和面向对象是两种不同的编程范式:
- 面向过程(POP):自顶向下的编程模式,以“过程”为中心,强调的是如何一步步完成任务。具体来说,就是将问题分解为一个一个的步骤,每个步骤都用函数进行实现,最后依次调用函数即可。
- 面向对象(OOP):将事务高度抽象化的编程模式,以“对象”为中心,强调的是如何组织和管理对象的状态和行为。具体来说,就是将问题分解为一个一个的对象,并把相应的属性、行为封装进对象,然后通过不同对象之间的调用,组合解决问题。
这里以五子棋为例,进行说明:
- 如果采用面向过程的编程模式,那么则将问题分解成一个一个的步骤。比如开局——黑棋——判断——白棋——判断——循环,然后每一步用函数实现再依次调用即可。
- 如果采用面向对象的编程模式,则需要将问题分解为一个一个的对象。比如第一类对象(玩家对象),负责接收玩家的输入,并将棋局变化告知第二类对象(棋盘对象);第二类对象(棋盘对象),根据得到的棋局变化绘制当前棋盘页面;第三类对象(规则对象),则根据当前的棋盘页面进行输赢判断。
很明显,面向过程是根据步骤来拆分问题,而面向对象则是根据功能(行为)来分解问题并抽象为对象。面向对象的这种以“对象”为中心的思想,和人类在现实生活中解决问题的思路很相似,比如你要洗衣服,那么你肯定会找洗衣机这个对象来运作,再比如你要扫地,那么你就会找扫地机器人这个对象来实现,所以说面向对象其实更符合人类的思维习惯,更利于理解。同时,由于面向对象设计有三大基本特征,即封装、继承、多态,所以在复杂的场景下,面向对象编程会更方便简单一点,下面是面向对象的一些具体优势。
1.封装
封装就是把现实世界中的客观事物抽象成一个Java类,并在类中存放相应的属性和方法,比如封装一个汽车类,类中包括发动机、轮胎、底盘等属性以及启动、前进、后退等方法。
面向对象通过封装,将数据属性和操作数据的方法绑定在一起,这样可以隐藏内部实现的细节,只暴露必要的接口,使得代码易于理解、维护和修改。
2.继承
就像现实世界中儿子可以继承父亲的财产一样,子类也可以继承父类的属性和方法。
面向对象通过继承,使得类可以从其他类派生,即可以创建一个新的类但却不需要从头开始编写所有的程序,这就大大提高了代码的复用性和扩展性。
3.多态
多态是指子类继承父类的属性和方法后,可以通过重写使其与父类有不同的实现。
面向对象通过多态,使得不同的类可以用相同方式对待,从而简化了代码并提高了灵活性。同时也使得程序可以根据实际对象的类型执行不同的操作,而无需显式地指定对象类型。
4.协作
要知道,复杂问题或者大型项目都是团队协作完成,这个时候面向对象设计中的类和对象就可以非常好地支持团队开发。
5.组织结构
面向对象设计中的类和对象可以帮助程序员把复杂的系统拆分成较小、管理更容易的模块,同时也使得程序设计更接近现实世界模型,提高了建模的自然性。
这样看来,面向对象更适用于复杂系统的开发和维护,而面向过程则更适合逻辑简单、功能明确的程序设计。不过,在使用面向对象设计时,其局部细节我们不可避免的也会用到面向过程设计,所以最好的选择便是整体上面向对象设计,局部细节上面向过程设计。
二、比较顺序表和链表的异同
1.相同点
顺序表和链表都属于线性表,都是线性存储结构,都可以用来存储一组数据元素,并支持查、找、增、删等基本操作。
2.不同点
2.1物理存储结构
顺序表是用一组地址连续的存储单元来存放数据元素,所以在顺序表中,逻辑结构上相连的数据元素在物理存储结构上也相连,简言之就是顺序表逻辑上相连,物理上也相连。
而链表的数据元素在物理存储结构上并不连续,其数据元素的逻辑顺序是通过链表中的引用链接次序实现的,简言之就是链表在逻辑上相连,在物理上不相连。
2.2查找
由于顺序表底层为数组,所以可以通过索引值直接访问对应位置的数据元素,时间复杂度为O(1)。
而链表如果想要定位查找某元素,则只能按照链接顺序依次访问数据元素,时间复杂度为O(n)。
2.3插入和删除
顺序表要求各数据元素在物理存储空间中必须紧密相连,不能出现“空白”,所以其必然不能直接、随意地进行插入和删除操作,只能通过成段移动覆盖的方式间接完成,效率较低,时间复杂度为O(n)。
而链表得益于其链式存储结构,在插入和删除时只需要更改指定位置的引用次序即可,效率较高,时间复杂度为O(n)。
三、分析顺序表和链表的优缺点
1.顺序表
1.1顺序表的优点
- 随机访问:顺序表以数组为底层,支持直接通过索引值访问元素,使得读取元素非常高效
- 简单实现:数组的实现比较简单,不需要复杂的数据结构操作
- 低空间开销:除了存储数据元素外,没有额外的空间开销
1.2顺序表的缺点
- 插入和删除效率低:顺序表在完成插入和删除时,需要成段移动覆盖,效率较低
- 存在扩容问题:顺序表在创建时需要提前指定大小,当内存空间不够时则需要扩容,这会使得代码更加繁琐
2.链表
2.1链表的优点
- 动态大小:链表可以根据需要动态分配内存,灵活调整大小,无需事先确定容量
- 插入和删除效率高:链表在插入和删除元素时,不需要移动数据,只需要改变链接引用即可,效率较高
2.2链表的缺点
- 不支持随机访问:链表在查找数据元素时,只能根据链接次序依次访问,不能实现随机访问
- 有额外的空间开销:链表的每个结点除了存储数据元素外,还需要存储一个指针,使得总体空间开销较大
- 复杂实现:链表的实现更为复杂,需要管理结点的指针
四、分析调拭程序常见的问题及解决方案
不用说,写代码时肯定会遇到bug,此时调试这个小东西就派上用场了。根据这段时间的学习,将调试程序常见的问题总结如下:
对于语法错误,直接根据提示信息定位到出错的位置,修改即可;
对于逻辑错误,则使用调试工具一步一步地执行代码,并时刻注意每一步的变量值,直到发现变量出现异常;
如果程序运行错误,但却无法根据提示的错误信息确定错误位置及错误原因,那么这个时候可以利用调试工具进行追踪,综合判断出错的原因。
五、分析链队列和循环队列的优缺点
链队列和循环队列是队列的两种实现方式,链队列基于链表,而循环队列基于顺序表,所以链队列和循环队列的优缺点有点类似于链表和顺序表的优缺点。
总的来说,链队列最大的优势就是没有明确的上限,不需要考虑队列是否已满的问题,同时,由于链式存储结构的特点,链队列在入队和出队时操作比较简单,只用改变指针引用就行。
而循环队列受限于顺序表的空间有限性,需要考虑队满的情况,同时因为底层结构大多为数组,所以插入和删除时操作比较繁琐,不如链队列方便。此外,循环队列通过“环形结构”来实现存储空间的复用,但这种队头和队尾相连的方式也造成了队空队满的判断矛盾,需要额外进行判断。
这样看来,不管是在存储空间大小上,还是在操作便利性上,链队列都明显优于循环队列。不过,由于循环队列支持随机访问,所以在固定大小的缓冲区和任务调度等需要高效处理的数据流场景,循环队列还是比较适用的。
六、第18天建立的两个队列,其区别仅在于基础数据不同,一个是int,一个是char。按照这种思路,对于不同的基础数据类型,都要重写一个类,这样合理吗?你想怎么样?
对于不同的基础数据类型,如果都重写一个类的话,会比较繁琐,而且似乎也不符合java面向对象的特点,所以我觉得不是特别合理。基于本人的拙见,我的想法是一个可以利用面向对象的继承思想,通过继承简化代码,实现复用;另一个貌似也可以利用java中的泛型,对类型进行参数化,从而实现代码复用。
标签:顺序,Java,队列,元素,day20,链表,面向对象,对象,小结 From: https://blog.csdn.net/2301_80594618/article/details/141112936