首页 > 编程语言 >日撸Java三百行(day20:小结)

日撸Java三百行(day20:小结)

时间:2024-08-12 17:56:32浏览次数:15  
标签:顺序 Java 队列 元素 day20 链表 面向对象 对象 小结

目录

前言

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

1.封装

2.继承

3.多态

4.协作

5.组织结构

二、比较顺序表和链表的异同

1.相同点

2.不同点

2.1物理存储结构

2.2查找

2.3插入和删除

三、分析顺序表和链表的优缺点

1.顺序表

1.1顺序表的优点

1.2顺序表的缺点

2.链表

2.1链表的优点

2.2链表的缺点

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

五、分析链队列和循环队列的优缺点

六、第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

相关文章

  • JavaScript发展历史
    JavaScript作为一种编程语言,经历了多次发展与演变,以下是其主要历史里程碑:1.诞生与早期发展(1995-1999)1995年:JavaScript由BrendanEich在网景公司(Netscape)发明,最初被称为Mocha,后来改名为LiveScript,最终定名为JavaScript。这种命名是为了利用当时Java语言的流行。199......
  • 掌握JavaScript中的观察者模式:构建响应式编程的基石
    标题:掌握JavaScript中的观察者模式:构建响应式编程的基石在软件开发中,设计模式是解决特定问题的模板。其中,观察者模式是一种非常重要的设计模式,它允许多个对象监听另一个对象的状态变化,并在该对象状态变化时得到通知。这种模式在JavaScript中尤为有用,尤其是在构建响应式应用......
  • 2024年华为OD机试真题-模拟数据序列化传输-Java-OD统一考试(C卷)
    2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:模拟一套简化的序列化只传输方式,请实现下面的数据编码与解码过程1、编码前数据格式为[位置,类型,值],多个数据的时候用逗号分隔,位置仅支持数字,不考虑重复等场景;类型仅支持:Integer......
  • Java微信公众号推送模版消息的方法示例
    要在Java中向微信公众号推送模板消息,首先需要确保我们已经有了微信公众号,并且已经设置了模板消息权限和模板ID。模板消息是一种向用户发送通知的服务,广泛用于订单状态更新、服务提醒等场景。下面,我将详细介绍如何使用Java结合微信官方提供的API来实现模板消息的推送。这通常涉及......
  • Java计算机毕业设计的酒店管理系统的设计与实现(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和党组织建设的日益规范化,传统的手工党员管理模式已难以满足当前高效、精准的管理需求。特别是在高校、企事业单位等组织中,党......
  • Java计算机毕业设计的爱心慈善公益系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今社会,随着经济的快速发展与人民生活水平的普遍提高,社会各界对于公益慈善事业的关注与参与度日益增强。然而,传统的慈善模式往往受限于信息不对称......
  • Java计算机毕业设计的汽车配件管理系统的设计与实现(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着汽车工业的迅猛发展,汽车配件市场日益繁荣,配件种类繁多、更新换代迅速,给汽车售后服务和维修行业带来了前所未有的挑战。传统的手工或简单电子化的......
  • JAVA 两个类同时实现同一个接口的方法
    在Java中,两个类同时实现同一个接口是非常常见的。接口定义了一组方法,实现接口的类必须提供这些方法的具体实现。以下将展示如何实现这一要求,并提供具体的代码示例。示例接口首先,定义一个简单的接口,比如一个表示动物的接口,它有一个方法makeSound:publicinterfaceAnimal{......
  • java .stream(). 使用介绍 Streams API
    Java8引入了StreamsAPI,它允许我们以声明性方式处理序列的数据。.stream()是这一API的核心方法,用于从一个数据源(如数组、集合等)创建一个流(Stream)。以下是.stream()方法的一些基本使用介绍:1.从集合创建流List<String>myList=Arrays.asList("a","b","c");Stream<S......
  • Java基础语法
    Java基础语法注释写代码要有好的规范三种注释:单行注释publicclassHelloWorld{publicstaticvoidmain(String[]args){//单行注释//输出一个HelloWorld!System.out.println("HelloWorld!");}}多行注释//多行注释......