开发日常小结(31):数组array与列表ArrayList的遍历性能比较与分析

数据结构实战:从顺序查找到哈希表,高效查找算法全解析 查找是计算机科学中的基础操作,其核心目标是在数据集合中快速定位目标元素。从最基础的顺序查找(O(n)时间复杂度)到二分查找(O(log n)),算法效率随数据结构优化而提升。在动态数据场景下,二叉排序树(BST)及其平衡变种(如AVL树和红黑树)通过树形结构实现高效查找与动态更新,其中红黑树凭借近似平衡的特性,在工程实践中广泛应用于读写均衡的场景,如Java的TreeMap。面对海量数据,B树与B+树通过多路平衡和磁盘友好设计,极大减少了I/O操作,成为数据库索引的基石。而散列表(哈希表)则通过哈希函数实现 阅读详情

2018年10月03日

目录

测试结论

测试例子

性能分析

1)数组Array:

2)列表ArrayList:

2.1 构造函数

2.2 成员变量

2.3 add 方法(队列末尾插入一个元素 / 队列特定位置插入一个元素)

2.4 remove方法(删除指定位置的元素 / 删除某个元素)

2.5  get 方法


 

测试结论

Java两个常用的数据结构进行性能的比较,发现ArrayList和array还是相差较大的,数组的遍历时间远远小于ArrayList。

 

测试例子

import java.util.ArrayList;

public class testCompareArrayAndList {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		ArrayList<Integer> arrayList = new ArrayList<Integer>();
		//添加元素
		for(int i =0;i< 11999999;i++){
			arrayList.add(i);
		}		
		//list => array
		Integer[] array = arrayList.toArray(new Integer[arrayList.size()]);
		
		long currentTimeMillis1 = System.currentTimeMillis();
		for(Integer i :array){}
		long currentTimeMillis2 = System.currentTimeMillis();
		System.out.println("遍历数组耗费时间: "+(currentTimeMillis2 - currentTimeMillis1)+" ms");
		
		currentTimeMillis1 = System.currentTimeMillis();
		for(Integer i : arrayList){}
		currentTimeMillis2 = System.currentTimeMillis();
		System.out.println("遍历列表耗费时间: "+(currentTimeMillis2 - currentTimeMillis1)+" ms");

	}

}

console:

遍历数组耗费时间: 2 ms
遍历列表耗费时间: 39 ms

 

性能分析

1)数组Array:

参考文章:《java数组详解》

 

2)列表ArrayList:

2.1 构造函数

一、初始化设置容量

    /**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param  initialCapacity  the initial capacity of the list
     * @throws IllegalArgumentException if the specified initial capacity
     *         is negative
     */

    public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }

 

二、无参构造函数

 /**
     * Constructs an empty list with an initial capacity of ten.
     */

   public ArrayList() {
        super();
        this.elementData = EMPTY_ELEMENTDATA;
    }

 

三、初始化元素

    /**
     * Constructs a list containing the elements of the specified
     * collection, in the order they are returned by the collection's
     * iterator.
     *
     * @param c the collection whose elements are to be placed into this list
     * @throws NullPointerException if the specified collection is null
     */

   public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        size = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    }

 

2.2 成员变量

    private static final long serialVersionUID = 8683452581122892189L;

    /**
     * Default initial capacity.
     */
    private static final int DEFAULT_CAPACITY = 10;

    /**
     * Shared empty array instance used for empty instances.
     */
    private static final Object[] EMPTY_ELEMENTDATA = {};

    /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer. Any
     * empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to
     * DEFAULT_CAPACITY when the first element is added.
     */
    private transient Object[] elementData;

    /**
     * The size of the ArrayList (the number of elements it contains).
     *
     * @serial
     */
    private int size;

1)elementData : 内存实际保存元素是一个数组,即ArrayList是对数组的一个封装;

2)size:ArrayList的实际长度;

 

2.3 add 方法(队列末尾插入一个元素 / 队列特定位置插入一个元素)

    /**
     * Appends the specified element to the end of this list.
     *
     * @param e element to be appended to this list
     * @return <tt>true</tt> (as specified by {@link Collection#add})
     */

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

 

   /**
     * Inserts the specified element at the specified position in this
     * list. Shifts the element currently at that position (if any) and
     * any subsequent elements to the right (adds one to their indices).
     *
     * @param index index at which the specified element is to be inserted
     * @param element element to be inserted
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */

    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }

 

2.4 remove方法(删除指定位置的元素 / 删除某个元素)

   /**
     * Removes the element at the specified position in this list.
     * Shifts any subsequent elements to the left (subtracts one from their
     * indices).
     *
     * @param index the index of the element to be removed
     * @return the element that was removed from the list
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */

    public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

 

   /**
     * Removes the first occurrence of the specified element from this list,
     * if it is present.  If the list does not contain the element, it is
     * unchanged.  More formally, removes the element with the lowest index
     * <tt>i</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>
     * (if such an element exists).  Returns <tt>true</tt> if this list
     * contained the specified element (or equivalently, if this list
     * changed as a result of the call).
     *
     * @param o element to be removed from this list, if present
     * @return <tt>true</tt> if this list contained the specified element
     */

    public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }

 

2.5  get 方法


    @SuppressWarnings("unchecked")
    E elementData(int index) {
        return (E) elementData[index];
    }

    /**
     * Returns the element at the specified position in this list.
     *
     * @param  index index of the element to return
     * @return the element at the specified position in this list
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }

实际返回的是数组的某个元素。

 

以上是对源码的一些走读总结。

 

c#集合及常规用法 忽略大小写的 Dictionaryvar dict = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);// 输出 1// 自定义比较器public class PersonComparer : IEqualityComparer<Person>{ public bool Equals(Person x, Person y) => x?.Id == y?.Id;?0;// 覆盖最旧数据 else _count++; 阅读详情

相关推荐

Java零基础实战路线图:从环境配置到学生成绩系统

Java基础是掌握整个Java技术生态的根基,其核心在于理解语言本身如何定义数据、组织逻辑与管理内存。本文围绕Java开发环境搭建、命令行编译运行机制、基本语法与类型系统、面向对象设计原则及集合框架底层原理展开,强调通过可验证的小场景(如HelloWorld、Student类建模、成绩管理系统)建立真实编码手感。特别聚焦高频痛点——java环境变量配置错误、javac/java命令混淆、String常量池机制、ArrayList扩容策略等,以问题驱动方式还原JVM规范与OpenJDK源码中的设计逻辑,帮助初

aoanping0730的博客 415

数组详解

在平时开发中,经常选用ArrayList容器来存放序列,确很少用数组,容器中已经包装了非常多的实用方法。由于数组是一个简单的线性序列,使元素的访问非常快,数组较容器还是有优点的: 数组的访问效率比ArrayList高。 ArrayList的底层就是用数组实现的,如果new ArrayList()一个容器时没有指定一个容器的长度,那么默认容器初始化为10的长度,一旦向容器中放置的对象超过10个时...

u010502101的博客 711

直击高频编程考点:数组知识及经典算法题总结

数组基础、应用以及编程练习(找到数组 A 元素组成的小于 n的最大整数+两数之和 +三数之和 +最接近的三数之和+移动零 +旋转数组+搜索旋转排序数组 +寻找旋转排序数组中的最小值 +加一 +存在重复元素 +寻找数组的中心索引+翻转对 +只出现一次的数字+合并两个有序数组+合并区间+最大子序列+最长连续递增序列+最长公共前缀+移除元素+除自身以外数组乘积+颜色分类)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

数组和集合哪个效率高_Java 代码优化 数组和集合的效率, 几种for循环 使用JProfiler进行效率测试...

在做效率测试的时候,会发现,在代码里面不起眼的一个for循环,会损失掉不少时间。几种for循环要使用哪个,会效率高点,常用的集合一般都是arrayList,他的循环遍历的效率如何,是不是首选的呢?开局一张图然后看这个图的运行代码package com.lxk.commonTest; import com.lxk.util.CollectionUtil; import java.util.L...

weixin_39947521的博客 573

开源大模型推理GPU资源评估以及优化

随着大模型的火热很多项目中都使用到了开源大模型,这时候准确评估大模型的GPU资源非常重要,主要有下面几个方面:GPU是昂贵的资源。高估内存需求可能导致在硬件上的不必要支出,而低估则可能导致系统故障或性能下降。:适当的内存管理确保模型高效运行,能够更快地响应用户并处理更多并发请求。:随着需求的增长,理解内存需求对于在不牺牲性能或产生高昂成本的情况下扩展服务至关重要。尽管其重要性显而易见,但计算用于服务大型语言模型(LLM)的GPU内存并不简单。

优快云DN的博客 3116

群晖Web Station实战:从零搭建个人静态导航站

本文详细介绍了如何利用群晖NAS自带的Web Station套件,从零开始搭建个人静态导航站。通过安装Web Station、上传静态网站源码、配置网页服务与网络门户等步骤,无需代码基础即可实现内网访问。文章还分享了文件权限设置、个性化定制及常见问题排查等实用技巧,帮助用户高效管理个人常用网址,充分挖掘NAS的服务器潜能。

tea88的博客 1330

java数组比较 快速_Java中的数组或列表。哪个更快?

小编典典我写了一个基准测试来比较ArrayLists和Arrays。在我的老式笔记本电脑上,遍历5000个元素的数组列表的时间为1000次,比同等的数组代码慢大约10毫秒。所以,如果你在做什么,但迭代的列表,你做了很多,那么也许它的价值的最优化。否则,我会使用列表中,因为它会更容易,当你这样做需要优化的代码。我确实注意到使用for String s: stringsList它比使用老式的for循环...

weixin_42548752的博客 539

小程序 video 控制器外观调整_Kessil 360X Tuna Sun无线控制器使用分享

之前分享了Kessil 360X Tuna Sun开箱记录,时间关系,没来得及使用WiFi Dongle无线控制器。昨晚抽空实操了一下,做个操作记录,希望对大家有参考Kessil无线模块操作指南官方视频英文教程配中文字幕,非常详尽语速较快,重点位置可以暂停操作点击边框调出视频工具条1、拆包取控制器,保存二维码Kessil WiFi Dongle包装打开包装就能看到Kessil无线控制模...

weixin_39759060的博客 4733

数组和链表的顺序遍历的时间比较

数组和链表的顺序遍历的时间比较 结论:数组顺序遍历快于链表 原因:CPU每次取数据时都不是只取一个数据,而是将那连续的一块一起取, 而因为数组的地址空间是连续的,所以下几次要访问的元素也一起被 放入缓存中了,减少了对内存的访问(访问速度:缓存 快于 内存)。 由于链表的元素是离散的放在内存中的,所以遍历每个元素的都需要 对内存进行访问,导致顺序访问效率不如数组。 //采用vector<>和list<>来分别代表数组和链表 #include<bits/

qq_45843451的博客 2377

Matlab2018a崩溃解决的办法No sandbox or build area path

Matlab 2018a (No sandbox or build area path)出现崩溃后需要使用terminal进行如下操作: cd /home/david/MySoft/MATLAB/R2018a/bin/glnxa64 (你的matlab路径) mkdir exclude mv libfreetype* exclude/ 执行后图片如下: 如果你用的Windows系统,请手动按照上面步骤剔除了dll。 Matlab 2018a (No sandbox or build are

David Xiao 1万+

[金仓数据库V8R6]更换授权

上传授权,使用mv license_xxx_0.dat /home/kingbase/KingbaseES/license.dat替换每个授权,并使用ls -l license.dat确保替换前后属主和权限不变。根据步骤1的数据目录位置,执行/home/kingbase/KingbaseES/Server/bin/sys_ctl -D /home/kingbase/KingbaseES/data reload使新的授权文件生效。该参数意义为授权剩余有效天数,查询结果为新授权中有效期间的天数即为替换成功。

l04050924的博客 3707

数组和集合哪个效率高_集合框架(一)

1:集合的由来?数组的长度是固定的,当所添加的元素大于数组的长度时,需要对数组重新定义,太麻烦了,而java内部中提供的集合类能储存任意对象且长度是可变的,随着元素的长度的增减而增减。2:集合和数组的区别?区别一:数组既可以储存基本数据类型,也可以储存引用数据类型,区别在于基本数据类型储存的是值,引用数据类型储存的是地址值集合可以储存引用数据类型(对象),也可以储存基本数据类型,只不过在储存的时候...

weixin_39604478的博客 786

秋叶ComfyUI-v10中文整合包:全中文AI绘画一键部署与实战指南

Stable Diffusion作为当前主流的扩散模型,通过去噪过程从随机噪声生成高质量图像,其开源特性推动了AI绘画技术的普及。然而,其官方WebUI在自定义工作流和可复现性上存在局限,而基于节点流程的ComfyUI则提供了更高的自由度和工程化控制能力,尤其适合复杂、可重复的创作流程。对于中文用户而言,英文界面和提示词输入是主要障碍。秋叶出品的ComfyUI-v10中文整合包,正是针对这一痛点,提供了**全中文界面**和**原生中文提示词支持**的解决方案。该整合包将Python环境、依赖库及常用插件预配

weixin_33895475的博客 399

ArrayList底层原理:数组扩容、fail-fast与性能优化全解析

ArrayList是Java中最基础的动态数组实现,其核心本质是基于连续内存的Object[]数组,通过空间换时间策略保障O(1)随机访问性能。它依赖CPU缓存行友好性实现低延迟读取,采用1.5倍扩容算法在内存浪费率与复制开销间取得平衡,并通过modCount和fail-fast机制捕获结构并发修改的逻辑错误而非提供线程安全。在电商列表渲染、批量数据处理、实时行情缓存等场景中,合理预设初始容量、避免首部删除、慎用增强for循环删除等实践,可显著降低GC压力与OOM风险。本文深入剖析ensureCapacit

weixin_33782386的博客 390

基于逆向工程的中国裁判文书网爬虫技术深度解析:从反爬破解到合规抓取

最近承接了一个法律大数据分析的项目,需要获取某类合同纠纷的裁判文书数据,用于分析不同地区的判决规律、法官的裁判倾向以及法条适用情况。原本以为用常规的Python爬虫就能搞定,结果刚对着中国裁判文书网发了几个请求,就遭遇了“滑铁卢”:要么请求直接返回403 Forbidden,要么触发滑块验证码,甚至连IP都被临时封禁了。普通的requests+BeautifulSoup组合在裁判文书网面前完全失效,这也让我意识到,想要获取这里的数据,必须先通过逆向工程拆解网站的请求逻辑和反爬机制。经过一周的摸索,从抓包分析

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 3169

RV1126 ROS2环境交叉编译及部署(基于官方Docker)

我的所有基于`RV1126`的机器人项目都是在`Ubuntu22.04`下进行开发的,在`Ubuntu18.04 Docker`容器中实现`RV1126`的`SDK`编译,详细可参考我之前的博客[《Ubuntu20.04/22.04下Docker方案实现多平台SDK编译》第2章](https://blog.youkuaiyun.com/w1820020635/article/details/147342689),`RV1126`的`ROS1`部署没什么难度,可以参考我之前的博客,这里记录了`ROS2`交叉编译及问题解决

w1820020635的博客 1142

手写ArrayList集合与源码分析

背景:首先集合大家是非常熟悉的,不管是个人日常编码还是公司项目,都是经常打交道的好朋友。但是我们要摸清楚她的底细,毕竟好朋友就是要知根知底~ 那么来认识认识集合中的List集合,List集合中的ArrayList集合,四舍五入就是集合中的集合。 首先,简单陈述ArrayList集合特性,底层使用动态数组实现,随机查询效率非常快(元素下标),但插入和删除需要移动整个数组、效率低,Arr...

qq_43227967的博客 433

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

串、数组与广义表:数据结构基础核心解析与实战应用

数据结构是计算机科学的基础,它定义了数据的组织、存储和操作方式,直接影响程序的效率和可维护性。从原理上看,数据结构通过特定的存储模型(如连续或链式)和操作规则,在时间与空间复杂度之间取得平衡,其技术价值在于为算法提供高效的数据载体,是解决实际工程问题的关键。在应用场景上,文本处理、科学计算、缓存系统等都深度依赖基础数据结构。例如,字符串匹配算法(如KMP)优化了文本搜索效率,而动态数组通过均摊分析保证了高性能的随机访问。本文聚焦于串、数组和广义表这三个核心基础结构,深入探讨其存储实现、性能权衡及在混合场景(

weixin_30715523的博客 470

计算机控制技术及应用

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

IMSL CNL 7.0.0 (x86-64)Crack

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

Scala数组深度解析:从声明到Spark实战的避坑指南

数组作为内存连续、随机访问高效的数据结构,是JVM上许多高性能计算的基础。在Scala中,Array直接映射为Java原生数组,同时通过隐式转换融入函数式集合体系,兼顾底层性能与高阶操作。理解其不变性、可变与不可变集合的分工,以及ClassTag等类型约束,是编写健壮大数据作业的关键。在Spark数据处理、矩阵运算和自定义UDF等场景中,合理选择Array与ArrayBuffer能显著影响内存与执行效率。本文系统梳理Scala数组的声明、初始化、常用操作与底层行为,并给出类型推断、越界和性能问题的排查清单,

weixin_34026276的博客 138

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java 快速参考备忘清单:从基础语法到并发、I/O、集合与 JDBC 的实战速查指南(jaywcjlove/reference 中文版)

> 本文基于开源仓库 [jaywcjlove/reference](https://link.gitcode.com/i/25c3a0f2b3268da1960b1a9645694546) 中的 [Java 备忘清单](https://link.gitcode.com/i/de3c32716b7ea0f18d04062b20ed58b1) 展开成文。该清单定位为面向 Java 初学者的速成课程与日

gitblog_01024的博客 609

Scala List底层原理与高阶函数实战:不可变链表全解析

集合操作是日常编程中最频繁的任务之一,而不同语言对集合的设计直接影响代码效率与安全性。在函数式编程中,不可变集合因其线程安全和引用透明的特性备受推崇,链表结构则决定了数据的访问与修改复杂度。Scala 的 List 正是这两者的结合:底层采用单链表,所有修改操作都返回新集合,配合 map、filter、foldLeft 等高阶函数,能大幅简化数据处理逻辑。理解它的设计哲学,掌握 head/tail 拆解、模式匹配、尾递归优化,并清楚与 Array、Vector 的性能差异,是写出高效 Scala 代码的关键

weixin_34417200的博客 574

哈希表与HashMap实战:原理、扩容机制与避坑指南

在程序开发中,键值对存储是最常见的数据操作之一,数组与链表各有性能局限,而哈希表通过哈希函数将任意键映射到桶数组下标,实现了平均O(1)的查找、插入与删除。哈希冲突、负载因子和扩容策略是哈希表设计的核心,Java中的HashMap采用数组加链表加红黑树结构,并通过扰动函数优化散列分布,确保性能稳定。理解HashMap的源码细节,不仅能解决equals与hashCode不一致引发的数据丢失问题,还能指导我们合理设置初始容量以避免重哈希风暴,在并发场景下正确选择ConcurrentHashMap。本文从哈希表基

weixin_34258838的博客 284

Java 技能评估真题全解:LinkedIn Skill Assessments 题库核心知识点系统精讲

本篇技术指南以开源仓库 [linkedin-skill-assessments-quizzes](https://link.gitcode.com/i/154cf1c62fc49b0dab70c7cb76f696ea) 中的 [java/java-quiz.md](https://link.gitcode.com/i/e2cef5e8782222c4552b51a6e9085ebc) 题库为绝对主

gitblog_00231的博客 236

Java 8 IntStream 全面解析:创建、操作与实战

Java 8 引入的 Stream API 为集合处理带来了全新的函数式编程范式,但面对 int 数组或连续数值范围时,初学者常因装箱开销和缺少专用方法而陷入困境。原始类型流 IntStream 的出现,正是为了解决这一痛点——它直接以 int 为元素类型,避免包装对象的内存浪费,并内置 range、sum、average 等数值专用操作,让代码更简洁、性能更优。从创建方式、中间操作到终止操作,IntStream 提供了一整套面向数值密集型场景的解决方案,适用于索引遍历、统计聚合、素数判断、随机数生成等实际

weixin_33957648的博客 226

如何搭建 Linux-Voice-Assistant 开发环境:setup/lint/测试完整流程

**Linux-Voice-Assistant(LVA)** 是一款运行在 Linux 上的 Home Assistant 语音助手卫星(voice satellite),通过 ESPHome 协议接入 Assist,支持本地唤醒词检测。无论你是想修 bug、加功能,还是单纯想跑起来看看,这篇文章会用 3 条核心命令带你走完整套开发环境搭建流程:`./script/setup --dev`(环境)

gitblog_00702的博客 297

Tiled地图编辑器完整指南:快速从零做出你的2D游戏地图

Tiled是一款免费开源的2D地图制作工具,适合独立开发者、游戏设计师和团队项目使用。本文从界面与第一笔绘制讲起,再覆盖碰撞、地形、无限地图的设置,最后对接Unity、Godot与Phaser,带你按这套Tiled教程产出一张可玩的2D游戏地图。 ## 🧩 Tiled地图编辑器到底能做什么 先说定位。Tiled是**关卡编辑器**:你负责摆格子、画碰撞、放对象、导出文件,游戏引擎负责读取这份

gitblog_00993的博客 241
上一篇: 多线程学习(5):synchronized 的基础使用
下一篇: 设计模式学习(五):单例模式 (上)
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

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

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

打赏作者

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

抵扣说明:

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

余额充值