Java对于数据结构以及集合的实现(个人复习向)

48V电动车电池包拆解:硬核入门BMS硬件设计与故障排查 BMS(电池管理系统)是锂电应用的核心安全与性能保障模块,其本质是融合电化学、模拟电路、嵌入式控制与热管理的交叉系统。理解BMS不能止步于SOC算法或通信协议,而需回归硬件本体——从电压采样精度、MOSFET驱动时序、被动均衡散热设计到NTC热耦合布局,每一处物理实现都直接决定系统可靠性。48V平台因兼具安全性(<60V ELV)、复杂度(13–14串)与产业普及性,成为BMS工程实践的理想标本。本文聚焦真实电池包中的PCB级设计缺陷识别、关键参数现场验证(如±5mV采样误差、5mΩ导通内阻)、UART协议 阅读详情

数据结构

一:概要

1.什么是数据结构:

是用来做计算存储,组织数据的一种方式,是相互之间,存在一种或者多种特定关系的数据结合。数据结构需要高效的算法和索引技术。

2.常见的数据结构类型:

数组(Array),链表(LinkedList),队列(Queue),栈(Stack),哈希表(Hash),树(Tree),等等,而我们使用较多的一般为前几种

3.数据结构算法的重要性:

无非就是两个原因,高效的存储以及运行效率。数据结构的效率评估通常是通过与其他数据结构或实现方式的对比来完成的,目的是找到最适合特定场景的存储和操作方式。

ArrayList   LinkedList  HashMap已经被高度封装由Java标准库提供给我们使用,这些类的实现代码位于 java.util 包中,是 Java 核心库的一部分。

二:ArrayList的引出使用

在idea下我们可以很清晰的知道ArrayList是抽象List类的子类

private static final int DEFAULT_CAPACITY = 10;//初始默认容量
private int size;//ArrayList的元素个数(自己添加)
private static final Object[] EMPTY_ELEMENTDATA = {};//一个静态的空数组实例,用于表示空的ArrayList实例,作为一个共享常量,所有的空ArrayList都可以引用他,避免重复创建
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};//与上者不同,当第一个元素被添加至ArrayList时会触发默认容量扩容
transient Object[] elementData;//这是 ArrayList 内部用于存储元素的数组缓冲区

对ArrayList构造器来说,如果参数传值为空则分配一个共享的空数组实例,在第一次被添加元素时才会分配一个默认值为10的容量,当然如果传参数为正常int数时则会被正常创建

public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

对于ArrayList扩容来说,第一个方法扩容会至少扩充到minCapacity而更倾向于1.5倍原长度

如果没有传值则会默认对当前size+1

private Object[] grow(int minCapacity)
private Object[] grow()

对于添加元素和删除元素是由add和remove完成,add不多赘述,而remove需要考虑是直接设置为null还是需要删除元素,例子如下:

public static void remove(int site) {
    if (site <= 0 || site > size) {
        System.out.println("当前位置不存在");
        return;
    }
    stus[--site] = null;
}
public static void removeCopy(int site) {
    if (site <= 0 || site > size) {
        System.out.println("当前位置不存在");
        return;
    }
    for (int i = site - 1; i < size - 1; i++) {
        //把索引位置为 site 位置的元素移动到 site -1 位置
        stus[i] = stus[i + 1];
    }
    stus[--size] = null;
}

三 :LinkedList链表的使用

链表分为单向链表以及双向链表。

我们可以从图中了解到链表的继承关系,以及对于接口的实现

 

从代码里我们可以去观察一下链表的内部结构

链表的基本属性

transient int size = 0;
transient Node<E> first;
transient Node<E> last;
Node类的属性
E item;
Node<E> next;
Node<E> prev;           

这段代码定义了一个双向链表的基本结构,包括节点类和链表的属性。每个节点包含数据、指向前一个节点和后一个节点的引用,而链表则通过 first 和 last 来管理链表的头和尾,并通过 size 记录链表的长度。

对于链表的构造

仍然和ArrayList比较相同的提供无参构造器和带参构造器

//无参构造器,创建一个空链表

public LinkedList() {
}

//带参构造器,传入集合通过

public LinkedList(Collection<? extends E> c) {
    this();
    addAll(c);
}

链表操作的实现

//链表的添加或者是修改

public E set(int index, E element) {
    checkElementIndex(index);
    Node<E> x = node(index);
    E oldVal = x.item;
    x.item = element;
    return oldVal;
}
public boolean addAll(Collection<? extends E> c) {
    return addAll(size, c);
}
public boolean addAll(int index, Collection<? extends E> c)
//具体实现代码量比较多,后者不具体列出,总体思想为如果不带参数默认为在链表最后插入,如果带参数在链表参数位置插入,最后要连接链表,如果在链表头插入,则要多一次判断并设置first值为newNode。

//前者为对对象的插入,单add可以用addFirst或者addLast实现

public void addFirst(E e) {
    linkFirst(e);
}
public void addLast(E e) {
    linkLast(e);
}//linkFirst和linkLast的代码实现比较简单,可以在结构体里自己查询

//clear为清空链表,remove为清空元素,具体实现方式比较多可通过remove查看

对于链表的查看可与队列相联系(后续会在队列提及)

四:队列以及栈

队列常用的为双向队列Deque,Deque继承于Queue,而Queue继承于Collection 

不同的是,上述的三者都是接口,不同于前面ArrayList和LinkedList有具体的实现类

从图中的层次能清楚LinkedList同样实现了Deque接口,所以上述提及的对于链表的查看可以通过peek查看,而且同样能pop,pull以及push,所以对于前面的问题在此处能有更清晰的理解

对于栈来说,大多数的操作和队列都比较相似,图中为栈的继承结构,栈也是一种内部的实现类

栈的实际运用会比较多,栈实际为受限制的线性表,被限制只允许从表的一段进行插入和删除运算,这一端称为栈顶,另一端就称为栈底,先进后出(FILO)

具体的重要的操作:

从图中可以了解,栈的操作并不算多,但是栈的使用是比较常见的。

五:哈希表

一般数组中,通过索引操作的,索引和我们元素之间是不存在确定关系。查找值直接查索引就行

hashtable:元素值和我们的hashtable 是存在对应关系的

例如:在不使用任何的集合,也不使用数据库,添加学生信息,做到快速查询,哈希表能够做到高效率

以下是哈希表的继承结构(具体内部实现比较复杂)

哈希表的基本结构:

哈希表通常由一个数组(称为“桶数组”)和链表(或其他数据结构)组成。数组的每个位置称为一个“桶”,用于存储数据。

链地址法中,数组的每个桶里存储的是一个链表。当发生哈希冲突(即不同的键映射到同一个桶)时,冲突的元素会被添加到链表中。这是最常见的哈希表实现方式之一。

哈希表也可以用其他方式实现,比如开放地址法(Open Addressing),其中冲突的元素会被存储到数组的其他位置,而不是使用链表。

在 Java 中,HashMap 的实现早期确实使用了“数组 + 链表”的结构,但在 JDK 8 之后,当链表长度超过一定阈值时,链表会转换为红黑树,以提高查找效率。

所以其实哈希表的核心思想是通过哈希函数将键映射到数组的某个位置,而“数组 + 链表”只是其中一种实现方式,比较好理解

六:相关知识补充(集合,泛型)

其实到这一步,大体数据结构我们已经有一定认识了。接下来以一张图的形式大概了解一下具体的集合知识补充

为什么有数组还要有集合:

因为数组长度一但固定就不可变;很多地方需要操作数组的(增删改查)都需要去编写对应的方法 (代码重复了--->封装);每个人定义各自的方法,可能存在别人找不到这种情况,实现也容易存在bug

集合框架:容器类确实很好用,集合框架框架是为了提供一些规范和标准,任何实现类都需要包含对外的接口,接口的实现,对集合内部的算法(底层都是一种数据结构)

目的:提供代码复用(封装的思想),让使用者专注于业务开发,而不是数据结构和算法

常见集合

- List(列表):集合中对象按照索引位置排序,允许元素重复。
- Set(集):集合中的元素不按特定方式排序,不允许元素重复。(类似于高中学习的集合)
- Map(映射):集合中的元素(key-value),不允许key 重复,值可以重复。(1对多映射)

Vector实现类:

- 底层使用 Object[] 数组(调用不带参数构造器时,默认长度为10,若不传扩容参数,扩容2倍)//ArrayList倾向于扩容1.5倍
- toString 方法已经重写并且可以直接打印出数组的样子

常用的操作(增删改查):

- - add(E obj)
  - addElement(E obj)
- 查询
  - size() 查长度
  - get(int index) 查具体索引位置的元素值
  - isEmpty() 判断集合为空
- 删除
  - remove(int index)删除具体索引位置的元素
  - remove("A") 删除指定元素
  - removeLast() 循环,设置 null ,等待gc 回收
- 修改
  - set(int index,E obj);修改某一个索引位置元素值

ArrayList与Vector

ArrayList是用来取代Vector的,两者底层原理和算法都一模一样。

区别在于:

- Vector:所有的方法都是用 synchronized 修饰符,表示线程安全的,性能低,适用于多线程环境
- ArrayList:线程不安全,性能高,即使在多线程环境下也使用它(Collections.synchronizedList(list))//非安全->安全提供的一个方法
- ArrayList 底层扩容是1.5倍,Vector 是两倍
- 底层构造器ArrayList 优化了,默认创建对象的时候是给一个空数组,第一次调用add 方法时,采取重新初始化数组(创建对象时,如果不存任何值,也浪费了堆空间),当然以上有些已经在ArrayList里提及过

List的总结

 根据 Vector ArrayList LinkedList 类的所有特点进行的一个抽象,定义一个规范
 特点:
            - 允许元素重复
            - 会记录添加顺序
            - 具有很多共同方法

所以例如List<Integer> list = new ArrayList();//或者是LinkedList;Vector

都建议声明为List接口类型;这种方式更灵活,因为以后可以轻松地更换实现类(比如换成 LinkedList 而不需要修改其他代码)。
它遵循了“面向接口编程,而不是面向实现编程”的原则。

如果直接绑定到 ArrayList 实现,它灵活性较低,但如果你需要用到 ArrayList 特有的方法(不在 List 接口中定义的方法),可以使用这种方式。第一种方式更灵活,通常更推荐使用。

实现类的选用

ArrayList 取代 Vector 直接使用;

LinkedList:- 数组结构的算法:插入和删除速度慢,查询和更改较快
       - 链表结构的算法:插入和删除速度快,查询和更改较慢

泛型

从我给出的一些代码里,我们能观察到泛型的身影

为什么我们需要去使用泛型,问题多一种,解决方法当然也多一种:

问题在于取集合元素时,取出来的是Object 类型,需要强制类型转换才能使用;添加元素时候,缺乏规范,导致可能需要使用时,会出现类型转换异常

设计原则:不要写重复的代码,能抽就抽

而泛型是一种数据规范和约束,提供编译时期的安全检查机制,底层给我们做强制类型转换,减少了我们的工作量

怎么去使用:常见的字母:

- T type(类型,使用到类上面)
- K V (key value)
- E element(元素)

例子:

类:

public class User<T> {
    T obj;
}

//多个的方法
public class User<T,E,k> {
    T obj;
    E ele;
    k value;
}

接口:

public interface Usb<T> {
    void user(T t);
}

方法:

public static <T> T print(T t){//返回类型T
    return t;
}

泛型的继承:

public class Mouse<T,T1> implements Usb<T,T1>{
    @Override
    public void user(T t, T1 t1) {
    }
}

public class Keyword<T> implements Usb<T,String>{
    @Override
    public void user(T t, String s) {
    }
}

本文用于个人学习记录,欢迎各位指正

使用Python实现深度学习模型:智能光污染监测与管理 本项目将通过以下几个步骤实现智能光污染监测:收集光污染图像数据数据预处理构建深度学习模型训练模型评估模型部署模型用于实时监测通过本文介绍的步骤,我们实现了一个使用Python和深度学习技术的智能光污染监测与管理系统。该系统能够自动识别光污染源,为相关管理部门提供科学依据,以便更好地规划和管理城市照明。同时,这一方法还可以扩展到其他环境监测领域,为环境保护贡献力量。 阅读详情

相关推荐

DDR5内存ODT模式全解析:5种状态与实战配置指南(附时序图)

本文深入解析DDR5内存的片上终端电阻(ODT)机制,详细阐述了其五种核心状态(终结电阻禁用、RTT_WR、RTT_NOM_RD、RTT_NOM_WR、RTT_PARK)的定义、切换时序与工作原理。通过解读JESD79-5规范中的时序图,并提供基于模式寄存器的实战配置指南与代码示例,帮助硬件工程师和系统开发者优化信号完整性,解决高负载下的稳定性问题,并实现性能与功耗的最佳平衡。

weixin_29221753的博客 564

Java 集合与数据结构

Java集合与数据结构

编程开发相关技术学习 1530

台达PLC使用RS485Modbus指令通信

台达PLC,RS485,Modbus RTU,从站梯形图,0X01,0X02,0X05,CRC校验

lilililimu的博客 1万+

java数据结构(集合)

一、集合介绍 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢(因为:增删后涉及到其他数据的位移) 线程不安全,效率高Vector 底层数据结构是数组,查询快,增删慢(因为:增删后涉及到其他数据的位移) 线程安全,效率低LinkedList 底层数据结构是双向链表,查询慢,增删快 线程不安全,效率高 Set(无序,唯一) HashSet 底层数据结构是哈希表。 哈希表依赖两个方法:hashCode()和equals() 执行顺序:

xiaomojun的专栏 817

00 — Intel xe SVM 内核实现精读系列专栏导读

本文系统介绍了Intel Xe GPU的共享虚拟内存(SVM)实现机制。第一部分通过概念地图阐述SVM的六个核心概念及其关系;第二部分通过三个测试用例解析SVM关键功能:fault生命周期验证、madvise与VRAM迁移、跨GPU一致性;第三部分深入内核实现,包括初始化/销毁流程、Page Fault处理、MMU Notifier失效路径、异步垃圾回收、VRAM迁移机制、madvise实现原理,以及与ROCm SVM的对比。文章建议按功能模块顺序学习,从基本概念到测试用例,再深入内核实现细节,最后对比不同

图形/计算GPU的驱动与虚拟化技术分享园地 1674

银行一表通监管报送系统详解

国家金融监管总局对于“一表通”的总体描述为:通过建立一套明细级、标准化的数据体系和汇总计算规则,将银行机构传送至监管可信区的业务明细数据汇总生成财务指标、监管指标和监管报表,大幅提升监管数据时效性,统一数据标准,实现数据间的穿透和整合,同时改变机构多头报送数据模式,减轻机构报送负担。

银行信息系统应用架构详解 2521

Java八股文——数据结构与集合(一)

java中数据结构相关问题,很适合面试学习

PjhDepon的博客 616

Python爬虫实战:高效爬取中国版权登记数据

本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的中国版权登记数据爬虫系统。我们将使用Playwright+Asyncio实现无头浏览器自动化,结合Redis分布式任务队列和MongoDB数据存储,打造一个能够应对反爬机制的企业级数据采集方案。文章包含完整代码实现、性能优化技巧以及法律合规建议,帮助开发者快速掌握大规模数据采集的核心技术。本文详细介绍了2024年使用Python最新技术栈构建中国版权登记数据爬虫的完整方案。基于Playwright的无头浏览器自动化。

2201_76125261的博客 1899

JAVA数据结构、集合操作及常用API_C++开发转JAVA

日常JAVA开发过程中需要用到的JAVA数据结构基础概念。进阶集合框架、collection操作、常用API。JAVA Gson等常用转化技巧

少年初心的博客 988

Oracle EBS R12 AR 标准发票 核心表结构

​ Oracle EBS R12 AR 标准发票 核心表结构 聚焦手动标准发票 (Standard Invoice),按头→行→分配→税→收款计划→会计分录→历史分层,标注主键、外键、关键字段、业务含义,同时说明表间关联关系,适配开发 / 运维 / 数据核对场景。 一、主数据层(发票头 + 行,核心业务表) 1. RA_CUSTOMER_TRX_ALL 【发票头表】 作用:存储整张发票头部信息,一张发票对应一条记录,AR 发票主表。 主键:CUSTOMER_TRX_ID (唯一 ID,系统内部键) 业

金牌架构师 283

农业无人机:无人机图像处理_(8).遥感图像处理与分析

遥感图像处理与分析在农业无人机技术中具有重要作用,通过图像预处理、特征提取、分类与分割、目标检测等技术,可以实现对农田的精细管理、作物监测、病虫害预测等应用。本节详细介绍了这些技术的基本概念、常用方法和具体实现,希望对您在农业无人机图像处理方面的学习和应用有所帮助。

zhubeibei168的博客 1336

一文看懂java集合(图文详细)

一、Collection 接口的接口 对象的集合(单列集合)List 接口:元素按进入先后有序保存,有序,可重复LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全Vector 接口实现类 数组, 同步,线程安全Set 接口: 仅接收一次,无序,不可重复,并做内部排序HashSet 使用hash表(数组)存储元素LinkedHashSet 链表维护元素的插入次序。

丨康有为丨的博客 3537

Multisim14.0仿真(五十九)基于74LS161的24进制计数器应用设计

它具有同步预置、异步清零功能,支持并行数据加载,并可在计数使能控制下进行二进制计数。:低电平时,在下一个时钟上升沿加载输入数据(A, B, C, D)。(多个 74LS161D 串联构成 8 位、12 位等更长计数器)。低电平时,下一个时钟上升沿加载输入数据(A, B, C, D)。:低电平有效,立即清零计数器(不受时钟控制)。均为高电平时,每个时钟上升沿计数。:两者均为高电平时,计数器才能递增。:立即清零计数器(不受时钟控制)。(通过预置初始值控制计数范围)。(计数范围:0 ~ 15,即。

corlin6688的博客 4764

Java复习

自从当上组长以来,我这个组长没有尽职尽责。因为我没有手把手教组员如何学java,我深感愧疚。原因是,自从学习C++与Go之后,Java语法陌生了许多。本文就用来复习Java!

2302_80067378的博客 9243

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Java】—— 集合框架:集合框架随堂复习

java.util.Collection:存储一个一个的数据|-----子接口:List:存储有序的、可重复的数据 ("动态"数组)|---- ArrayList(主要实现类)、LinkedList、Vector​|-----子接口:Set:存储无序的、不可重复的数据(高中学习的集合)|---- HashSet(主要实现类)、LinkedHashSet、TreeSet​​。

weixin_63106307的博客 1142

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【程序员快速复习系列】JAVA集合总结

程序员面试本是一件再平常不过的事情,记得刚毕业的时候面试题背的滚瓜烂熟。但是在职程序员面试却是另一回事了,我们往往没有太多时间复习,特别是大龄程序员,工作日忙于工作,周末还要照顾家庭,一旦面临被优化的风险就很被动,难以在短时间内复习并找到工作。不要问我是怎么知道的,都是切身体会,在复习的过程中我也走了不少弯路,所幸最终结果令自己满意。为了不让和我一样的程序员遇到同样的问题,我打算写这一系列的文章,,如果能帮助到你就太好了。

nzealand的博客 1106

Java 复习笔记 - 集合进阶篇:数据结构

数据结构是一种组织和存储数据的方式,它描述了数据元素之间的相互关系以及数据元素的组织形式。数据结构基本概念包括数据、数据元素和数据项、数据对象、数据结构、逻辑结构和存储结构。数据是指能够被计算机识别、存储、计算(处理)的符号集合,而数据元素也称作节点,是数据的基本单位,最小单位是数据项。数据对象是具有相同特征的数据元素的集合,是数据的子集。数据结构是计算机存储、组织数据的方式,它分为数据的逻辑结构和存储结构。逻辑结构是指从逻辑关系上描述数据,与数据的存储无关,且独立于语言。

梁辰兴的博客 611

Java复习01 集合概念

每个储物格都有一个号码,但是这个号码不是随便给的,它是通过你鞋子的某个特别标记计算出来的。虽然这样找鞋子可能会慢一点,因为你需要检查每个小盒子,但通常来说,这个魔法计算得很好,所以每个储物格里只有一两个小盒子,你还是很快就能找到你的鞋子。现在,当你下次来,想要取回你的鞋子,你不需要去每个储物格门口找,你只需要记住那个特别标记,再用同样的魔法计算一次,就能直接知道你的鞋子在哪个储物格了。,每个学生都有一个固定的座位号(也就是在列表中的索引位置),你可以很快地找到任何一个学生(元素)只要知道他们的座位号。

weixin_47558943的博客 2090

【JavaSE复习】数据结构、集合

在集合内的存储中,数据类型为Object,当将数据取出集合后,又将数据类型转换为原来数据类型。遍历无序数据,将遍历到的元素插入适当位置,如果遇到相同数据,插在后面。数据本身没有明显的规律,那么定义块的时候将(最大值,起始索引,结束索引)换成(最小值,最大值,起始索引),块的分割需要手动定义。第一轮:把0索引的数组作为基准数,确定基准数在数组中正确的位置,比基准数小的或等于的全部在左边,比基准数大的全部在右边。在添加数据时,如果键不存在,那么直接把键值对对象添加到map集合当中,方法返回null。

m0_46261292的博客 1260

06-java基础——集合的复习

集合主要分为两类: - 单列集合 - 双列集合

学习笔记 1168

单值集合总复习

Object是所有类【引用数据类型】的父类将一个转换成String类型。

Miserables_的博客 1120

Java集合复习

文章目录前言Collection接口集合使用List集合Set集合Map集合Java泛型 前言 由于之前的类对多个对象进行操作时,扩展性和适应性相对较差,所以java提供了集合框架来供我们灵活地操作对象组。 集合有以下三个特点:(1)长度可变;(2)只能存储引用类型;(3)可以存储多种引用类型。 java集合框架主要包括两种,一种是集合(Collection),存储一个元素集合,另一种是图(Map),用来存储键值对映射。 Collection接口 Collection接口又有3种子类型:List、

zhangzhang_one的博客 391

集合复习(java)

第一次开始 默认是 0 ,所以 oldCapacity + (oldCapacity >> 1) 是 0, 直接把 10 给 newCapacity,扩容为10第二次开始,有了前面的 10 了 所以 oldCapacity + (oldCCapacity >> 1) 开始扩容 1.5倍。

qq_50249256的博客 1131

Java中的集合整合复习

1.什么是集合? 1、集合类存放于java.util包中。 2、集合类型主要有3种:set(集)、list(列表)和map(映射)。 3、集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。 简单来讲:集合就是一个放数据的容器,准确的说是放数据对象引用的容器。 ...

qq_45207430的博客 252

集合复习JAVA

void add(int index,E element) | 在此集合中的指定位置插入指定的元素 || E remove(int index) | 删除指定索引处的元素,返回被删除的元素 || E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 || public void addLast(E e) | 将指定的元素追加到此列表的末尾 |- 用HashSet集合,基于哈希表的。

2301_78947898的博客 1113

【复习】Java集合

数组是固定长度;集合是动态长度的数据结构,需要动态增加或删除元素数组可以包含基本数据类型和对象;集合只能包含对象数组可以直接访问元素;集合需要通过迭代器访问元素。

qq_57882997的博客 1191

Java期末复习小记

个人网站已经开通了https,正在备案中。不出意外十一月底就能上线了,到时候个人博客和一些好玩的小工具都会放在上面(网址是https://yjprolus.top,备案未通过前暂时都无法访问)   最近忙着复习Java和操作系统,第二篇博客到现在才写完。这次主要是记录最近的Java复习内容,知识点比较散,希望对大家有帮助,也便于我明天考前再回顾一遍,冲冲冲! 基础 main函数参数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-phoOCsbA-163715955.

yjprolus的博客 1754
Dublinercc
博客等级 码龄4年 12粉丝 1原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值