【日撸 Java 三百行】Day 11(顺序表(一))

目录

Day 11:顺序表(一)

一、关于顺序表

二、关于面向对象

三、代码模块分析

1. 顺序表的属性

2. 顺序表的方法

四、代码及测试

拓展:

小结


Day 11:顺序表(一)

Task:

        在《数据结构》中, 使用“抽象数据类型”来描述不同的数据结构. 在《面向对象程序设计》中, 用对象来存储数据及其上的操作. 我认为, 它们的本质都是相同的.

  • 对象: 数据及其上操作的总和. 例如, 我是一个对象, 具有身高、体重、年龄、跑步速度等数据; 同时,我具有吃饭、睡觉、送快递等功能. 从计算机的发展来看, 第一阶段以操作 (函数) 为中心, 一个计算导弹轨迹的函数, 根据不同输入获得不同输出. 第二阶段以数据为中心, 即数据存放于数据库, 使用不同的算法来处理它. 第三阶段认为数据及其上的操作是统一不可分的, 这就到了面向对象.
  • 类. 前面已经使用过 int i; 这类代码, int 就是类型, i 是一个具体的整数变量. 同理, 对象就是属于某种类的变量. 也可以用集合的方式来理解: 类是集合, 对象是其中的元素; int 是指所有整数的集合, i 是其中的一个元素.
  • 包. 包并非程序设计必须的东西, 其作用仅仅是将类进行合理的组织. 但是, 在计算机界, 往往这种可有可无的东西才是最重要的. 如文档、注释、编码规范. 可有可无是针对程序的运行而言, 其核心是计算机; 而重要是针对程序的易读性、可维护性而言, 其核心是程序员.
  • 常量用 final 修饰. 这里故意把 MAX_LENGTH 设置得比较少, 方便调拭后面的越界检查代码.
  • 用 new 生成新的对象.
  • 有一个成员变量叫做 length. 程序里还有用 length 表示一个整数数组的长度. 实际上, 同一个变量名可以被不同的类所使用, 例如: 人有体重, 西瓜也有重量. 由于限定了不同的类、不同的对象, 它们之间就不会有冲突. 张三的体重、李四的体重,有关联才奇怪了. 这段描述写出来怪怪的, 明明现实生活中就是如此. 但这也正是体现了面向对象的特点: 比面向过程的程序设计更贴合我们的人类认知, 也就更远离机器底层.
  • toString 这个方法很特殊, 它覆盖了 Object 类的相应方法. 可以看到, 在 println 里面使用 tempFirstList 里, 由于是用另一个字符串与其相加, 系统会自动调用 tempFirstList.toString().

一、关于顺序表

        详细的介绍,可以参考这一篇学习笔记:【数据结构】线性表-CSDN博客
        虽然学习笔记中是用 C++ 来实现的,但是构建顺序表的思维模式是相同的,举一反三即可。接下来简单说说顺序表。

        顺序表从属于线性表这一个大类 。线性表,全名为线性存储结构,使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。
        按顺序方式存储的线性表称为顺序表(array-based list),又称为向量(vector),通过创建数组来建立。顺序表中的每个元素按其顺序有唯一的索引值,又称下标值,可以用来方便地访问元素内容。

        一般来说,所有的编程语言模拟顺序表的方法都是通过数组,因为数组的存储与逻辑结构与顺序表几乎完全一致。

二、关于面向对象

        在学习 C++ 时,为了引入 “类” 的概念,我们初步接触了 “面相对象” 这一程序设计原则。

        那么我们为什么要重谈 “类” 这个概念呢?首先,我们需要区分面向过程的程序设计和面向对象的程序设计有何区别。

        面向过程的程序设计是以具体的解题过程为研究和实现的主体,而面向对象的程序设计是以需解决的问题中所涉及的各种对象为主体。
        在面向对象的方法学中,“对象”是现实世界的实体或概念在计算机逻辑中的抽象表示。具体地,对象是具有唯一对象名和对外接口的一组属性和操作的集合。例如,将现实中的“人”抽象来,它具有姓名、年龄、住址等属性,同时具有设置住址、获得年龄、跑动、跳舞等对外的接口和操作。
        面向对象的问题求解就是力图从实际问题中抽象出这些封装了数据和操作的对象,通过定义接口来描述它们的地位及与其他对象的关系,最终形成一个广泛联系的对象模型系统。相对于传统的面向过程的程序设计方法,面向对象的程序设计具有如下的优点

  1. 对象的数据封装特性消除了传统结构方法中数据与操作分离所带来的种种问题提高了程序的可复用性和可维护性,降低了程序员保持数据与操作相容的负担。
  2. 对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
  3. 对象作为独立的整体具有良好的自洽性。即,它可以通过自身定义的操作来管理自己。一个对象的操作可以完成两类功能,一是修改自身的状态,二是向外界发布消息。当一个对象欲影响其他对象时,它需要调用其他对象自身的方法,而不是直接去改变那个对象。这样可以维护对象的完整性。
  4. 对象之间通过一定的接口和相应的消息机制相联系。这个特性与对象的封装性结合在一起,较好地实现了信息的隐藏。使用对象时只需要了解其接口提供的功能操作即可而不必了解对象内部的数据描述和具体的功能实现。
  5. 继承是面向对象方法中除封装外的另一个重要特性。通过继承可以很方便地实现应用的扩展和已有代码的重复使用,在保证质量的前提下提高开发效率。

        在今天的代码中,我们会较为频繁的涉及 关键字final重载,这部分与 C++ 有异曲同工之妙,理解起来并不是很难。但为了保证自己对知识的掌握程度以及理解程度,这里还是单开一篇博文来讲述,可以参考这一篇学习笔记: 

三、代码模块分析

        有了基础知识的储备后,我们可以开始完成今天的任务了。

1. 顺序表的属性

	/*** The maximal length of the list. It is a constant.*/public static final int MAX_LENGTH = 10;/*** The actual length not exceeding MAX_LENGTH. Attention: length is not only the* member variable of Sequential list, but also the member variable of Array. In* fact, a name can be the member variable of different classes.*/int length;/*** The data stored in an array.*/int[] data;

        这些内容是对于顺序表数据结构需要使用的属性,本代码构建的是静态创建的顺序表,因此在最开始就需要限定顺序表的分配长度而无法在后期再更改(MAX_LENGTH)。所以使用了final int这个关键字,综上,final限制基本的系统数据类型后,此类型无法被更改,如同常量一样(就像C++的const,另外这种常量声明的名称标识都必须是大写表示,这虽然不是编译器强制的,但是是我们统一的习惯)

2. 顺序表的方法

        需要说明的是,此类的名称要求统一命名为SequentialList()

	public SequentialList() {length = 0;data = new int[MAX_LENGTH];}// Of the first constructor/************************ Construct a sequential list using an array.* * @param paraArray The given array. Its length should not exceed MAX_LENGTH.*                  For simplicity now we do not check it.**********************/public SequentialList(int[] paraArray) {data = new int[MAX_LENGTH];length = paraArray.length;// Copy data.for (int i = 0; i < paraArray.length; i++) {data[i] = paraArray[i];} // Of for i}// Of the second constructor/************************ Overrides the method claimed in Object, the superclass of any class.**********************/public String toString() {String resultString = "";if (length == 0) {return "empty";} // Of iffor (int i = 0; i < length - 1; i++) {resultString += data[i] + ",";} // Of for iresultString += data[length - 1];return resultString;}// Of toString/************************ Reset to emppty**********************/public void reset() {length = 0;}// Of reset

        这里对于构造函数使用了重载,public SequentialList()创建了个无参构造函数,public SequentialList(int[] paraArray)构造了输入数组作为参数的构造函数。前者适合于一般情况下我们初始化顺序表的操作,后者能非常快捷完成数据的复制操作。

        此外,这里还重写了Object的toString()方法(Java中所有类都是Object类的儿子),因为这个方法与print()方法挂钩,重写了这个方法后,我们创建的对象就能通过print操作打印出数据,能更加方便数据的使用以及可读性。

        最后,参考 “线性表” 学习笔记,我们知道,还可以构建其他辅助的方法,如 append,insert,setValue 等方法。

四、代码及测试

package datastructure.list;/*** Sequential list.** @author: Changyang Hu joe03@foxmail.com* @date created: 2025-05-12*/
public class SequentialList {/*** The maximal length of the list. It is a constant.*/public static final int MAX_LENGTH = 10;/*** The actual length not exceeding MAX_LENGTH. Attention: length is not only* the member variable of Sequential list, but also the member variable of* Array. In fact, a name can be the member variable of different classes.*/int length;/*** The data stored in an array.*/int[] data;/*** ********************** @Title: SquentialList* @Description: Construct an empty sequential list.* * @return void **********************/public SequentialList() {length = 0;data = new int[MAX_LENGTH];}// Of the first constructor/************************ Construct a sequential list using an array.* * @param paraArray* 				The given array. Its length should not exceed MAX_LENGTH. For*            	simplicity now we do not check it.*********************            */public SequentialList(int[] paraArray) {data = new int[MAX_LENGTH];length = paraArray.length;// Copy datafor (int i = 0; i < paraArray.length; i++) {data[i] = paraArray[i];} // Of for i}// Of the second constructor/************************ Overrides the method claimed in Object, the superclass of any class.**********************/public String toString() {String resultString = "";if (length == 0) {return "empty";} // Of iffor (int i = 0; i < length; i++) {resultString += data[i] + ",";} // Of for iresultString += data[length - 1];return resultString;}// Of toString/*** ********************** @Title: reset* @Description: Reset to empty.* * @return void **********************/public void reset() {length = 0;}// Of reset/*** ********************** @Title: main* @Description: The entrance of the program.** @param args Not used now.* @return void **********************/public static void main(String args[]) {int[] tempArray = { 1, 4, 6, 9 };SequentialList tempFirstList = new SequentialList(tempArray);System.out.println("Initialized, the list is: " + tempFirstList.toString());System.out.println("Again, the list is: " + tempFirstList);tempFirstList.reset();System.out.println("After reset, the list is: " + tempFirstList);}// Of main}// Of clas SequentialList

        其中,需要注意的是第一二行,我们用了两种不同的输出方式,一种调用了我们重构的 toString()  函数,另一种是通过 println() 函数中对 List 的特殊处理方式。

拓展:

        顺序表基本概念:【数据结构】线性表-CSDN博客

        类、包和接口:


小结

        顺序表作为我们最开始接触到的数据结构,难度是很小的,因为其内核思想符合我们正常思维,即 “按顺序先来后到”
        但是,从实践层面来看,有人说,很多计算机的问题,本质上都可以视为字符串的处理。字符串处理是数据处理中最基础也是最麻烦也是的问题,而字符串本身上就是顺序表的字符表现。
        计算机算法领域的非常重要的查找与排序问题也是属于顺序表问题,SQL数据库中也充满各种顺序表的信息展现,其中是否能选取合理的索引结构,能影响整个数据库的效率。

        所以综上所述,顺序表也是很困难的。因为我们选择了最简单的按顺序存储,所以在实现对全局数据的操控中(如插入,查询等),就需要我们去花心思研究高效的算法。

        因为,本质上,这是逻辑丰富与物理存储单一的矛盾

        同时,还需要注意一点,从这一次学习开始,我们会接触越来越多的数据结构,因此固定库给的函数肯定是无法处理所有结构的。为了解决这一问题,我们需要去重构不同的函数。数据结构可能是不同的,但其方法的目的是有共通性的。在学习的过程中,不断去总结,感悟,从而一步一步提高自身的代码能力和素养。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot动态配置修改全攻略

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 无需重启应用&#xff0c;实时更新配置的终极指南 在微服务架构中&#xff0c;动态配置管理是提高系统灵活性的关键技术。本文将通过4种主流方案&#xff0c…

精益数据分析(55/126):双边市场模式的挑战、策略与创业阶段关联

精益数据分析&#xff08;55/126&#xff09;&#xff1a;双边市场模式的挑战、策略与创业阶段关联 在创业和数据分析的学习旅程中&#xff0c;我们持续探索不同商业模式的奥秘。今天&#xff0c;依旧怀揣着与大家共同进步的想法&#xff0c;深入研读《精益数据分析》&#xf…

linux内核pinctrl/gpio子系统驱动笔记

目录 一、简单介绍二、主要源码文件和目录gpio子系统pinctrl子系统两个子系统之间的关系设备树例子 三、主要的数据结构gpio子系统pinctrl子系统 四、驱动初始化流程五、难点说明 一、简单介绍 GPIO子系统: Linux GPIO子系统是Linux内核中负责处理GPIO&#xff08;通用输入输出…

Vue 2 项目中配置 Tailwind CSS、Font Awesome和daisyUI

Vue 2 项目中配置 Tailwind CSS 和 安装 daisyUI 首先重点注意&#xff0c;Vue2中安装Tailwind和daisyui一定要注意版本。 最佳版本 使用 Vue 2 TailwindCSS v2 DaisyUI v1 的兼容版本 "tailwindcss": "npm:tailwindcss/postcss7-compat^2.2.17", &q…

5.11 - 5.12 JDBC+Mybatis+StringBoot项目配置文件

JDBC&#xff1a; 预编译SQL优点&#xff1a;安全&#xff0c;性能更高。 在cmd里面输入java-jar就可以运行jar包。 Mybatis&#xff1a; 持久层框架。用于简化JDBC的开发。 数据库连接池里面放置的是一个一个Connection连接对象。&#xff08;连接池中的连接可以复用&#…

探索科技的前沿动态:科技爱好者周刊

探索科技的前沿动态:科技爱好者周刊 在信息爆炸的时代,我们每时每刻都被新技术、新理念包围。而如何在这纷繁复杂的信息中找到对自己有价值的内容,成了一大挑战。今天,我们要介绍的是一个宝贵的资源——科技爱好者周刊,它致力于为科技爱好者提供优质的科技资讯,每周五发…

Vue3 官方宣布淘汰 Axios,拥抱Alova.js

过去十年,Axios 凭借其简洁的API设计和浏览器/Node.js双环境支持,成为前端开发者的首选请求库。但随着现代前端框架的演进和工程化需求的升级,Alova.js 以更轻量、更智能、更符合现代开发范式的姿态登场。 一、Axios的痛点 1,冗余的适配逻辑,比如Axios的通用配置(但实际…

Spring AI 与 Groq 的深度集成:解锁高效 AI 推理新体验

Spring AI 与 Groq 的深度集成&#xff1a;解锁高效 AI 推理新体验 前言 在人工智能飞速发展的当下&#xff0c;AI 推理的效率和性能成为开发者关注的焦点。Groq 作为一款基于 LPU™ 的超快速 AI 推理引擎&#xff0c;凭借其强大的性能&#xff0c;能够支持各类 AI 模型&…

风车OVF镜像:解放AI开发限制的Ubuntu精简系统

风车OVF镜像&#xff1a;解放AI开发限制的Ubuntu精简系统 AI白嫖续杯一站式-风车ovf AI白嫖续杯一站式解决-风车ovf 前言 作为一名AI开发者&#xff0c;我经常在Windows和Linux环境之间切换开发。然而&#xff0c;Windows平台上的各种免费版限制逐渐成为我工作效率的瓶颈。在寻…

第十部分:文件与动静态库

目录 1、文件系统 1.1、磁盘 1.2、文件系统 1.3、文件的增删查改 2、软硬链接 2.1、软链接 2.2、硬链接 3、物理内存与文件 4、动静态库 4.1、静态库 4.1.1、静态库的制作 4.1.2、静态库的使用 4.2、动态库 4.2.1、动态库的制作 4.2.2、动态库的使用 4.3、动静…

android14优化ntp时间同步

简介 网络时间协议NTP&#xff08;Network Time Protocol&#xff09;是TCP/IP协议族里面的一个应用层协议&#xff0c;用来使客户端和服务器之间进行时钟同步&#xff0c;提供高精准度的时间校正。 当机器的ntp时间同步出现问题时&#xff0c;可以从ntp配置方面进行优化&…

ZYNQ笔记(二十):Clocking Wizard 动态配置

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 任务&#xff1a;ZYNQ PS端 通过 AXI4Lite 接口配置 Clocking Wizard IP核输出时钟频率 目录 一、介绍 二、寄存器定义 三、配置 四、PS端代码 一、介绍 Xilinx 的 Clock Wizard IP核 用于在 FPGA 中生成和管理…

服务器带宽基础知识

服务器带宽基础知识详解 一、带宽的定义与基本概念 服务器带宽&#xff08;Bandwidth&#xff09;是指服务器与互联网之间在单位时间内传输数据的能力&#xff0c;通常以 Mbps&#xff08;兆比特每秒&#xff09; 或 Gbps&#xff08;吉比特每秒&#xff09; 为单位衡量。它决…

OpenCV CUDA 模块中在 GPU 上对图像或矩阵进行 翻转(镜像)操作的一个函数 flip()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::flip 是 OpenCV 的 CUDA 模块中的一个函数&#xff0c;用于在 GPU 上对图像或矩阵进行 翻转&#xff08;镜像&#xff09;操作。它类似…

shell脚本实现docker运行镜像挂载

根据本文脚本展示内容可以实现多种容器挂载 演示nginx挂载 创建挂载目录 mkdir -p /data/nginx/{conf,html,logs} 参数含义&#xff1a; docker run -d --name 给运行的镜像取名 -v /宿主机/目录:/容器内/目录 镜像名 示例&#xff1a; docker启动nginx&#xff08;当…

WiseAD:基于视觉-语言模型的知识增强型端到端自动驾驶——论文阅读

《WiseAD: Knowledge Augmented End-to-End Autonomous Driving with Vision-Language Model》2024年12月发表&#xff0c;来自新加坡国立和浙大的论文。 在快速发展的视觉语言模型&#xff08;VLM&#xff09;中&#xff0c;一般人类知识和令人印象深刻的逻辑推理能力的出现&a…

NestJS 知识框架

一、核心概念 1. 架构基础 基于 Express/Fastify 的 Node.js 框架 采用模块化设计 使用 TypeScript 构建&#xff08;也支持 JavaScript&#xff09; 借鉴 Angular 的设计理念 2. 主要组件 模块 (Module): 应用的基本组织单元 控制器 (Controller): 处理 HTTP 请求 服务…

深入理解 Istio v1.25.2

要深入理解 Istio 的最新版本&#xff08;截至 2025 年 5 月&#xff0c;最新版本为 1.25.2&#xff0c;发布Iweb:1⁊&#xff09;源码&#xff0c;我们可以通过分析其核心组件和代码结构来加深对 Istio 的理解。以下是对 Istio 源码的解读&#xff0c;结合其架构和功能&#x…

星际篮球争霸赛/MVP争夺战 - 华为OD机试真题(A卷、Java题解)

华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 针对刷题难&#xff0c;效率慢&#xff0c;我们提供一对一算法辅导&#xff0c; 针对个人情况定制化的提高计划&#xff08;全称1V1效率更高&#xff09;。 看…

Kubernetes etcd 故障恢复(1)

1.查看集群状态 获取主节点和故障节点id ETCDCTL_API3 ./etcdctl --cacert/etc/kubernetes/ssl/new-ca.pem --cert/etc/kubernetes/ssl/etcd.pem --key/etc/kubernetes/ssl/etcd-key.pem --endpoints"https://192.168.7.132:2379,https://192.168.7.134:2379,https://19…