【日擼 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.pswp.cn/pingmian/80590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80590.shtml
英文地址,請注明出處:http://en.pswp.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…