Typescript高级: 对泛型和多态的应用, 实现Java中的ArrayList和LinkedList

DeepSeek V4编程能力实测:真实项目中的多语言协同与工程化落地 大模型在软件开发中的价值,正从‘代码补全’转向‘工程上下文理解’。理解编程语言本质、掌握框架生命周期、识别技术债、兼容生态约束——这些构成现代IDE智能助手的核心能力。DeepSeek V4预览版通过128K长上下文、多文件分析、确定性输出与深度语言支持(Rust/Java/TypeScript),在真实项目中展现出对Spring事务传播、Rust unsafe语义、Zod类型推演等关键场景的精准建模能力。它不替代开发者决策,而是将重复性调试、上下文追溯、规范校验等耗时操作压缩至秒级,让工程师聚焦架构设计与 阅读详情

ArrayList


1 ) 概述

  • 在Java中,ArrayList是一个非常常用且强大的数据结构,它提供了动态数组的功能
  • 能够方便地添加、删除和访问元素。在TypeScript中,虽然并没有内置的ArrayList类型
  • 但我们可以通过类与接口来模拟实现ArrayList的功能

2 )实现

interface List<T> {
    size: number;
    add(item: T): void;
    get(index: number): T | undefined;
    remove(item: T): boolean;
    show(): void;
}

class ArrayList<T> implements List<T> {
    public array: T[];
    private index: number = 0;
    public size: number = 0;
  
    constructor() {
      this.array = [];
    }
  
    // 添加元素,重载 add 方法
    add(item: T): void;
    add(item: any): void;
    add(item: number): void;
    add(item: string): void;
    add(item: any): void {
      this.array.push(item);
      this.size++;
      this.index = this.array.length; // 更新索引为数组最后一个元素的索引+1
    }
  
    // 获取元素
    get(index: number): T | undefined {
      return this.array[index];
    }
  
    // 删除元素,重载 remove 方法
    remove(item: T): boolean;
    remove(item: any): boolean;
    remove(item: number): boolean;
    remove(item: string): boolean;
    remove(item: any): boolean {
      const index = this.array.indexOf(item);
      if (index !== -1) {
        this.array.splice(index, 1);
        this.size--;
        return true;
      }
      return false;
    }
  
    // 显示全部数据
    show(): void {
      console.log(this.array);
    }
  
    // 更新元素,这里并没有在接口中定义,作为额外功能添加
    update(index: number, newValue: T): boolean {
      if (index >= 0 && index < this.size) {
        this.array[index] = newValue;
        return true;
      }
      return false;
    }
}

const arrayList = new ArrayList<string>();

// 添加元素
arrayList.add("Hello");
arrayList.add("World");
arrayList.add(42); // 这将不会报错,因为 TypeScript 中的泛型在运行时会被擦除,并且 add 方法被重载以接受 any 类型

// 显示元素
arrayList.show(); // 输出: [ 'Hello', 'World', 42 ]

// 获取元素
console.log(arrayList.get(0)); // 输出: Hello

// 更新元素
arrayList.update(1, "TypeScript");
arrayList.show(); // 输出: [ 'Hello', 'TypeScript', 42 ]

// 删除元素
console.log(arrayList.remove("TypeScript")); // 输出: true
arrayList.show(); // 输出: [ 'Hello', 42 ]

// 获取数组大小
console.log(arrayList.size); // 输出: 2

3 )说明

  • 在基础List类型中,我们定义了如下方法和属性

    • add(item: T): 添加一个元素到ArrayList中
    • get(index: number): 根据索引获取元素
    • size: 存储ArrayList中元素的数量
    • remove(item: T): 删除一个元素
    • show(): 显示ArrayList中的所有元素
  • ArrayList 这个类继承List接口,并实现其所有的方法

  • 这里面实现了方法的多态和泛型

    • 1 )多态(Polymorphism)的主要优势在于提高了代码的可维护性和扩展性
    • 通过使用多态,我们可以编写更加灵活和可重用的代码
    • 因为我们可以定义通用的接口或方法,而不必关心具体实现细节
    • 2 ) 泛型(Generics)是TypeScript中一种强大的工具
    • 它允许我们在不丢失类型信息的前提下,编写可重用的组件
    • 这些组件可以与多种不同的类型一起工作,而不仅仅是一个类型
    • 泛型的主要作用是提供类型安全,同时确保代码的可复用性
    • 通过使用泛型,我们可以在保证类型安全的同时
    • 让函数与多种类型一起工作
  • 总结来说

    • 泛型和多态是TypeScript中两个强大的特性
    • 它们分别通过提供类型安全和允许统一操作不同数据类型来增强代码的可复用性和灵活性
    • 在实际开发中,结合使用泛型和多态可以帮助我们编写更加健壮、可维护和可扩展的代码

LinkedList


1 ) 概述

  • 在TypeScript中,实现一个双向链表(Doubly Linked List)相比于ArrayList会更加复杂
  • 因为我们需要维护每个节点的两个指针:一个指向前一个节点,另一个指向下一个节点
  • 同时,我们还要确保List接口的所有方法都能得到正确实现
  • 在数据结构中,链表是一种动态分配内存空间的线性数据结构
  • 由一系列的节点组成,每个节点通常包含两部分:
    • 一部分用于存储数据
    • 另一部分用于存储指向下一个节点的指针
  • 而双向链表,顾名思义,就是每个节点不仅包含指向下一个节点的指针
  • 还包含指向前一个节点的指针, 这使得双向链表在插入和删除节点时更为灵活

2 )实现

interface List<T> {
    add(element: T): void;
    get(index: number): T | undefined;
    size: number;
    remove(element: T): boolean;
}

class N<T> {
    value: T;
    next: N<T> | null;
    prev: N<T> | null;

    constructor(value: T, next: N<T> | null = null, prev: N<T> | null = null) {
        this.value = value;
        this.next = next;
        this.prev = prev;
    }
}

class LinkedList<T> implements List<T> {
    private head: N<T> | null = null;
    private tail: N<T> | null = null;
    public size = 0;

    add(element: T): void {
        const newNode = new N(element, null, this.tail);
        if (this.tail) {
            this.tail.next = newNode;
        } else {
            this.head = newNode;
        }
        this.tail = newNode;
        this.size++;
    }

    get(index: number): T | undefined {
        if (index < 0 || index >= this.size) {
            return undefined;
        }
        let current = this.head;
        for (let i = 0; i < index; i++) {
            current = current!.next;
        }
        return current?.value;
    }

    remove(element: T): boolean {
        let current = this.head;
        while (current) {
            if (current.value === element) {
                if (current.prev) {
                    current.prev.next = current.next;
                } else {
                    this.head = current.next;
                }
                if (current.next) {
                    current.next.prev = current.prev;
                } else {
                    this.tail = current.prev;
                }
                this.size--;
                return true;
            }
            current = current.next;
        }
        return false;
    }
}

// 使用示例
const linkedList = new LinkedList<number>();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
console.log(linkedList.get(1)); // 输出: 2
console.log(linkedList.size); // 输出: 3
linkedList.remove(2);
console.log(linkedList.get(1)); // 输出: 3

3 )说明

  • 首先,我们定义了一个 List 接口,它规定了链表需要实现的基本方法:

    • 添加元素(add)
    • 获取指定位置的元素(get)
    • 获取链表大小(size)
    • 以及删除元素(remove)
    • 这个接口为后续的链表实现提供了统一的规范
  • 在 LinkedList 的实现中,节点被定义为一个名为 N 的内部类

    • 每个节点包含三个属性:value 用于存储数据,next 指向下一个节点,prev 指向前一个节点
    • 这样的结构使得链表能够双向遍历,从而更容易实现某些操作,如删除节点
  • LinkedList 类实现了 List 接口,并包含了维护链表状态的重要属性

    • head 指向链表的第一个节点,tail 指向链表的最后一个节点,size 记录链表的大小
  • 添加元素:add 方法在链表尾部添加一个新节点

    • 首先,创建一个新的节点,并设置其 next 为 null,prev 为当前的尾节点
    • 然后,更新尾节点为新节点,并如果原链表为空(即 head 和 tail 都为 null)
    • 则将 head 也指向新节点, 最后,链表的大小加一
  • 获取元素:get 方法通过遍历链表找到指定位置的元素

    • 它首先检查索引是否合法,然后从 head 开始遍历,直到找到对应位置的节点或遍历完整个链表
    • 这个过程的时间复杂度是 O(n),其中 n 是链表的大小
  • 删除元素:remove 方法遍历链表,查找并删除指定的元素

    • 当找到匹配的节点时,它更新相邻节点的指针以跳过该节点
    • 并调整 head 或 tail 如果被删除的是头节点或尾节点。最后,链表的大小减一
  • 总结

    • 双向链表 LinkedList 的实现简单而高效,通过双向指针实现了灵活的节点操作
    • 它的主要优势在于插入和删除节点时的性能,尤其是当需要在特定位置进行这些操作时
    • 然而,链表在随机访问元素方面的性能不如数组,因为需要从链表头部开始遍历以找到指定位置的元素
    • 在实际应用中,链表通常用于需要频繁插入和删除元素的场景,如实现缓存、LRU(最近最少使用)算法等
    • 而数组则更适用于需要频繁访问元素的场景,如搜索、排序等
    • 因此,在选择使用链表还是数组时,需要根据具体的应用场景和需求进行权衡
TypeScript入门基础(七)——元组 一、元组声明 数组中的元素一般都是相同的,any类型的数组元素可以不同; 元组就可以存储不同类型的元素; 声明一个成绩元组,包含名字和成绩; var grade = ["小明",98]; 二、元组访问 元组访问:与数组访问类似,元组中元素使用索引来访问,第一个元素的索引值为 0,第二个为 1,以此类推第 n 个为 n-1; var grade = ["小明",98]; console.log(grade[0]) ; console.log(grade[1]); 二、元组元素添加、删除 阅读详情

相关推荐

点云欧式聚类快速了解

一种基于欧氏距离度量的聚类算法基于KD-Tree的近邻查询算法是加速欧式聚类算法的重要预处理方法KD-Tree是由二分搜索树演变而来的用于大规模高维度数据查找场景当中的索引结构,主要用于最近邻查找和近似最近邻查找。将整个空间划分为二叉树的形式,方便有效找到最近邻点云处理算法库PCL,是比较重要的,在后续会继续学习,然后发出更优质的文章。

xiaobaiwsc的博客 1723

打造 TypeScript 集合,ArrayList

—ArrayList 采用数组实现 包含功能: 1、最后添加对象/内容 2、指定索引添加 3、修改指定索引 对象/内容 4、根据 对象/内容 删除 5、根据索引删除 6、根据索引获取对象/内容 7、获取集合长度 8、自动扩容 接口 /** * TODO List 集合 * @author 王松 * @WX-QQ 1720696548 * @date 2019/11/19 12:55 ...

ws - 兮的博客空间 3265

从摄像头选型到PCB布线:搞懂MIPI CSI带宽计算,避免你的嵌入式项目翻车

本文详细解析了MIPI CSI带宽计算在嵌入式项目中的关键作用,从摄像头选型到PCB布线提供全流程指导。通过实际案例和计算公式,帮助工程师准确计算带宽需求,避免图像丢帧和系统崩溃问题,同时优化PCB设计确保信号完整性。

weixin_30533109的博客 376

TypeScript学习笔记(6)-集合类型

对象类型是所有类、接口、数组和字面量类型(不是基本类型的任何类型)

wdk996的博客 825

PCB激光直接成像(LDI)设备技术解析与优化方案

激光直接成像(LDI)是PCB制造中的关键数字化工艺,通过激光束直接在基板上形成电路图案。其核心技术在于高精度光学系统与智能控制算法的结合,工作精度可达微米级。在HDI板、柔性电路等高端PCB制造中,LDI技术能显著提升线宽精度和层间对位准确性。当前行业面临材料适配性、热变形控制等挑战,动态能量补偿、多波长曝光等创新方案正在突破这些瓶颈。随着模块化设计、预测性维护等工程实践的普及,LDI设备综合效率持续提升,为5G、汽车电子等领域的精密电路生产提供关键技术支撑。

weixin_29168393的博客 394

SAP开发实战:用FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本(附完整ABAP代码)

本文详细介绍了如何使用SAP的FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本,提供完整的ABAP代码实现方案。通过该BAPI,开发者可以高效完成财务凭证的批量修改,确保数据一致性和审计合规性,显著提升SAP财务模块的运维效率。

weixin_29224589的博客 383

Typescript学习

typescript 基本数据类型 布尔值 let isDone: boolean = false; 数字 let myNumber:number = 5; 字符串 let myString:string = "lalalalalal"; // 使用模板字符串 let name: string = `Gene`; let age: number = 37; let sentence: string = `Hello, my name is ${ name }. I'll be ${ a.

m0_53419397的博客 459

Pytorch入门实战(7):基于BERT实现文本隐喻二分类(Kaggle入门题目)

Bert入门实战,文本二分类问题

iioSnail的博客 4057

typeScript类型声明

ts基础类型声明定义

qq_45675879的博客 521

Opencascade 保存点云为 .stp 和 .step 格式

总结一下,OpenCascade提供了强大的功能和工具,使我们能够方便地将点云数据保存为 .stp 和 .step 格式。通过使用类似于上述示例代码的方法,你可以使用OpenCascade库将点云数据保存为.STP和.STEP格式。总结一下,使用OpenCascade库,你可以方便地将点云数据保存为.STP和.STEP格式。通过使用类似于上述示例代码的方法,你可以将点云数据转换为OpenCascade的几何模型,并将其保存为所需的文件格式。请注意,上述代码仅涵盖了将点云数据保存为.STP格式的基本步骤。

CwzCode的博客 1158

OpenClaw实战系列·进阶特辑02:多智能体协同——打造企业级AI中台

**企业级AI中台面临多Agent协同的挑战,本文提出基于多智能体协同的解决方案。通过分析单Agent的局限性(上下文溢出、专业度稀释等)和多Agent的核心优势(任务专注度、故障隔离等),提出三种协作架构模式(指挥型、联邦型、点对点型),并强调人格化设计的重要性。文章详细介绍Agent间通讯机制(同步/异步会话、文件系统协作)和"身脑分离"的解耦架构设计,提供可落地的企业级AI中台实施方案。

PeterPan的博客 494

ArrayList 和 LinkedList 的深度对比:原理、性能与应用场景

Python 列表(类似 ArrayList 的部分功能)示例# 输出: Element 1简单的 Python 链表类示例(模拟 LinkedList 的部分功能)# 链表节点类# 链表类通过对 ArrayList 和 LinkedList 在底层数据结构、操作效率、内存占用和线程安全等方面的详细对比,我们能更清晰地了解它们各自的特点,从而在开发中根据具体需求合理选择使用,也能更好地应对相关的面试问题。

m0_57836225的博客 718

16、AI与无人机助力紧急器官移植及医疗物资运输

本文探讨了AI与无人机(UAV)集成模型在紧急器官移植和医疗物资运输中的应用。传统运输方式受限于交通、时间和环境因素,而基于图神经网络(GNN)的AI-UAV系统可实现高效、智能、全天候的医疗物资配送,具备实时温湿度监控、自动导航和适应复杂地形等优势。文章分析了该模型在血液、器官运输中的关键作用,展示了其在澳大利亚、中国、美国等国的实际应用案例,并通过表格与流程图说明运作机制。同时,文章还探讨了技术、法规和社会层面的挑战及应对策略,展望了未来技术融合、应用拓展和国际合作的发展趋势,凸显其在全球医疗物流中的广

lll78的博客 102

Java集合中实现交并补

转自:http://www.pinlue.com/article/2020/09/2823/4611267381457.html

icontent 280

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java全栈开发面试核心考察维度与实战解析

Java全栈开发作为当前企业级应用开发的主流技术栈,其面试考察维度涵盖从基础理论到分布式系统设计的全链路能力。理解JVM原理、掌握Spring框架机制、优化SQL查询性能是开发者必须跨越的技术门槛。在微服务架构成为行业标配的背景下,领域驱动设计、分布式事务处理等进阶技能直接影响系统的高可用表现。本文基于HashMap扩容机制、Spring Bean生命周期等典型面试题,剖析Java全栈岗位对MySQL索引优化、前端性能监控等热点的考察重点,帮助开发者建立完整的面试应对策略。

weixin_34194359的博客 382

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

程序员高效成长:必备资源与工具全指南

在软件开发领域,掌握高效学习路径和工具链是提升开发效率的关键。从基础语言学习到框架深度应用,合理的资源选择能显著加速成长曲线。以Java生态为例,通过《Java八股文资料》等结构化教程配合JVisualVM工具观察内存模型,可以深入理解集合框架原理。现代开发更离不开效率工具,如VS Code的CodeX插件和iTerm2终端组合,能实现智能补全和快速命令检索。对于企业级开发,Spring Boot与MyBatis-Plus的高并发表现,以及若依框架的快速开发特性,都是值得关注的解决方案。这些资源和技术组合,

weixin_33733810的博客 326

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java全栈工程师面试核心考点与实战解析

Java全栈开发作为企业级应用的核心技术栈,其能力评估需兼顾深度与广度。从JVM内存模型到Spring框架原理,技术理解需穿透API层直达设计本质。在微服务架构场景下,分布式事务与链路追踪等问题的解决方案直接体现工程实践能力。面试考察重点通常围绕Java并发编程(如volatile关键字与ThreadLocal)、Spring生态(如AOP代理与循环依赖处理)、以及前端工程化(如Vue3响应式原理)等核心技术展开。掌握这些技能不仅能应对技术面试,更能提升实际项目中的系统设计能力,特别是在高并发场景如电商秒杀

weixin_34326558的博客 437

Java全栈开发面试核心要点与实战技巧

Java全栈开发涉及从基础语法到项目落地的完整技术栈,对开发者的知识广度和深度要求极高。理解JVM内存模型、GC机制以及并发编程原理是Java基础的核心,而Spring Boot的自动配置和启动流程则是后端开发的重点。在前端方面,Vue3的组合式API和状态管理方案成为主流选择。在实际项目中,技术架构设计、接口幂等性保障和分布式事务处理是关键挑战。面试中,展示技术深度和项目经验同样重要,结构化表达和问题解决能力往往决定成败。掌握这些核心要点,能有效提升Java全栈开发面试的成功率。

weixin_30633405的博客 389

Java面试3天速成攻略:高频考点与应答框架实战指南

Java作为企业级应用开发的核心语言,其面试准备往往围绕集合框架、多线程和JVM原理等基础概念展开。理解HashMap的哈希碰撞处理机制和ConcurrentHashMap的分段锁实现,是掌握Java并发编程的关键。这些技术原理直接影响高并发场景下的系统性能与数据一致性,在电商秒杀、金融交易等业务中具有重要价值。通过建立清晰的比较维度和应答框架,求职者可以高效应对面试中的原理类和场景类问题。本文基于HashMap和ConcurrentHashMap等热词,结合线程安全与分布式锁等高频考点,帮助开发者快速构建

weixin_34293059的博客 441

Java全栈开发必备的前端核心技能解析

在现代Web开发中,前后端分离架构已成为主流技术范式。理解前端基础技术栈(HTML/CSS/JavaScript)的工作原理,是Java开发者实现高效全栈开发的关键。HTML5语义化标签通过结构化文档提升SEO效果和可访问性,而CSS Flex布局采用弹性盒子模型实现响应式设计,这与Java集合框架的设计思想有异曲同工之妙。在企业级应用场景中,TypeScript的类型系统与Java的强类型特性形成互补,Swagger UI的深度集成则大大提升了前后端协作效率。特别是在金融系统等高要求领域,掌握前端路由机制

weixin_33892359的博客 363

Java入门到精通-21 集合框架新特性与实战——Java 9-21集合增强

本文介绍了Java 9-21版本中集合框架的重要新特性,主要包括: 不可变集合工厂方法(Java 9+) 通过List.of()、Set.of()、Map.of()等简洁方式创建不可变集合 不可变集合天然线程安全,避免副作用,不允许null值 提供了内存优化和序列化支持 SequencedCollection接口(Java 21) 统一了有序集合的操作方式 提供addFirst()、getLast()等标准方法 支持reversed()方法获取反转视图 集合增强方法 结合Stream API进行函数式操作

weixin_56693899的博客 314

前端学 Java 课程笔记

面向前端开发人员:大量以前端概念类比

estrusKing的博客 230

大厂Java面试核心考点与分布式架构实战解析

Java作为企业级开发的主流语言,其技术栈深度与分布式架构能力是面试核心考察点。从JVM内存模型到并发编程原理,开发者需要掌握指令重排序、锁升级等底层机制。Spring框架的IoC容器和AOP代理等核心设计,体现了依赖注入和面向切面编程的工程实践价值。在分布式场景下,Redis+Lua脚本实现原子操作、SAGA模式处理分布式事务等方案,解决了高并发下的数据一致性问题。本文结合大厂真实面试题,详解秒杀系统防护、缓存击穿处理等高频场景,帮助开发者构建完整的Java技术体系。

weixin_34367257的博客 398

set集合转list集合_Set集合

/* * Collection * |--List * 有序(存储顺序和取出顺序一致),可重复 * |--Set * 无序(存储顺序和取出顺序不一致),唯一 * * HashSet:它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。 * 注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序, * 而你的顺序恰好和它的存储顺序...

weixin_39787057的博客 1400

【2026年9月】最新计算机专业面试八股文(全体系总结)

本八股文适配2026年春招/秋招/社招最新面试趋势,覆盖通用基础、主流开发专项、工程架构、前沿技术、算法核心五大核心模块,标注高频考点与2026年新增超高频考点,兼顾系统性、应试性与实战落地性。

小江的记录本 1万+

Claude Code Token优化实战:从Prompt设计到工程化管控

Token是大模型交互的基本计量单位,其消耗逻辑远非字符计数,而是由语义单元(如'ArrayList'、'GC')在模型词表中的编码方式决定。理解Claude系列采用的BPE变体分词原理,是实现高效AI编程的前提;在此基础上,优化核心在于控制输入语义密度、规避上下文污染与格式幻觉等结构性浪费,并通过Prompt结构化(如三明治模板)、AST代码脱水、流式响应截断等技术手段提升单位Token的信息产出比。该策略广泛适用于代码审查、架构设计、文档生成等AI原生开发场景,尤其契合Claude Code在真实工程环

weixin_30321709的博客 423
上一篇: Typescript高级: 深入理解 keyof, extends 以及 extends keyof
下一篇: Typescript高级: 详解 any、object、Object、Record<any, any> 和泛型 T
Wang's Blog
博客等级 码龄12年 7433粉丝 2419原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值