JDK源码分析——Java.util.Vector的浅析

用友T3提示,年度[UFDATA_002_2017]并不存在,导致无法备份迁移。 用友T3提示,年度[UFDATA_002_2017]并不存在,导致无法备份迁移。现在都win11了某个年度账套不存在怎么办? 阅读详情

首先我们来看JDK源码中Java.util.Vector的代码,剔除所有的方法和静态变量,

Java.lang.Vector的核心代码如下:

[java]  view plain copy
  1. public class Vector<E>  
  2.     extends AbstractList<E>  
  3.     implements List<E>, RandomAccess, Cloneable, java.io.Serializable  
  4. {  
  5.      
  6.     protected Object[] elementData;  
  7.   
  8.     /** 
  9.      * The number of valid components in this {@code Vector} object. 
  10.      * Components {@code elementData[0]} through 
  11.      * {@code elementData[elementCount-1]} are the actual items. 
  12.      * 
  13.      * @serial 
  14.      */  
  15.     protected int elementCount;  
  16.   
  17.     protected int capacityIncrement; //可以设定固定增量  
  18. }  

通过上面的代码我们能看到他是数组存储。

它的构造方法有四个:

[java]  view plain copy
  1. /** 
  2.     * Constructs an empty vector with the specified initial capacity and 
  3.     * capacity increment. 
  4.     * 
  5.     * @param   initialCapacity     the initial capacity of the vector 
  6.     * @param   capacityIncrement   the amount by which the capacity is 
  7.     *                              increased when the vector overflows 
  8.     * @throws IllegalArgumentException if the specified initial capacity 
  9.     *         is negative 
  10.     */  
  11.    public Vector(int initialCapacity, int capacityIncrement) {   //设置初始容量,及固定增量  
  12. super();  
  13.        if (initialCapacity < 0)  
  14.            throw new IllegalArgumentException("Illegal Capacity: "+  
  15.                                               initialCapacity);  
  16. this.elementData = new Object[initialCapacity];  
  17. this.capacityIncrement = capacityIncrement;  
  18.    }  
  19.   
  20.    /** 
  21.     * Constructs an empty vector with the specified initial capacity and 
  22.     * with its capacity increment equal to zero. 
  23.     * 
  24.     * @param   initialCapacity   the initial capacity of the vector 
  25.     * @throws IllegalArgumentException if the specified initial capacity 
  26.     *         is negative 
  27.     */  
  28.    public Vector(int initialCapacity) {    //设置初始容量,不设定固定增量(如果不设定固定增量,则成倍增长)  
  29. this(initialCapacity, 0);  
  30.    }  
  31.   
  32.    /** 
  33.     * Constructs an empty vector so that its internal data array 
  34.     * has size {@code 10} and its standard capacity increment is 
  35.     * zero. 
  36.     */  
  37.    public Vector() {    //不设置初始容量,初始容量为10,不设定固定增量(如果不设定固定增量,则成倍增长)  
  38. this(10);  
  39.    }  
  40.   
  41.    /** 
  42.     * Constructs a vector containing the elements of the specified 
  43.     * collection, in the order they are returned by the collection's 
  44.     * iterator. 
  45.     * 
  46.     * @param c the collection whose elements are to be placed into this 
  47.     *       vector 
  48.     * @throws NullPointerException if the specified collection is null 
  49.     * @since   1.2 
  50.     */  
  51.    public Vector(Collection<? extends E> c) {  //以集合初始化  
  52. elementData = c.toArray();  
  53. elementCount = elementData.length;  
  54. // c.toArray might (incorrectly) not return Object[] (see 6260652)  
  55. if (elementData.getClass() != Object[].class)  
  56.     elementData = Arrays.copyOf(elementData, elementCount, Object[].class);  
  57.    }  

下面我们再看一下  Vector类的 add(E e)方法的源代码:

[java]  view plain copy
  1.   /** 
  2.     * Appends the specified element to the end of this Vector. 
  3.     * 
  4.     * @param e element to be appended to this Vector 
  5.     * @return {@code true} (as specified by {@link Collection#add}) 
  6.     * @since 1.2 
  7.     */  
  8.    public synchronized boolean add(E e) {    //从这里的synchronized我们可以知道他是线程同步的  
  9. modCount++;  
  10. ensureCapacityHelper(elementCount + 1);   //是否需要扩容  
  11. elementData[elementCount++] = e;   //后放的永远在最后一位  
  12.        return true;   // 好像他永远返回true 哦  
  13.    }  

[java]  view plain copy
  1.    /** 
  2.     * This implements the unsynchronized semantics of ensureCapacity. 
  3.     * Synchronized methods in this class can internally call this 
  4.     * method for ensuring capacity without incurring the cost of an 
  5.     * extra synchronization. 
  6.     * 
  7.     * @see #ensureCapacity(int) 
  8.     */  
  9.    private void ensureCapacityHelper(int minCapacity) {  
  10. int oldCapacity = elementData.length;  
  11. if (minCapacity > oldCapacity) {    //最新的值如果超出现有容量 扩容  
  12.     Object[] oldData = elementData;  
  13.     int newCapacity = (capacityIncrement > 0) ?  
  14.     (oldCapacity + capacityIncrement) : (oldCapacity * 2);  //如果固定增量不为0则增长固定增量,否则成倍增长  
  15.   
  16.         if (newCapacity < minCapacity) {   //新容量还小,这个可能性应该不大  
  17.     newCapacity = minCapacity;  
  18.     }  
  19.            elementData = Arrays.copyOf(elementData, newCapacity);   // 改变数组的大小,这个方法可以记一下  
  20. }  
  21.    }  

下面我们再看一下  Vector类的 remove(Object o)方法的源代码:

[java]  view plain copy
  1. /** 
  2.     * Removes the first occurrence of the specified element in this Vector 
  3.     * If the Vector does not contain the element, it is unchanged.  More 
  4.     * formally, removes the element with the lowest index i such that 
  5.     * {@code (o==null ? get(i)==null : o.equals(get(i)))} (if such 
  6.     * an element exists). 
  7.     * 
  8.     * @param o element to be removed from this Vector, if present 
  9.     * @return true if the Vector contained the specified element 
  10.     * @since 1.2 
  11.     */  
  12.    public boolean remove(Object o) {  
  13.        return removeElement(o);      //他是调用的removeElement  
  14.    }  
  15.    
  16. /** 
  17.     * Removes the first (lowest-indexed) occurrence of the argument 
  18.     * from this vector. If the object is found in this vector, each 
  19.     * component in the vector with an index greater or equal to the 
  20.     * object's index is shifted downward to have an index one smaller 
  21.     * than the value it had previously. 
  22.     * 
  23.     * <p>This method is identical in functionality to the 
  24.     * {@link #remove(Object)} method (which is part of the 
  25.     * {@link List} interface). 
  26.     * 
  27.     * @param   obj   the component to be removed 
  28.     * @return  {@code true} if the argument was a component of this 
  29.     *          vector; {@code false} otherwise. 
  30.     */  
  31.    public synchronized boolean removeElement(Object obj) {  
  32. modCount++;  
  33. int i = indexOf(obj);         //查找obj第一次出现的位置,(Vector是允许重复值的)  
  34. if (i >= 0) {  
  35.     removeElementAt(i);          
  36.     return true;  
  37. }  
  38. return false;  
  39.    }  
  40.   
  41. /** 
  42.     * Deletes the component at the specified index. Each component in 
  43.     * this vector with an index greater or equal to the specified 
  44.     * {@code index} is shifted downward to have an index one 
  45.     * smaller than the value it had previously. The size of this vector 
  46.     * is decreased by {@code 1}. 
  47.     * 
  48.     * <p>The index must be a value greater than or equal to {@code 0} 
  49.     * and less than the current size of the vector.  
  50.     * 
  51.     * <p>This method is identical in functionality to the {@link #remove(int)} 
  52.     * method (which is part of the {@link List} interface).  Note that the 
  53.     * {@code remove} method returns the old value that was stored at the 
  54.     * specified position. 
  55.     * 
  56.     * @param      index   the index of the object to remove 
  57.     * @throws ArrayIndexOutOfBoundsException if the index is out of range 
  58.     *          ({@code index < 0 || index >= size()}) 
  59.     */  
  60.    public synchronized void removeElementAt(int index) {  
  61. modCount++;  
  62. if (index >= elementCount) {  
  63.     throw new ArrayIndexOutOfBoundsException(index + " >= " +  
  64.                          elementCount);  
  65. }  
  66. else if (index < 0) {  
  67.     throw new ArrayIndexOutOfBoundsException(index);  
  68. }  
  69. int j = elementCount - index - 1;  // 数组中index以后的元素个数  
  70. if (j > 0) {  
  71.     System.arraycopy(elementData, index + 1, elementData, index, j);   // 数组中index以后的元素,整体前移,(这个方法挺有用的!!)  
  72. }  
  73. elementCount--;  
  74. elementData[elementCount] = null; /* to let gc do its work */  
  75.    }  

从上面的代码我们可以看出 Vector每次只删除最靠前的那个相符的变量。

下面我们再看一下 Vector类的 equals(Object o)方法的源代码:

[java]  view plain copy
  1.    /** 
  2.     * Compares the specified Object with this Vector for equality.  Returns 
  3.     * true if and only if the specified Object is also a List, both Lists 
  4.     * have the same size, and all corresponding pairs of elements in the two 
  5.     * Lists are <em>equal</em>.  (Two elements {@code e1} and 
  6.     * {@code e2} are <em>equal</em> if {@code (e1==null ? e2==null : 
  7.     * e1.equals(e2))}.)  In other words, two Lists are defined to be 
  8.     * equal if they contain the same elements in the same order. 
  9.     * 
  10.     * @param o the Object to be compared for equality with this Vector 
  11.     * @return true if the specified Object is equal to this Vector 
  12.     */  
  13.    public synchronized boolean equals(Object o) {  
  14.        return super.equals(o);   //他是调用的父类AbstractList的equals  
  15.    }  
  16.   
  17.   
  18.    /** 
  19.     * Compares the specified object with this list for equality.  Returns 
  20.     * {@code true} if and only if the specified object is also a list, both 
  21.     * lists have the same size, and all corresponding pairs of elements in 
  22.     * the two lists are <i>equal</i>.  (Two elements {@code e1} and 
  23.     * {@code e2} are <i>equal</i> if {@code (e1==null ? e2==null : 
  24.     * e1.equals(e2))}.)  In other words, two lists are defined to be 
  25.     * equal if they contain the same elements in the same order.<p> 
  26.     * 
  27.     * This implementation first checks if the specified object is this 
  28.     * list. If so, it returns {@code true}; if not, it checks if the 
  29.     * specified object is a list. If not, it returns {@code false}; if so, 
  30.     * it iterates over both lists, comparing corresponding pairs of elements. 
  31.     * If any comparison returns {@code false}, this method returns 
  32.     * {@code false}.  If either iterator runs out of elements before the 
  33.     * other it returns {@code false} (as the lists are of unequal length); 
  34.     * otherwise it returns {@code true} when the iterations complete. 
  35.     * 
  36.     * @param o the object to be compared for equality with this list 
  37.     * @return {@code true} if the specified object is equal to this list 
  38.     */  
  39.    public boolean equals(Object o) {  
  40. if (o == this)  
  41.     return true;  
  42. if (!(o instanceof List))  
  43.     return false;  
  44.   
  45. ListIterator<E> e1 = listIterator();  
  46. ListIterator e2 = ((List) o).listIterator();  
  47. while(e1.hasNext() && e2.hasNext()) {  
  48.     E o1 = e1.next();  
  49.     Object o2 = e2.next();  
  50.     if (!(o1==null ? o2==null : o1.equals(o2)))   //判断了三次  
  51.                  //这个方法挺不错的,应该比if(!(null==o1&&null==o2)||(null!=o1&&o1.equals(o2)))(大于等于三次判断)  
  52.     return false;  
  53. }  
  54. return !(e1.hasNext() || e2.hasNext());  //长度是否一致  
  55.    }  

下面我们再看一下  Vector类的 hashCode()方法的源代码:

[java]  view plain copy
  1.     /** 
  2.      * Returns the hash code value for this Vector. 
  3.      */  
  4.     public synchronized int hashCode() {  
  5.         return super.hashCode();   //他也是调用的父类AbstractList的hashCode  
  6.     }  
  7.   
  8. /** 
  9.      * Returns the hash code value for this list. 
  10.      * 
  11.      * <p>This implementation uses exactly the code that is used to define the 
  12.      * list hash function in the documentation for the {@link List#hashCode} 
  13.      * method. 
  14.      * 
  15.      * @return the hash code value for this list 
  16.      */  
  17.     public int hashCode() {  
  18.     int hashCode = 1;  
  19.     Iterator<E> i = iterator();  
  20.     while (i.hasNext()) {  
  21.         E obj = i.next();  
  22.         hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());  
  23.            // 在这里用obj,比用i.next()效率高一倍(一直没明白他这为什么用31)  
  24.     }  
  25.     return hashCode;  
  26.     }  

verilog实现步进电机脉冲分配器(三相六拍)基于Nexys4DDR开发板 使用Verilog HDL设计的一个能够自启动、具有正反转功能的三相六拍步进电机脉冲分配器。已经写好Nexy4DDR的管脚约束文件 可以通过Nexys4DDR开发板的PMOD接口连接步进电机进行调试。 使用verilog语言 在vivado2018.2下运行编译下载都正确,(也可在ISE,QuartusII下使用)下面是工程截图: ... 阅读详情

相关推荐

[工具使用]黑暗引擎FOFA

黑暗引擎FOFAFOFA(点我进入)逻辑运算符搜索子域名domain搜索指定内容的host全部域名bodycert搜索选定应用的网站搜索指定开放端口的IP搜索指定协议的IP搜索IP或者网段的信息搜索指定CSS/JS网站常用的一些内容其他 FOFA(点我进入) 官网这样描述:FOFA是白帽汇推出的一款网络空间资产搜索引擎。它能够帮助用户迅速进行网络资产匹配、加快后续工作进程。例如进行漏洞影响范围分析、应用分布统计、应用流行度排名统计等。 简单理解就是,一个本土加强版shodan,知道某产品在互联网的部署情况、

网络安全知识分享 3万+

Cannot construct instance of `java.util.ArrayList` (although at least one Creator exists): no String

although at least one Creator exists

m0_37731701的博客 9403

【DAY11】超参数调整专题1

核心优势: 它不是随机选择下一个点,而是根据先前评估的结果建立一个概率模型(通常是高斯过程),预测哪些参数组合可能产生更好的结果,并据此选择下一个评估点。这使得它在寻找最优解方面通常比随机搜索更高效(用更少的迭代次数达到相似或更好的性能),特别是当模型训练(单次评估)非常耗时的时候。实际上,有着非常多的方式可以实现贝叶斯优化,上面的代码比较简洁美观,贝叶斯优化和网格搜索的代码书写风格高度一致。- 需要定义参数的搜索空间,与随机搜索类似,当搜索空间非常大时,它通常比网格搜索和随机搜索更有效。

daomingwu1的博客 747

Cannot construct instance of `java.util.ArrayList` 报错 String value (‘‘);

因为fastjson 在json解析的的时候 无法将''转换成jsonarray。

dfengleicsdn的博客 6631

别再为电路自激发愁了:手把手教你用吸波材料搞定微波腔体谐振(附HFSS仿真设置)

本文详细解析了微波腔体谐振问题的工程解决方案,重点介绍了吸波材料的选型、安装工艺及HFSS仿真设置。通过实际案例和计算工具,帮助射频工程师有效抑制腔体自激,提升系统稳定性。特别适用于35GHz毫米波雷达等高频电路设计场景。

weixin_42662293的博客 383

Starlink卫星动力学系统仿真建模前传1-时空系统介绍

对于在轨道上运动的航天器由于速度接近第一宇宙速度,为了获取准确的位置信息对时间的精度要求极高,为了准确描述航天器的运动规律,本节对卫星仿真建模中用到的各种时间系统进行介绍。卫星轨道平面为坐标平面,坐标原点位于卫星系统质心,轴由卫星系统质心指向地心(当地垂线),轴在轨道面内垂直于轴并指向卫星的前进方向,轴同、轴构成右手系,指向轨道面负法线方向。不同坐标系下的建立的运动形式与复杂程度不同,会直接影响运动方程的求解繁简程度,因此,选取适当的坐标系具有重要的意义。定义星体坐标系,该坐标系简记为系,与卫星本体固连。

xspace的博客 1433

Java&OOP基础知识英语选择题6——Array, Vector, ArrayList

Array, Vector, ArrayList

qq_62350811的博客 846

谷粒商城学习笔记-15-数据库初始化

这一节的主要内容是把创建对应的数据库和数据库表。

epitomizelu的专栏 1438

No serializer found for class解决方法

今天在新建项目的时候,测试springboot项目是否搭好,接口是否可以访问的时候,报了一个错误: No serializer found for class com.lin.pojo.TestVo.TextVo and no properties discovered to create BeanSerializer

weixin_45066871的博客 3万+

Qt实现YOLO目标检测及其界面制作(附完整源码)

Qt实现YOLO目标检测及其界面制作(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2739

Python爬虫实战:全网政府招标信息采集与整合

本文详细介绍了如何使用Python构建一个完整的政府招标信息爬虫系统,涵盖了从数据采集、解析、存储到质量监控的全流程。多源采集:支持多个地方政府网站的同时采集智能解析:自动适应不同网站结构,智能提取关键信息异步高效:使用异步编程提高采集效率反爬应对:内置多种反爬虫应对策略数据质量:完善的数据清洗和质量监控机制易于扩展:模块化设计,便于添加新的数据源。

2201_76125261的博客 1380

Redis反序列化错误Could not read JSON: Cannot construct instance of `java.util.ArrayList$SubList`

Redis反序列化错误 最近使用Redis做缓存,用着好好的,返现有一个方法的在从Redis获取缓存时报错,无法正常获取到缓存,从报错信息看,是不能发序列化。在这里记录一下解决方法。 直接贴上错误: Could not read JSON: Cannot construct instance of java.util.ArrayList$SubList(no Creators, like defa...

theonesmx的博客 5635

170、电机控制中的温升测试

本文以一次IGBT炸管事故为切入点,深入剖析电机控制中温升测试的实质:不仅是温度测量,更是对铜损、铁损、散热效率等热管理问题的系统验证。作者强调测试前热电偶布置、环境记录、预运行的重要性,提出实时监控电流谐波、绕组电阻、散热梯度等关键参数,并通过损耗分离与冷却系统实测,揭示真实热源。结合温升曲线异常分析与经验建议,强调留余量、仿真结合实测、关注瞬态工况等实践要点,警示温升测试是保障可靠性与安全性的核心环节。

2401_88858637的博客 47

jdk1.8 java.util.Vector源码分析:

jdk1.8 java.util.Vector源码分析: 底层数据结构是数组,查询快,增删慢 线程安全synchronized,效率低 底层数组的扩容规则:当前容量 + 增量 public class Vector<E>{ protected Object[] elementData; //底层使用数组来存储元素 protected int ...

淋雨西河的博客 251

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java.util源码_java.util.Collection源码分析和深度讲解

写在开头java.util.Collection 作为Java开发最常用的接口之一,我们经常使用,今天我带大家一起研究一下Collection接口,希望对大家以后的编程以及系统设计能有所帮助,本文所研究的jdk版本为jdk1.8.0_131明确一下几点:Collection是接口,其继承了Iterable接口Collection属于单值类型集合,重点子接口List接口和Set接口Java.util...

weixin_36294980的博客 287

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jdk1.8 java.util.ArrayList源码分析:

jdk1.8 java.util.ArrayList源码分析: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable{ int DEFAULT_CAPACITY = 10; Object[] EMPTY_ELE...

淋雨西河的博客 250

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JDK源码util包分析——Vector源码(13)

Vector源码分析 Vector的结构图 Vector的概述 Vector 是矢量队列,它是JDK1.0版本添加的类。继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。 Vector 继承了AbstractList,实现了List;所以,它是一个队列,支持相关的添加、删除、修改、遍历等功能。 Vector 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。

mao____mao的博客 414

JDK源码——Vector源码

同步容器(如Vector)并不是所有操作都线程安全! import java.util.Vector; /** * Copyright (C), 2018-2020 * FileName: Thread_vetcor * Author: xjl * Date: 2020/8/19 12:06 * Description: Vector线程安全 */ public class Thread_vetcor { private static Vector<Integ

庄小焱 520

java jdk8 源码解析之util包:list集合类源码分析

list集合作为一个有序的集合,能够使用户很好的掌握元素在列表中的位置,通过整数的索引就可以从列表中获取想要的数据。 1.Collection collection类是集合中就基本的接口,一个集合代表这一组对象,有些集合是有序的有些是无序的,jdk没有提供任何来自Collection接口的直接实现,它提供的是更多的子接口的实现例如list和set,所以这个接口是为了保证集合最大的通用性...

mxy88888的博客 555

java util包学习(5) Vector 源码分析

package java.util; public class Vector extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable { protected Object[] elementData; protected int ele

马里奥的专栏 910

【JDK源码阅读5-util】Collection-List---Vector

Vector实现类                                        public class Vector                                                                          extends AbstractList

noaman_wgs的博客 556

JDK 自带的观察者模式源码分析以及和自定义实现的取舍

前言 总的结论就是:不推荐使用JDK自带的观察者API,而是自定义实现,但是可以借鉴其好的思想。 java.util.Observer 接口源码分析 该接口十分简单,是各个观察者需要实现的接口 package java.util; public interface Observer { void update(Observable o, Object arg)...

diaoyanqin5061的博客 333

JDK源码util包分析——Stack源码(15)

Stack源码分析 Stack的结构图 Stack的概述 Stack是栈。它的特性是:先进后出(FILO, First In Last Out)。 java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表。当然,我们也可以将LinkedList当作栈来使用!我之前已经详细介绍过Vector的数据结构,这里就不再对Stack的数据结构进行说明了。 Stack的底层数据结构 因为是基于Vector实现,是Vector的

mao____mao的博客 857

java源码分析:深入探讨Iterator模式

java.util包中包含了一系列重要的集合类。本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的迭代模式的源码实现内幕。    下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应Iterator接口,并仔细研究迭代子模式的实现原理。   本文讨论的源代码版本是JDK 1.4.2,因为JDK 1.5在java.ut

Code-lover's Learning Notes 859

java classable_Java内置Observerable类的源码分析

package java.util;/** * This class represents an observable object, or "data"* in the model-view paradigm. It can be subclassed to represent an* object that the application wants to have observed.* * ...

weixin_33293848的博客 210

Java基础----集合(二)List接口

Collection子接口之:List接口 1. 概述 List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。 List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。 JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。 2. List接口框架 |----Collection接口:单列集合,用来存储一个一个的对象 |----List接口:存储有序的、可重复的数据。 -->“动

qq_28505705的博客 259
上一篇: 【struts2】ActionContext与ServletActionContext
下一篇: Hibernate源码分析
wankaiming
博客等级 码龄15年 49粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值