Java Collections 类中方法详解

【JAVA】Collections类 详解 Collections类 详解 阅读详情

java.util.Collections 类

java.util.Collections 类是 Java 集合框架的一个工具类,它包含一系列静态方法,用于操作和处理各种类型的集合。 这些方法提供了对集合进行排序、查找、同步控制、创建只读集合等常见操作的便捷方式。 注意: Collections 类本身不能被实例化,它的所有方法都是静态的,可以直接通过类名调用。

一、 排序 (Sorting)

  1. sort(List<T> list):

    • 作用: 对指定的 List 集合进行升序排序。

    • 要求: 列表中的元素必须实现 Comparable 接口,即具有自然顺序。 否则会抛出 ClassCastException。

    • 算法: 通常使用归并排序 (Merge Sort) 或 TimSort (一种混合排序算法,结合了归并排序和插入排序的优点),具有较好的平均性能和最坏情况性能。

    • 示例:

      List<Integer> numbers = new ArrayList<>(Arrays.asList(5, 2, 8, 1, 9));
      Collections.sort(numbers);
      System.out.println(numbers); // 输出:[1, 2, 5, 8, 9]
      
  2. sort(List<T> list, Comparator<? super T> c):

    • 作用: 根据指定的比较器 (Comparator) 对 List 集合进行排序。

    • 要求: 列表中的元素不需要实现 Comparable 接口,可以使用自定义的比较器来定义排序规则。

    • 算法: 同样通常使用归并排序或 TimSort。

    • 示例:

      List<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie", "David"));
      Collections.sort(names, (s1, s2) -> s1.length() - s2.length()); // 根据字符串长度排序
      System.out.println(names); // 输出:[Bob, Alice, David, Charlie]
      

二、 查找 (Searching)

  1. binarySearch(List<? extends Comparable<? super T>> list, T key):

    • 作用: 使用二分查找算法在指定的 List 集合中查找指定的元素。

    • 要求:

      • 列表必须已排序(升序),否则结果不确定。
      • 列表中的元素必须实现 Comparable 接口,即具有自然顺序。
    • 返回值:

      • 如果找到元素,则返回元素的索引。
      • 如果没有找到元素,则返回 (-(insertion point) - 1),其中 insertion point 是将元素插入到列表中以保持排序顺序的索引。
    • 示例:

      List<Integer> numbers = Arrays.asList(1, 2, 5, 8, 9); // 必须已排序
      int index = Collections.binarySearch(numbers, 5);
      System.out.println("Index of 5: " + index); // 输出:Index of 5: 2
      
      int notFound = Collections.binarySearch(numbers, 6);
      System.out.println("Index of 6: " + notFound); // 输出:Index of 6: -4
      
  2. binarySearch(List<? extends T> list, T key, Comparator<? super T> c):

    • 作用: 使用二分查找算法在指定的 List 集合中查找指定的元素,使用指定的比较器进行比较。

    • 要求: 列表必须已排序(按照比较器的规则),否则结果不确定。

    • 返回值: 与 binarySearch(List<? extends Comparable<? super T>> list, T key) 相同。

    • 示例:

      List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David"); // 必须按照比较器的规则排序
      Collections.sort(names, (s1, s2) -> s1.length() - s2.length()); // 先按长度排序
      int index = Collections.binarySearch(names, "David", (s1, s2) -> s1.length() - s2.length());
      System.out.println("Index of David: " + index); // 输出:Index of David: 2
      

三、 最大值和最小值 (Maximum and Minimum)

  1. max(Collection<? extends T> coll):

    • 作用: 返回指定集合中的最大元素。

    • 要求: 集合中的元素必须实现 Comparable 接口,即具有自然顺序。

    • 示例:

      List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 9);
      int max = Collections.max(numbers);
      System.out.println("Max: " + max); // 输出:Max: 9
      
  2. min(Collection<? extends T> coll):

    • 作用: 返回指定集合中的最小元素。

    • 要求: 集合中的元素必须实现 Comparable 接口,即具有自然顺序。

    • 示例:

      List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 9);
      int min = Collections.min(numbers);
      System.out.println("Min: " + min); // 输出:Min: 1
      
  3. max(Collection<? extends T> coll, Comparator<? super T> comp):

    • 作用: 返回指定集合中的最大元素,使用指定的比较器进行比较。

    • 要求: 不需要实现 Comparable接口。

    • 示例:

      List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
      String longestName = Collections.max(names, (s1, s2) -> s1.length() - s2.length());
      System.out.println("Longest name: " + longestName); // 输出:Longest name: Charlie
      
  4. min(Collection<? extends T> coll, Comparator<? super T> comp):

    • 作用: 返回指定集合中的最小元素,使用指定的比较器进行比较。

    • 要求: 不需要实现 Comparable接口。

    • 示例:

      List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
      String shortestName = Collections.min(names, (s1, s2) -> s1.length() - s2.length());
      System.out.println("Shortest name: " + shortestName); // 输出:Shortest name: Bob
      

四、 反转 (Reversing)

  1. reverse(List<?> list):

    • 作用: 反转指定 List 集合中元素的顺序。

    • 示例:

      List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
      Collections.reverse(numbers);
      System.out.println(numbers); // 输出:[5, 4, 3, 2, 1]
      

五、 随机排序 (Shuffling)

  1. shuffle(List<?> list):

    • 作用: 使用默认随机源随机排列指定的 List 集合。

    • 示例:

      List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
      Collections.shuffle(numbers);
      System.out.println(numbers); // 输出:[随机排列后的结果,例如:[3, 1, 5, 2, 4]]
      
  2. shuffle(List<?> list, Random rnd):

    • 作用: 使用指定的随机源随机排列指定的 List 集合。

    • 示例:

      List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
      Random random = new Random();
      Collections.shuffle(numbers, random);
      System.out.println(numbers); // 输出:[随机排列后的结果,例如:[2, 5, 1, 4, 3]]
      

六、 填充 (Filling)

  1. fill(List<? super T> list, T obj):

    • 作用: 使用指定的对象替换指定 List 集合中的所有元素。

    • 示例:

      List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
      Collections.fill(numbers, 0);
      System.out.println(numbers); // 输出:[0, 0, 0, 0, 0]
      

七、 复制 (Copying)

  1. copy(List<? super T> dest, List<? extends T> src):

    • 作用: 将所有元素从源 List 集合复制到目标 List 集合。

    • 要求:

      • 目标列表的长度必须大于或等于源列表的长度,否则会抛出 IndexOutOfBoundsException。
      • 目标列表和源列表的元素类型必须兼容。
    • 示例:

      List<Integer> source = Arrays.asList(1, 2, 3, 4, 5);
      List<Integer> destination = new ArrayList<>(Arrays.asList(0, 0, 0, 0, 0)); // 长度必须 >= source.size()
      Collections.copy(destination, source);
      System.out.println(destination); // 输出:[1, 2, 3, 4, 5]
      

八、 交换 (Swapping)

  1. swap(List<?> list, int i, int j):
    作用: 在指定列表中交换指定位置的元素。
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Collections.swap(numbers, 0, 4);
System.out.println(numbers); // 输出:[5, 2, 3, 4, 1]

九、 频率 (Frequency)

  1. frequency(Collection<?> c, Object o):
    作用: 返回集合中与指定对象相等的元素的数量。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Alice");
int frequency = Collections.frequency(names, "Alice");
System.out.println("Frequency of Alice: " + frequency); // 输出:Frequency of Alice: 2

十、 线程安全集合 (Synchronized Collections)

Collections 类提供了一组静态方法,用于将非线程安全的集合转换为线程安全的集合。 这些方法本质上是对集合的操作进行加锁,以实现线程安全。

  1. synchronizedCollection(Collection<T> c):

    • 作用: 返回一个线程安全的 Collection。

    • 原理: 对 Collection 接口中的所有方法进行同步。

    • 示例:

      Collection<Integer> numbers = new ArrayList<>();
      Collection<Integer> syncNumbers = Collections.synchronizedCollection(numbers); // 创建线程安全的 Collection
      
  2. synchronizedList(List<T> list):

    • 作用: 返回一个线程安全的 List。

    • 原理: 对 List 接口中的所有方法进行同步。

    • 示例:

      List<Integer> numbers = new ArrayList<>();
      List<Integer> syncNumbers = Collections.synchronizedList(numbers); // 创建线程安全的 List
      
  3. synchronizedSet(Set<T> s):

    • 作用: 返回一个线程安全的 Set。

    • 原理: 对 Set 接口中的所有方法进行同步。

    • 示例:

      Set<Integer> numbers = new HashSet<>();
      Set<Integer> syncNumbers = Collections.synchronizedSet(numbers); // 创建线程安全的 Set
      
  4. synchronizedMap(Map<K,V> m):

    • 作用: 返回一个线程安全的 Map。

    • 原理: 对 Map 接口中的所有方法进行同步。

    • 示例:

      Map<String, Integer> scores = new HashMap<>();
      Map<String, Integer> syncScores = Collections.synchronizedMap(scores); // 创建线程安全的 Map
      

注意事项:

  • 性能较低: synchronized 集合的性能较低,因为所有操作都需要获取锁。在高并发场景下,建议使用 java.util.concurrent 包提供的并发集合类(例如 ConcurrentHashMap, CopyOnWriteArrayList)。
  • 迭代: 即使使用了 synchronized 集合,在迭代集合时仍然需要进行同步,以避免 ConcurrentModificationException。 可以使用 synchronized 代码块或 synchronized 方法来保护迭代过程。

示例:线程安全的迭代

List<Integer> numbers = Collections.synchronizedList(new ArrayList<>());

synchronized (numbers) { // 同步代码块
    Iterator<Integer> iterator = numbers.iterator();
    while (iterator.hasNext()) {
        Integer number = iterator.next();
        // 处理 number
    }
}

十一、 不可修改的集合 (Unmodifiable Collections)

Collections 类提供了一组静态方法,用于创建不可修改的集合(只读集合)。 尝试修改这些集合会抛出 UnsupportedOperationException 异常。

  1. unmodifiableCollection(Collection<? extends T> c):

    • 作用: 返回一个不可修改的 Collection。
  2. unmodifiableList(List<? extends T> list):

    • 作用: 返回一个不可修改的 List。
  3. unmodifiableSet(Set<? extends T> s):

    • 作用: 返回一个不可修改的 Set。
  4. unmodifiableSortedSet(SortedSet<T> s):

  • 作用: 返回一个不可修改的 SortedSet。
  1. unmodifiableNavigableSet(NavigableSet<T> s):
  • 作用: 返回一个不可修改的 NavigableSet。
  1. unmodifiableMap(Map<? extends K,? extends V> m):

    • 作用: 返回一个不可修改的 Map。
  2. unmodifiableSortedMap(SortedMap<K, V> m):

  • 作用: 返回一个不可修改的 SortedMap。
  1. unmodifiableNavigableMap(NavigableMap<K, V> m):
  • 作用: 返回一个不可修改的 NavigableMap。

使用场景:

  • 保护集合数据: 防止外部代码修改集合中的数据。
  • 创建只读的配置对象: 例如,将应用程序的配置信息存储在一个 Map 中,并将其设置为不可修改的,以防止运行时被意外修改。

示例:

List<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie"));
List<String> unmodifiableNames = Collections.unmodifiableList(names);

// 尝试修改 unmodifiableNames 会抛出 UnsupportedOperationException
try {
    unmodifiableNames.add("David"); // 抛出 UnsupportedOperationException
} catch (UnsupportedOperationException e) {
    System.out.println("Caught exception: " + e);
}

// 修改 names 会影响 unmodifiableNames (因为 unmodifiableNames 只是一个视图)
names.add("David");
System.out.println(unmodifiableNames); // 输出:[Alice, Bob, Charlie, David]

注意事项:

  • 只读视图: unmodifiable 方法返回的集合只是一个只读视图,它仍然引用原始集合。 如果原始集合发生了改变,那么只读视图也会反映这些改变。
  • 浅拷贝: unmodifiable 方法返回的只是集合的 浅拷贝
CMAC算法原理 2、K1 通过以下运算导出:若 L 的最高有效位等于 0,则 K1 是 L 的左移 1 位。3、K2 通过如下运算导出:若 K1 的最高有效位等于 0,则 K2 是 K1 的左移 1 位。采用了 AES 算法中的类似 CBC 模式的加密方式,即对前一个分组的密文与当前分组的明文进行异或操作后在加密,2、分块处理:首先将消息分成多个固定长度的块,若消息长度不是块大小的倍数,则可以使用填充来将其填充到合适的大小。1、子密钥计算,通过主密钥生成子密钥(key1,key2),子密钥用于最后一个块处理; 阅读详情

相关推荐

接上篇,记录一下【Unity 3D对博途PLCSIM的通讯】文章有点长~仔细看,很基础

本文参考链接:西门子PLC丨PROFINET通讯仿真(虚拟通讯)做了一些更详细的优化,本文使用的类库并非原作者使用的类库。 首先,昨天项目已经创建好了,这边也加了一个InputField和一个Button,可以实现简单的读取,ok开始。 放入准备好的通讯类库; 新建一个博途的项目,本次测试使用博途V15,测试环境为虚拟机,Unity运行在本地计算机,建立博途项目流程如下: 新建项目,右键项目-属性-保护-对勾,如图: 不得不说的是,仿真中加密的FB块是无法下载的哦~ 添加CPU...

NS_Speak(IVAV) 8055

java Collections类 详解

java 集合篇章——Collections类常用方法讲解及演示。

优快云 / 稀土掘金/ B站 / GitHub: Cyan_RA9 7133

STM32F407+LWIP实战:NETCONN接口TCP服务器避坑指南(附正点原子例程解析)

本文深入解析了基于STM32F407和LWIP协议栈构建高响应TCP服务器的实战要点。针对使用NETCONN接口时常见的连接不稳定、数据延迟及内存泄漏等问题,提供了从NETCONN运行模型、服务器实现、参数优化到内存管理的全方位避坑指南,并结合正点原子例程,给出了具体的调试技巧与解决方案。

weixin_29188043的博客 402

【Java 基础篇】Java Collection详解

Collection是Java集合框架的根接口,它定义了一些基本的操作和行为,如添加、删除、遍历等。List和Set。List是一个有序的集合,可以包含重复元素。它提供了按索引访问、插入、删除等操作。常见的实现类有ArrayListLinkedList和Vector。Set是一个不允许包含重复元素的集合。它提供了高效的元素查找和去重。常见的实现类有HashSetTreeSet和。此外,Map接口也是Collection框架的一部分,它提供了键值对的存储和操作。Map中的键是唯一的,值可以重复。

繁依Fanyi的博客 7278

RaiDrive+AList保姆级教程:5分钟搞定OneDrive/百度网盘挂载到本地(附WebDAV配置)

本文提供RaiDrive+AList的保姆级教程,5分钟内实现将OneDrive/百度网盘挂载到本地的详细步骤,包括WebDAV配置。通过AList统一转换云存储协议,RaiDrive虚拟磁盘挂载,显著提升多网盘管理效率,适合需要跨平台操作文件的用户。

weixin_28331555的博客 455

TensorRT-LLM环境配置避坑指南:从安装到实战

本文是一份详尽的TensorRT-LLM环境配置避坑指南。文章重点解析了从Python、CUDA、PyTorch版本选择,到解决mpi4py安装这一核心难题的完整流程,并提供了经过验证的稳定版本组合与实战排错方案,帮助开发者高效部署大语言模型推理优化环境。

a0b1c2d3的专栏 983

JAVA Collections类

JAVA Collections类中shuffle和sort方法的介绍

qq_53312143的博客 5362

OpenClaw Docker 安装与部署教程,环境隔离不冲突技术指南

本文介绍了使用Docker容器化部署OpenClaw的完整教程。首先通过流程图详细说明了Docker环境检测流程,包括系统支持性检查、Docker安装状态验证、版本检测和服务配置等步骤。然后提供了Windows、macOS和Linux(Ubuntu/CentOS)系统下的Docker安装指南,涵盖从下载、安装到权限配置的全过程。最后介绍了OpenClaw官方镜像的拉取方法以及自定义镜像构建的Dockerfile示例。该教程适用于开发和生产环境,利用Docker实现环境隔离和快速部署。

一键难忘的博客 987

Java - 集合工具类Collections

Java中的Collections是一个工具类,提供了一系列静态方法,用于操作集合(Collection)和Map。它包含了许多常用的方法,例如排序、查找、替换、复制等。Collections类的方法大多数都是静态的,可以直接通过类名调用,不需要实例化。它提供了许多方便的方法,使得我们可以轻松地对集合进行操作。

weixin_73869209的博客 6303

linux内核学习(八)---摄像头框架移植(上)

本章来开始进行摄像头的移植,同时回顾一下V4L2的整个框架

文艺小少年的博客 113

【Tiny_CD】Tiny_CD变化检测网络详解(含python代码)

tiny-cd网络详解,含论文下载、代码下载地址。

向上生长的程序媛的博客 2161

Java——Collections类和方法

public class Collections extends Object 此类仅由静态方法组合或返回集合。 它包含对集合进行操作的多态算法,“包装器”,返回由指定集合支持的新集合,以及其他一些可能的和最终的。 如果提供给它们的集合或类对象为null,则此类的方法都抛出一个NullPointerException 。 该类中包含的多态算法的文档通常包括实现的简要说明 。 这些描述应被视...

Hern(宋兆恒) 422

【推荐100个unity插件之10】Unity Cinemachine最全的最详细的虚拟相机介绍,详细案例讲解,快速上手

相信很多同学都用过Unity的Cinemachine插件,使用它可以很方便地实现一些摄像机效果,比如摄像机追踪、推拉镜头、分镜等效果。Cinemachine的知识特别的多又很常用,本来是想做一期来讲一下的,结果搜索发现已经有人做过了,而且内容挺全的,但是内容可能比较啰嗦,还有部分没有补充,所以我就先转载下来,后续有时间再优化修改补充,觉得内容不错的,很欢迎大家去支持原作者。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2万+

Java Collections 类中常用方法使用

Java Collections 类中常用方法使用

分享我的点点滴滴,在成长路上与你同行! 617

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java语言——Collections类的方法

1. Collections 这个 java.utils.Collections是集合工具类,用来对集合进行操作。 常用方法: public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。 public static void shuffle(List<?> list)...

weixin_44840572的博客 183

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

java--Collections集合框架的操作类中常用的方法

//1.针对值类型排序 直接调用Collections的sort方法 传递要排序的集合容器 List<Integer> num = new ArrayList<Integer>(); num.add(1); num.add(3); num.add(2); //直接输出集合 是输出集合的地址还是集合中的值? //因为重写了toString方法 System.out.pr...

WGS. 523

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【JAVA】Collections类的其他方法

Collections类还有其他的方法,这里我们值列举几个常用的方法: //反转 Collections.reverse(s); //随机打乱 Collections.shuffle(s); //交换 Collections.swap(s, 2, 5); //旋转 Collections.rotate(s, 3); //判断两个集合有没有交集 Collections.disjo...

LED_of_Java的博客 158

JAVA:Collections类的shuffle()方法

JAVA中Collections类的shuffle()方法的作用是将List中的内容随机打乱顺序。 import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Random; /* *Created on

蔡先生的专栏 1万+

Java Collections类的shuffle和sort方法详解

本文详解了Java Collections类的shuffle()和sort()方法。shuffle()使用Fisher-Yates算法随机打乱列表元素,支持确定性洗牌;sort()采用TimSort算法进行排序,支持自然顺序和自定义比较器。两者都是原地操作,直接修改原列表。文章对比了它们的实现原理、时间复杂度、使用场景及注意事项,并提供了代码示例,帮助开发者高效处理列表元素的随机化和排序需求。

likuoelie的博客 456

Java中的Collections类中的一些常用方法

在Java中,Collections类是一个提供操作或返回集合的方法的实用类。它包含了一系列静态方法来操作或返回集合,比如排序、搜索和同步化等。这里我为大家介绍一下该类的一些常用方法,并通过示例来展示它们的使用。

2402_83919997的博客 583

Java中的Collections类(工具类)常用方法 总结

Collections类 Collections类是Java中针对集合类的一个工具类,其中提供一系列静态方法。 1. sort(Comparator<? super E>):void List 对集合中的元素排序。 public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>();

qq_42653576的博客 1万+

Java Collections类常用方法

参考链接: Java中Collections类详细用法

技术改变世界 243

java.util.Collections类——emptyList()方法 详解及项目中使用

emptyList()方法的使用 通过java.util.Collections.emptyList()方法的相关源码可以得知它实际上就是返回了一个空的List,但是这个List和我们平时常用的那个List是不一样的。这个方法返回的List是Collections类的一个静态内部类,它继承AbstractList后并没有实现add()、remove()等方法,因此这个返回值List并不能增加删除...

weixin_43726822的博客 1191

【Java】Collections类中的常用方法

随机打乱,每次都不同。

Aimee_jaye的博客 165

java输出一副扑克牌_Java_Collections类下的shuffle()方法&斗地主洗牌

前情提要:在创建集合的时候,我们总是按照某一顺序地将内容存入集合里,可是当我们不想要这种单一的形式存储数据的时候,比如我们想打乱原来存入数据但是重写又觉得很麻烦,这个时候shuffle ()方法就非常的有用了。在Collections类下,存在这么一个静态方法叫做shuffle(ArrayList),通过这个方法,我们可以把原来存入集合的数据全部打乱,用处可以是,当你存入一副牌,然后通过shuff...

weixin_33781129的博客 279

java.util的Collections类的两种sort方法使用

在java.util中有Collections类,包含可以操作或返回集合的专用静态类,其中有两类sort方法; 注意:java.util.Arrays中也有用于数组比较的多种sort类 1、第一类sort的API解释: public static Comparable> void sort(List list) 根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必

u011140430的专栏 1483
上一篇: Java 集合框架 (Collections Framework) 大纲
下一篇: HashMap 和 ConcurrentHashMap 的区别
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

冰糖心书房

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

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

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

打赏作者

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

抵扣说明:

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

余额充值