集合知识点一 : List/Set接口实现类

java面试题45一共有哪些集合,set跟List的区别 摘要:集合是编程中存储一组元素的数据结构,主要分为有序可重复的List(如ArrayList、LinkedList)和无序不可重复的Set(如HashSet、TreeSet)。核心区别在于:List保留插入顺序,支持索引访问和重复元素;Set保证元素唯一性,不维护顺序(除LinkedHashSet/TreeSet),依赖hashCode()和equals()判断相等性。List适用于需要顺序和重复的场景(如购物车),Set适用于去重和快速查找(如用户ID集合)。此外,Queue/Deque和Map(键值对) 阅读详情

集合

长度可以实现自动扩容和截断,如果不指定泛型可以保存任何类型数据,默认放进去的是Object类型数据,可以保存对象,自身提供了一些列操作对象的方法

集合包括单列集合和双列集合,二者分别对应Collection接口和Map接口,且这两个接口都实现了同一个父接口Iterator

单列接口 Collection

单列接口结构图

List接口的实现类

支持索引,有序,插入和取出有序
允许重复元素
继承了Collection接口中的所有方法,并且多了一些特有方法

List接口的实现类ArrayList — 大数据量下适合查找,不适合添加删除

底层是一个Object类型的可变数组,支持null在内的所有元素,有序,非同步(线程不安全)

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}

  • ArrayList继承了AbstractList抽象类,拥有了相关的添加删除修改遍历等功能
  • ArrayList实现了List,List底层使用数组保存元素,所以其基本都是对数组进行操作
  • ArrayList实现了RandomAccess接口,即提供了快速随机访问功能,可通过元素的序号快速访问所要找的元素对象
  • ArrayList实现了Cloneable接口,能被克隆
  • ArrayList实现了java.io.Serializable接口,所以ArrayList支持序列化

在创建ArrayList集合时,有三种构造方法:

  • 无参构造 默认初始化容量为10(jdk 1.8 后 为0)
  • 有参构造 参数为int型数字, 集合默认长度为指定长度
  • 有参构造 参数为Object类型,定义集合保存数据类型

add()方法
每次添加元素时,都会判断当前数组是否需要扩容,即当前元素个数是否大于数组长度,需要扩容调用grow()方法,计算新的数组长度,以1.5倍扩容,再调用copyof()方法进行拷贝扩容,方法内会声明一个新数组,将旧数组的数据复制到新数组中,并将索引赋给新数组
remove()方法
remove方法会让所删元素以后的所有元素前移一位,并把最后一位置空,方便GC

ArrayList实现了fast-fail机制,即快速失败机制,通过对modcount判断是否有其他线程修改了当前ArrayList
如果大家没听过快速失败机制,应当是没有遇到过ConcurrentModificationException这个异常,下面大概解释一下,在多线程的环境下,当线程A对ArrayList进行修改时,每修改一次,参数nodcount就会+1。当修改完成后,进行数据迭代遍历时,在迭代器初始化或者过程中,会将modcount赋给迭代器的expectedModCount。此时线程B完成了对同一ArrayList的修改,modcount+1,此时的modcount和expectedModCount数值不相等,所以在遍历ArrayList时,迭代器内部会对modcount和expectedModCount数值进行判断二者是否相等,不相等说明数据被修改,此时的数据不是最新的,直接会抛出ConcurrentModificationException这个异常

那么在高并发情况下,需要用到ArrayList类型保存数据,但是又不能总抛异常吧,这个时候直接加锁是没有用的,那用什么呢???可以用这个CopyOnWriteArrayList

CopyOnWriteArrayList —采用写时复制,实现读写分离,且线程安全

CopyOnWriteArrayList 底层也是一个Object[]数组,和ArrayList基本一致,允许所有类型的值包括null

仅有一个构造,创建一个初始长度为0的数组,每添加一个元素数组长度+1

CopyOnWriteArrayList 为什么会线程安全呢?
原因是:CopyOnWriteArrayList 的每次增删改操作都会声明一个新数组,将旧数组copyof()到新数组中,再将旧数组的索引赋给新数组
CopyOnWriteArrayList 除了读操作,其他操作都有加锁和释放锁的过程,这就保证了在高并发的状态下数据的安全性,但是也造成了CopyOnWriteArrayList 只能保证数据的最终一致性,不能保证数据的实时一致性。即当一个线程在修改数据时,其他线程读到的是旧数据的值,出现脏读
CopyOnWriteArrayList适合读多写少的数据,且因为采用写时复制技术,所以对内存占用大,在实际应用中如果数据量大的情况,我们可以用ConcurrentHashMap来代替

方法时间复杂度备注
get()O(1)直接查找下标元素
add()O(1)直接插入到数组最后
add(index,E)O(n)插入点后所有元素后移
remove()O(n)删除点后所有元素前移
List接口实现类LinkedList —大数据量下适合增删不适合查找

底层是一个双向链表,LinkedList中维护了两个属性,first和last(头结点和尾节点),每个节点Node又维护了prev、item、next三个属性,prve指向前一个节点,last指向后一个节点,item为当前节点保存的数据
有序,支持null在内的所有元素,基于链表的非同步实现
LinkedList结构图

public class LinkedList<E>
     extends AbstractSequentialList<E>
     implements List<E>, Deque<E>, Cloneable, java.io.Serializable
  • LinkedList实现了Deque接口,这是其链表结构的基础
  • 其他的就不在赘述了

创建LinkedList时,有两种构造:

  • 无参构造 声明一个空链表( 闭环链表 )
  • 有参构造 参数为Object,定义链表数据类型

addAll(int index,collection<? Extends E> e)方法:
addAll()方法最后也会调用该有参方法。本方法先判断插入的位置是否合法,在将集合转换为数组,插入数组
remove方法 取出prev和last对前后节点的指向

Linkedlist查找采用的是 类二分查找,先判断用index与链表长度size/2比较,确定在链表的那个部分,然后再去对应的部分查找,这样最多遍历半个集合就可找到,但是只会从头结点正序遍历或尾节点倒序遍历,所以查找元素越靠近链表的size中间点,效率越低,实际这个效率是很低的

说一个我以前查到的小知识(实在不好意思,时间太久,出处想不起来了):
Linkedlist底层在遍历时,会先将Linkedlist转化为数组而不是直接用集合遍历,其实二者的遍历效果是一样的,为什么要转换再遍历呢?

  1. 如果直接遍历集合的话,那么在遍历过程中需要插入元素,在堆上分配内存空间,修改指针域,这个过程中就会一直占用着这个集合,考虑正确同步的话,其他线程只能一直等待。
  2. 如果转化为数组,只需要遍历集合,而遍历集合过程中不需要额外的操作,所以占用的时间相对是较短的,这样就利于其他线程尽快的使用这个集合。说白了,就是有利于提高多线程访问该集合的效率,尽可能短时间的阻塞。
方法时间复杂度备注
get()O(n)经最多一次遍历找到
add()O(1)直接插入到链表最后
add(index,E)O(n)查找到所插入位置,进行指针指向更改操作
remove()O(1)直接指针指向更改操作
List接口实现类Vector

大致与ArrayList一样,扩容倍数为2,是同步的

ArrayList与Vector对比

ArrayListVector
底层结构可变数组Object可变数组
出现版本1.21.0
同步不同步同步
效率高低
扩容倍数1.52.0

ArrayList与Linkedlist对比

ArrayListLinkedlist
底层结构可变数组Object双向链表
出现版本1.21.2
同步不同步不同步
增删效率低高
改查效率高 random-access低 类二分查找

对于随机访问的两个方法get和set,ArrayList效率高于linkedlist,因为linkedlist需要移动指针
对于增删的两个方法,add和remove,linkedlist效率高,因为ArrayList需要移动元素

Set接口实现类

无序,插入和取出没有顺序,没有索引
不允许重复元素,所以最多包含一个null

如果实现类是Hashset和LinkedHashset要求元素类型必须实现hashcode和equals方法
如果实现类是Treeset要求元素类型必须实现compareable接口并实现compareTo方法或者在Treeset构造器中加入comparaor实现类对象,并实现compare方法

Set接口实现类Hashset

底层结构维护了一个Hashmap,即底层和Hashmap一样是一个哈希表结构
有关Hashmap相关知识可以点击这里

	public class HashSet<E>  
	    extends AbstractSet<E>  
	    implements Set<E>, Cloneable, java.io.Serializable 

Hashset是如何过滤重复项的:通过hashcode和equals方法确定
首先,通过hashcode计算某元素值的索引值,如果在当前set中的索引处没有其他元素则直接添加,如果已有元素,则调用equals方法进行判断是否相等,直接覆盖
注意:待添加的元素需要重写hashcode和equals方法,所以判断等是根据自定义的方法进行的

Hashset底层是Hashmap,可是Hashmap是K-V结构,保存的是键值对,而Hashset保存的是值,这是为什么呢?
hashset底层的确是hashmap,且也是K-V结构,但是它的K值是对象的值,它的V是一个PRESENT常量的Object对象
hashset在去重时,是通过hashcode和equals方法实现的,所以hashset去重依靠的是hashcode进行K的比较,因为V都是PRESENT的Object常量所以无需比较,hashmap是依靠hashcode确定位置,equals进行值的比较

Hashset同样面临高并发问题,所以这里也可以引入

CopyOnWriteHashset 写时复制 读写分离

底层是一个Hashset,实质是一个hashmap,写时复制和读写分离具体理解可以参考CopyOnWriteArraylist,其他方法等均和Hashset无太大差别

Set接口的实现类Treeset

底层结构维护了一个Treemap,即底层和Treemap一样都是红黑树( 二叉树一种 ),可以实现对元素的自然排序和定制排序。添加元素时,会先判断有无比较器,如果有会按照比较器的比较规则进行排序,如果没有按照元素本身的比较性进行排序

public class TreeSet<E> extends AbstractSet<E>        
    implements NavigableSet<E>, Cloneable, java.io.Serializable{}

实现了NavigableSet接口,是Treeset实现排序的关键接口,NavigableSet是Sortedset的子接口

四个构造函数
无参 按照元素自然排序
有参 参数为collection类型 指定类型的自然排序set
有参 参数为comparator比较器 定制排序
有参 参数为sortedset

Hashset如何去重?
通过调用比较方法,将待添加元素和所有元素比较,返回值为0则为重复项

自然排序:
要求待添加元素实现compareable接口,并实现compareTo方法
定制排序:
待添加元素不用实现compareable接口,只要在hashset接口的构造器中传入comparator实现类对象(匿名内部类)即可,并实现compare方法

Set接口的实现类LinkedHashset

底层结构继承了hashset,底层使用一个linkedhashmap,即底层和linkedhashmap一样,是哈希表+双向链表构成,所以可以保证插入和取出顺序一致
Fast-Fail 实现了快速失败机制
不同步

Collection接口、List接口与Set接口 我们为什么需要Collection接口、List接口与Set接口? Collection接口 List接口 Set接口 ... 阅读详情

相关推荐

Java集合框架完全指南:从List到Map,一文掌握四大核心接口与常用实现类

如需完整代码或进一步探讨,欢迎在评论区留言或访问我的优快云博客!作为Java开发者,持续输出技术总结是提升能力的关键。无论你是初学Java的新手,还是希望巩固基础的中级开发者,本文都将成为你的集合类“速查手册”📚。2️⃣ 掌握ArrayList、LinkedList、HashSet等高频类的使用场景;四大接口,提供了灵活的数据存储方案。选择合适的实现类需综合考虑。3️⃣ 通过对比表格与代码注释,快速选择最优集合方案。掌握这些集合类的特性,是Java开发的基础技能。,获取更多Java学习和开发干货!

weixin_63215868的博客 868

十 Java集合框架(2):Set接口

文章目录Set接口和常用方法基本介绍set接口常用方法set接口的遍历方式Set实现类--HashSet基本介绍HashSet底层机制源码分析HashSet的add方法HashSet扩容机制代码实践Set实现类--LinkedHashSet基本介绍源码分析Set实现类--TreeSet 课程视频:https://www.bilibili.com/video/BV1YA411T76k?spm_id_from=333.999.0.0 Set接口和常用方法 基本介绍 无序(添加和取出的顺序不一致),没有索

Shane_Cheng0202的博客 1044

RDM协议控制端实战:从数据包构造到高效设备发现算法

本文深入探讨了RDM协议控制端的核心开发流程,涵盖从数据包构造、发送到响应解析的全过程。重点解析了如何利用二分搜寻算法高效实现网络设备发现,并分享了组包、解包中的关键代码实现与常见调试技巧,为舞台灯光与智能硬件领域的嵌入式开发提供实战指导。

week9的博客 457

Java之Set集合

Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。

qq_48313380的博客 4246

ESP32C6+ESP-IDF5.2实战:基于RS485的ModbusRTU从站开发与调试

本文详细介绍了基于ESP32C6和ESP-IDF5.2开发ModbusRTU从站的实战指南。涵盖硬件连接、协议实现、ESP-Modbus库移植、寄存器映射及调试技巧,帮助开发者快速构建稳定可靠的工业级RS485通信节点,并解决常见通信故障。

play7的博客 1188

RimWorld Mod开发避坑指南:从Defs命名规范到XML结构详解(附实战代码)

本文深入解析RimWorld Mod开发中Defs文件的编写规范与高级技巧,涵盖命名冲突预防、XML结构优化及高级功能实现。通过实战代码示例,帮助开发者避开常见陷阱,提升Mod兼容性与稳定性,特别适合RimWorld Mod开发者参考。

weixin_30790841的博客 451

Java集合详解(三)

Java集合详解(三) Iterator与ListIterator Iterator迭代器 迭代器的定义:public interface Iterator {} Iterator:是一个接口,它是集合的迭代器,集合可以通过Iterator遍历集合中的元素! 迭代器的方法: hasNext() :判断当前迭代器中是否有下一个可以遍历元素,如果存在,则返回true next() :返回迭代中的下一个元素 remove() : 从底层集合中删除此迭代器返回的最后一个元素 注 意:next()方法不能重复调用,如

weixin_45836302的博客 708

LLCC68芯片系统架构与LoRa驱动开发核心解析

LoRa射频收发器是低功耗广域物联网(LPWAN)的关键组件,其本质是集成了调制解调器、协议引擎、数据缓冲区与电源管理的专用SoC。理解其工作模式状态机(Sleep/Standby/TX/RX)与SPI主机接口时序规范,是实现稳定通信的基础。LLCC68通过寄存器映射与命令集双接口抽象硬件控制,支持LoRa扩频调制与FSK兼容模式,具备高链路预算(157 dB)和DC-DC/LDO动态电源切换能力。典型应用场景包括远距离传感器节点、智能表计与工业无线监测系统。本文深入剖析LLCC68的信号链路径、中断机制与

weixin_29859471的博客 283

List和Set

一、List和Set java中的集合包括三大类,它们是Set(集)、List(列表)、Map(映射)。它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList collection是最基本的集合接口,声明了适应于JAVA集合的通用方法,list和set都继承自collection接口。 二、List的功能方法 实际上有两种List:一种是基本的ArrayList,其优点在于随机访

m0_56769177的博客 1171

(四)DDR协议命令波形时序一——(ACT、Read、Write)

文章目录一、DDR命令真值表二、ACT激活命令时序要求2.1、ACTIVATE波形——tRRD、tFAW2.2、ACTIVATE波形——tRAS、tRC三、Read命令时序要求3.1、Read 波形——无Additive Latency3.2、Read 波形——有Additive Latency3.3、Read 波形——Additive Latency使用场景 一、DDR命令真值表 DDR的Command命令由CKE、CS#、RAS#、CAS#、WE#信号组成,这几个信号进行不同的搭配组合会形成不同的Co

Mr.翟的博客 6868

【51单片机仿真】基于51单片机设计的多功能电子时钟日历(实时时钟闹钟秒表温度检测)系统__资料编号5

该项目是基于单片机的多功能电子时钟系统,集成了时间显示、闹钟设置、秒表功能以及温度显示等功能。主要硬件包括1602液晶显示屏、DS1302时钟芯片、DS18B20温度传感器和蜂鸣器。系统通过按键进行时间和闹钟的设置,并实时显示当前时间和温度。

嵌入式阿齐Archie 2万+

Java2EE练习及面试题_chapter11Java集合_上

Java2EE练习及面试题_chapter11Java集合_上

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 769

28_Spring AI 干货笔记之 OpenAI 聊天功能

本文详细介绍了在Spring AI框架中集成OpenAI聊天模型的方法。内容涵盖API密钥配置、通过starter依赖启用自动配置、连接与模型参数的详细设置,并重点说明了运行时选项的动态覆盖机制。文章还深入讲解了多模态处理(图像与音频)、结构化输出、函数调用等高级功能,提供了示例控制器和手动配置指南,并讨论了与OpenAI兼容服务器的适配与推理模型思维链的获取。

在科技的浪潮中,我们寻找着创新的火种,在代码的海洋里,我们编织着智慧的网。腾飞开源,就是这样一个由技术精英汇聚而成的博客平台,我们致力于分享在Java、Python、IoT和人工智能等领域的最新研究成果和实战经验。 在腾飞开源的博客上,你会看到紧跟技术前 1656

Java集合类中的List、Set和Map及其实现类的详细介绍

本文主要介绍了Java集合类中的List、Set和Map及其实现类的概念和特点,并在最后对实现类是否可以为null值做了总结

青灯文案的博客 2069

栅极驱动电路设计(一)

SiC驱动电路设计需满足更高标准,重点包括:驱动电压需18~20V开通、-3~-5V关断;栅极电阻优选5~10Ω以平衡开关性能与可靠性;必须集成欠压保护(阈值11~15V)和快速短路保护。多电平驱动控制通过动态调节栅压和驱动强度优化性能,如前期弱驱动抑制振荡,后期强驱动降低损耗。以NCE120ED65VTP4为例,栅压从18V提升至20V可使导通损耗降低15%。相比传统方案,有源驱动(含数字分段和模拟闭环控制)能更灵活地提升开关速度与效率。

嵌入式老牛的博客 450

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

浅谈集合List,Set以及Map集合的特点及区别

集合List Set以及Map的区别 要想了解三者的区别,我们想来看看java的集合框架图 接着就需要从它们各自的特点来说 1.List的主要特点及用法 1.1 可以允许存储重复的对象 1.2 可以插入多个null元素 1.3 是一个有序容器,保持了每一个元素的插入顺序,插入的顺序即输出的顺序 1.4 常用的实现类有 ArrayList、LinkedList 和 Vector。A...

qq_42894060的博客 8969

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java集合框架学习笔记:List和Set的实现类

在Java中,集合框架提供了处理对象数组的基本结构。Collection是Java集合框架的根接口,而List和Set是两个最常用的子接口。每个接口都有多个不同的实现类,这些类在功能、性能使用以及场景方面存在显着的差异。

2302_77756558的博客 953

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

List与set集合,Map集合的区别以及它们的实现类有哪些?

List 是可重复集合,Set 是不可重复集合,这两个接口都实现了 Collection 父接口。 Map 未继承 Collection,而是独立的接口,Map 是一种把键对象和值对象进行映射的集合,它的每一个元素都包含了一对键对象和值对象,Map 中存储的数据是没有顺序的, 其 key 是不能重复的,它的值是可以有重复的。 List 的实现类有 ArrayList,Vector 和 Link...

休憩小屋 3423

Java集合框架详解:List、Set、Map及其实现类的使用与特性 第一章

以上概述展示了Java集合框架的层次结构、核心接口特性以及通用功能,这些特性共同构成了一个强大且易用的工具箱,助力开发者高效、安全地处理对象集合。

m0_61635718的博客 1690

Java集合框架详解:List、Set、Map及其实现类的使用与特性 第二章

List接口是Java集合框架中一个重要的接口,继承自Collection接口,它代表一个有序的元素序列,允许重复元素。

m0_61635718的博客 1090

java中的集合框架(Set、List、Map)及其实现类

Java中集合框架包括Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现 集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为集合框架。 程序员在具体应用的时候,不必考虑数据结构和算法实现细节,只需要用这些类创建一些对象,然后直接应用就可以了,这...

Java开发,人工智能,边缘计算,致力于掌握前沿技术 2877

集合之List / Set /Map

List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口 Set下有HashSet,LinkedHashSet,TreeSet List下有ArrayList,Vector,LinkedList Map下有Hashtable,LinkedHashMap,HashMap,TreeMap 在map中还有一个所谓的并发容器Concur...

编程人生 4397

java学习笔记(十三):Collection集合、List集合、List集合的实现类、泛型、Set集合、TreeSet集合、Map集合、HashMap集合、TreeMap集合

Collection集合概述是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现创建Collection集合的对象多态的方式具体的实现类ArrayListCollection集合常用方法方法名说明添加元素从集合中移除指定的元素根据条件进行移除清空集合中的元素判断集合中是否存在指定的元素判断集合是否为空int size()集合的长度,也就是集合中元素的个数。

weixin_62764364的博客 1209

JAVA集合类:List、Queue、Set、Map

Collection接口用于存储一组独立的元素,可以是列表、集合或队列。Map接口用于存储键值对,可以快速通过键来存取值。选择使用Collection还是Map取决于你要解决的问题类型。Java集合框架非常灵活,提供了丰富的接口和实现类,以满足不同的数据结构和算法需求。

记录一些刷过的题并分享学习心得 1448

【Java】实验一 Java中List接口、Set接口及实现类

Java实验一 Java中List接口、Set接口及实现类 (1)定义一个Student类,该类包括姓名和年龄两个成员变量,定义一个带有姓名和年龄两个参数的构造方法,重写Object类的toString()方法,其返回值为姓名及年龄字符串;(2)定义一个测试类StudentDemo在该类中创建ArrayList集合对象,在集合对象中添加5个学生类Student的

naogua_wyy的博客 650

Java中的集合框架,包括List、Set、Map等接口及其实现类

Java中的集合框架(Java Collections Framework)是一个用于表示和操作集合的统一架构。下面我将解释List、Set、Map这三个主要的接口及其常见的实现类。在使用这些集合时,你需要根据具体的需求来选择最合适的实现类。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。Set不保证元素的顺序(某些Set实现类,如LinkedHashSet,会按照元素插入的顺序来迭代)。Map接口将键映射到值。Java中的集合框架,包括List、Set、Map等接口及其实现类。

wssc63262的博客 892
上一篇: Java Swing--编写java应用界面-JFrame
下一篇: 集合知识点二:Map接口实现类
Amos_Object
博客等级 码龄8年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值