自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

龚小帅的博客

我想要开发一个能为自己做任何事的程序!

  • 博客(598)
  • 资源 (3)
  • 收藏
  • 关注

原创 MySQL 中删除重复的数据并只保留一条

要在 MySQL 中删除重复的数据并只保留一条,可以使用下面的方法。

2024-07-11 10:27:20 11481 29

原创 【人工智能】聊聊Transformer,深度学习的一股清流(13)

Transformer模型是一种深度学习模型,在自然语言处理领域取得了巨大成功。它在处理上下文信息方面表现出色,在自然语言生成、文本分类和语义理解等任务中广泛应用。随着BERT、GPT-2、T5等预训练模型的涌现,这一系列模型在效果上不断取得进展。然而,Transformer模型也存在一些问题,比如计算复杂度高和对大量训练数据的需求。为了解决这些问题,研究者们提出了一些改进方法,比如在BERT模型中使用小批量随机掩码和预测,以及在GPT-2模型中采用Top-k随机采样。

2024-02-08 14:09:25 1656 6

原创 Spring 之 @Cacheable 缓存使用教程

该抽象类提供 loadCaches() 方法,可以获取到所有 Cache 接口实现类。所以这里能够获取到所有缓存。那么肯定是可以使用双缓存。/*** 直接实现 AbstractCacheManager 抽象类的钩子方法,该类已经写好模版方法* 当执行的时候,如果 MyGuavaCacheManager 管理类 @Bean 的话,就会勾到这个方法逻辑* @return} }} }最终通过注入一个缓存管理类 MySimpleCacheManager 就可以使用到三个缓存。

2023-01-18 13:20:22 5333 2

原创 Spring 之 @EnableAspectJAutoProxy 简单使用和源码分析

注意这个类又什么特点呢?可以看出这个类是 Spring BeanPostProcessor 接口的应用。BeanPostProcessor 接口设计非常灵活。这里主要关注#postProcessAfterInstantiation() 方法,因为主要逻辑在这个方法里面。这个抽象类把公共的核心逻辑写好,子类只需要重写其中的一些方法即可,这其实是模版设计模式的一种体现。if(bean!= null) {

2022-12-31 19:39:55 4911 3

原创 SpringBoot 之自动装配简单使用

其实归根结底还是Spring 的 SpringFactoriesLoader 工厂加载机制 + @Import(DeferredImportSelector)实现的,之前说配置文件必须写死 META-INF/spring.factories 规范也就是 Spring 的 SpringFactoriesLoader 规范。上升到 SpringBoot 就完美利用这两点功能实现了自动装配。然后 SpringBoot 将 @EnableXxx 各式各类注解统一命名成 @简单明了!这也就是为什么。

2022-12-28 14:45:39 1846

原创 Spring 之 @Component 和 @Configuration 两者区别以及源码分析

之前一直搞不清 @Component 和 @Configuration 这两个注解到底有啥区别,一直认为被这两修饰的类可以被 Spring 实例化嘛,不,还是见识太短,直到今天才发现这两玩意有这么大区别。很幸运能够及时发现,后面可以少走点坑,下面就直接通过最简单的案例来说明它两的区别,颠覆你的认知。

2022-12-20 18:03:41 4345 1

原创 《一文吃透Java中的线程池:原理 + 实战 + 性能优化》

本文通过生活化的比喻,详细介绍了Java线程池的概念、工作原理及其重要性。文章将线程池比作餐馆的厨房管理,核心线程如同固定厨师,任务队列则是待处理的菜单,而拒绝策略则对应餐馆爆满时的处理方式。线程池的主要优点包括降低资源消耗、提高响应速度和便于管理。文章还深入探讨了线程池的关键参数,如核心线程数、最大线程数、任务队列和拒绝策略,并介绍了四种预定义的线程池类型及其适用场景。最后,通过一个具体的例子,展示了线程池的工作流程,帮助读者更好地理解其在实际应用中的运作机制。

2025-05-20 22:35:07 598

原创 超详细图解Java类加载器原理与双亲委派机制(小学生都能懂版)

本文深入浅出地讲解了Java中的类加载器和双亲委派机制。类加载器负责将.class文件加载到JVM中,并转换为Class对象。Java默认提供三类加载器:Bootstrap、Extension和Application,它们分工明确。双亲委派机制是类加载的核心规则,即子加载器在加载类时先委托父加载器,确保类加载的安全性和唯一性。文章还介绍了打破双亲委派的情况,如SPI和OSGi,以及如何自定义类加载器。最后,总结了类加载器的核心思想,并提供了扩展阅读建议。

2025-05-20 22:34:01 974

原创 Java限流算法全攻略:从原理到实战,让系统稳如泰山!(超详细+通俗易懂版)

Java中的限流算法是保护系统免受突发流量冲击的关键技术,类似于高速公路的收费站,防止系统因请求过多而崩溃。常见的限流算法包括计数器法、滑动窗口、漏桶算法和令牌桶算法。计数器法简单但存在边界问题;滑动窗口更精确但稍复杂;漏桶算法提供恒定输出但不够灵活;令牌桶算法允许突发流量,适合大多数Web应用。Google的Guava库提供了基于令牌桶算法的RateLimiter工具类,便于实现限流。在分布式系统中,可以使用Redis + Lua方案进行分布式限流。限流算法确保系统在可控范围内处理请求,保障系统稳定运行。

2025-05-19 21:34:51 630

原创 《Java高并发编程核心:volatile关键字全解析》

本文深入探讨了Java中的volatile关键字,解释了其作用、特性、底层原理及使用场景。volatile主要用于保证变量的可见性和禁止指令重排序,但不保证原子性。它适用于状态标志位、单例模式的双重检查锁定等场景。常见误区包括认为volatile能替代synchronized或保证线程安全,实际上它仅适用于特定场景。与synchronized相比,volatile更轻量级,但不提供互斥性和原子性保证。正确使用volatile可以有效解决多线程环境下的内存可见性问题。

2025-05-19 21:34:11 905

原创 Java集合大PK:ArrayList vs LinkedList - 谁才是你的真命天子?

ArrayList和LinkedList是Java集合框架中两种常用的列表实现,各有优缺点。ArrayList基于动态数组,支持快速随机访问,适合频繁读取和尾部操作的场景;LinkedList基于双向链表,擅长频繁的插入和删除操作,尤其在列表中间或开头。ArrayList在内存占用上更高效,而LinkedList在特定操作上性能更优。选择时需根据具体需求:若需频繁访问元素或节省内存,选择ArrayList;若需频繁插入删除,选择LinkedList。理解两者的内部实现和性能特点,有助于在实际开发中做出更合适

2025-05-19 21:33:17 640

原创 Java注解与反射机制实战:从零到精通(超详细万字长文)

本文介绍了Java中的两个重要功能:注解(Annotation)和反射(Reflection)。注解是Java 5引入的语法,用于为代码添加标签,类似于便利贴,能够被编译器或其他工具读取和处理。常见的Java内置注解包括@Override、@Deprecated、@SuppressWarnings和@FunctionalInterface。元注解则用于定义其他注解的行为,如@Target、@Retention等。自定义注解可以通过@interface关键字定义,并可以添加属性。 反射机制允许在运行时检查和修

2025-05-19 21:31:45 797

原创 小学生都能懂的Java内存模型(JMM)终极指南:从可见性到重排序的完全解析

Java内存模型(JMM)是Java中用于规范多线程环境下内存访问行为的一套规则。它确保在多线程程序中,线程之间的操作能够有序、可见且原子地执行。JMM的核心概念包括主内存和工作内存,分别代表共享内存和线程私有内存。JMM通过定义内存间交互操作(如read、load、use、assign、store、write)来控制线程与内存的交互。 在多线程环境中,JMM解决了可见性和重排序问题。可见性指一个线程对共享变量的修改能够及时被其他线程看到,而重排序则是编译器和处理器为了优化性能而改变代码执行顺序的行为。JM

2025-05-19 21:30:22 619

原创 《JVM如何判断一个对象可以被回收?图文详解GC Root算法》

本文深入探讨了Java虚拟机(JVM)中的垃圾回收机制(GC)及GC Root可达性分析。首先,文章通过类比房间打扫卫生,解释了为什么需要垃圾回收,并介绍了垃圾回收的基本概念,包括什么是垃圾、为什么需要回收垃圾以及JVM中不同的垃圾收集器。接着,详细讲解了如何通过可达性分析算法判断对象是否为垃圾,并列举了GC Roots的主要类型。文章还通过代码示例展示了可达性分析的具体过程,并解释了对象的生死历程。最后,介绍了常见的垃圾回收算法(如标记-清除、标记-整理、复制算法和分代收集)及几种主要的垃圾收集器(如Se

2025-05-19 21:29:31 1033

原创 《为什么说“写好equals和hashCode”是Java面试生死题?》

在Java中,equals和hashCode方法是对象比较和哈希表操作的核心。equals用于判断两个对象在逻辑上是否相等,而hashCode则用于在哈希表中快速定位对象。重写equals方法时,必须遵循自反性、对称性、传递性、一致性和非空性等约定。常见的错误包括忘记重写、参数类型错误、使用instanceof等。hashCode方法必须与equals方法保持一致,即如果两个对象equals返回true,它们的hashCode也必须相同。违反这一约定会导致哈希表(如HashMap、HashSet)无法正常工

2025-05-14 00:47:08 1002

原创 《面试官问我Java中的AQS是啥,我这样答他当场满意》

AbstractQueuedSynchronizer(AQS)是Java并发编程的核心框架,为开发者提供了实现各种同步工具的基础。AQS通过状态管理、CLH队列和模板方法,简化了线程的排队、阻塞和唤醒等复杂操作。其主要特点是使用一个volatile的int变量表示同步状态,并通过CLH队列管理等待线程。AQS支持独占模式(如ReentrantLock)和共享模式(如CountDownLatch、Semaphore),开发者只需实现关键方法如tryAcquire和tryRelease即可定制同步行为。AQS的

2025-05-14 00:46:19 1003

原创 彻底搞懂Java中String的不可变性:为什么字符串一旦创建就不能改变?

在Java中,String的不可变性是一个核心概念,意味着一旦String对象被创建,其内容就不能被更改。这种设计通过使用final关键字修饰String类和其内部的字符数组来实现,确保了String对象的安全性、线程安全性和性能优化。不可变性使得String可以作为HashMap的键安全地使用,同时支持字符串常量池和哈希码缓存,提高了效率。在实际开发中,如果需要修改字符串内容,可以使用StringBuilder或StringBuffer等可变的替代方案。理解String的不可变性对于编写高效、安全的Jav

2025-05-11 21:12:52 987 1

原创 《Java泛型擦除到底擦了什么?一篇文章彻底搞清楚》

Java泛型(Generics)是Java 5引入的重要特性,允许在定义类、接口或方法时使用类型参数,使用时再指定具体类型。泛型的主要优势包括类型安全、消除强制类型转换和提前发现错误。泛型的基本使用包括泛型类、泛型接口和泛型方法。Java泛型的实现机制是类型擦除(Type Erasure),即在编译时擦除泛型类型信息,确保向后兼容和运行时效率。类型擦除带来了一些限制,如不能创建泛型数组或使用instanceof检查泛型类型。泛型的高级特性包括通配符(Wildcards)和PECS原则(Producer Ex

2025-05-11 21:12:10 1067 2

原创 《从零构建一个简易的IOC容器,理解Spring的核心思想》

Spring框架的IOC(控制反转)容器是一个核心概念,它通过将对象的创建和管理从程序员手中转移到容器中,简化了开发流程。IOC容器就像一个智能机器人,能够自动管理和提供所需的Bean对象,而不需要手动创建。使用IOC容器的好处包括减少代码耦合、便于统一管理对象、简化测试和维护。本文通过一个简单的示例,展示了如何从零开始手写一个迷你IOC容器,并通过逐步升级,最终实现一个相对完整的简易IOC容器。通过这个实践,开发者可以更好地理解Spring IOC容器的工作原理及其在Java开发中的重要性。

2025-05-11 21:11:34 915

原创 《异常链机制详解:如何优雅地传递Java中的错误信息?》

Java异常链(Exception Chaining)机制是一种将原始异常包装在新异常中传递的技术,帮助开发者保留完整的错误上下文,便于问题追踪。异常链的核心在于通过构造函数或initCause()方法将底层异常传递给上层异常,避免异常信息丢失。常见的实现方式包括构造函数传参、initCause()方法以及Java 1.4+的自动异常链机制。在实际开发中,异常链能够显著提升调试效率,特别是在多层调用时,能够清晰地展示异常的根本原因。最佳实践包括避免吞掉原始异常、适度包装异常、避免暴露敏感信息等。通过合理使用

2025-05-11 21:11:01 1114

原创 《为什么ThreadLocal会导致内存泄漏?一文还原问题现场》

ThreadLocal的内存泄漏问题是Java开发中常见且重要的话题。ThreadLocal为每个线程提供了独立的存储空间,类似于“私人储物柜”,但若不正确使用,可能导致内存泄漏。内存泄漏的根本原因是ThreadLocalMap中的Entry使用弱引用作为key,而value是强引用。当ThreadLocal实例被回收后,key会被GC回收,但value仍然存在,且无法被访问,导致内存无法释放,特别是在线程池等长生命周期线程中。 为避免内存泄漏,开发者应遵循以下最佳实践: 使用后必须调用remove():确

2025-05-11 21:10:17 641

原创 《Runnable和Callable有啥本质区别?一看就懂的对比分析》

Java中的Runnable和Callable接口是实现多线程编程的重要工具。Runnable是最基础的多线程接口,仅包含一个run()方法,适用于简单的异步任务,不返回结果且不能抛出受检异常。它常用于后台任务、事件监听等场景。Callable则是Runnable的升级版,定义在java.util.concurrent包中,包含一个call()方法,可以返回结果并抛出受检异常,适用于需要获取计算结果或处理异常的场景。Callable通常与Future配合使用,通过线程池的submit()方法提交任务,并获取

2025-05-10 09:34:51 867

原创 Java SPI机制详解:让程序像乐高积木一样灵活组装

Java的SPI(Service Provider Interface)机制是一种服务发现工具,用于解耦接口和实现,增强代码的灵活性和可扩展性。SPI通过定义标准接口,允许第三方提供具体实现,并在运行时动态发现这些实现类。其核心步骤包括定义服务接口、实现服务提供者、创建配置文件以及使用ServiceLoader加载服务。SPI广泛应用于JDBC驱动加载、SLF4J日志门面和Spring Boot自动配置等场景。尽管SPI具有松耦合、可扩展和动态性等优点,但也存在配置繁琐、效率问题和缺乏优先级控制等缺点。通过

2025-05-10 09:34:02 974

原创 《Spring中的Bean生命周期原来这么简单?一文讲透!》

Spring Bean的生命周期分为三个阶段:实例化、初始化和销毁。首先,Spring通过读取配置信息创建BeanDefinition,然后通过反射实例化Bean并进行依赖注入。接着,Spring调用Aware接口方法让Bean获取自身信息,并通过BeanPostProcessor进行前置处理。随后,Spring调用初始化方法(如@PostConstruct、InitializingBean等),并再次通过BeanPostProcessor进行后置处理。最后,当容器关闭时,Spring调用销毁方法(如@Pr

2025-05-10 09:30:01 731

原创 《图解Java中synchronized到底锁了谁?一篇文章彻底讲清楚!》

文章进一步介绍了synchronized的三种用法:同步实例方法、同步静态方法和同步代码块,分别适用于不同的场景。随后,深入探讨了synchronized的底层实现原理,包括Java对象头、锁的升级过程、Monitor机制以及字节码层面的实现。此外,文章还总结了synchronized的特性,如可重入性、不可中断性和可见性。

2025-05-10 09:29:14 629

原创 《深挖Java中的对象生命周期与垃圾回收机制》

今天我们深入探讨了Java对象的完整生命周期和垃圾回收机制。对象的一生:创建→使用→不可达→回收GC的核心:分代收集 + 多种算法组合优化方向:减少GC频率 + 缩短GC停顿时间未来趋势:ZGC/Shenandoah等低延迟GC随着Java版本的更新,GC技术也在不断进步。理解这些原理不仅能帮我们写出更好的代码,还能在出现内存问题时快速定位和解决。

2025-05-09 21:57:44 944

原创 《Spring Boot 3.0全新特性详解与实战案例》

Spring Boot 3.0就像是Java开发者的"超级工具箱"🧰,它让开发Java应用变得超级简单!它是Spring家族的最新成员,2022年11月正式发布,带来了超多酷炫的新功能!👉简单理解:想象你要做一道菜🍳,Spring Boot就是那个已经帮你准备好所有食材和厨具的"智能厨房",你只需要专注于烹饪美味的部分就行了!Spring Boot 3.0带来了超多激动人心的新特性!总结一下重点:✔️ 必须使用Java 17或更高版本✔️ 原生镜像支持让应用飞起来✔️ 监控和错误处理更加专业。

2025-05-09 21:57:03 1831

原创 揭秘Java并发编程:原理、陷阱与最佳实践(万字长文详解)

想象一下学校小卖部中午卖限量版辣条🌶️的场景:如果所有同学都一窝蜂冲进去,那小卖部肯定乱成一锅粥🍲。聪明的校长想了个办法:让大家排队,每次只允许5个同学进去买。这就是并发的基本思想!💡并发(Concurrency):指在同一时间段内,多个任务交替执行(注意不是同时!并行(Parallelism):才是真正的多个任务同时执行(需要多核CPU支持)为什么需要并发?🤔提高程序响应速度(比如网页边加载图片边渲染文字)充分利用多核CPU的计算能力让耗时操作(如IO)不阻塞主线程明确分工(线程职责单一)

2025-05-07 22:36:58 701

原创 深入理解Java异常处理机制及设计模式:从小白到高手的通关指南

正常情况:顺利到达学校🏫异常情况:轮胎爆胎💥、链条断了⛓️、突然下雨🌧️// 正常情况// 结果是5,一切正常// 异常情况// 哎呀!除零错误!// 自定义业务异常super("余额不足,还差: " + amount);// 使用时try {System.out.println("取款失败: " + e.getMessage());System.out.println("还需要存入: " + e.getAmount() + "才能完成操作");

2025-05-07 22:36:16 840

原创 《一次搞懂JVM调优:性能分析与实战指南》

👂 倾听(监控)🔍 观察(分析)💉 治疗(调优)🏥 复查(验证)记住,没有放之四海而皆准的最优配置,只有最适合你业务场景的配置!如果有任何问题,欢迎在评论区留言讨论哦~ 😊🎛️✨。

2025-05-06 23:09:15 1058

原创 从“大胖子“到“灵活小分队“:Java应用微服务架构进化指南

用户管理 👨👩👧👦订单系统 🛒支付功能 💰库存管理 📦物流跟踪 �所有这些功能都打包在一个WAR或JAR文件里,部署在一个服务器上。就像把所有家具、电器、厨房用品都塞进一个房间,挤得要命!🏠。

2025-05-06 23:08:30 1418

原创 《实战!用Java+Spring构建高并发电商秒杀系统(小学生都能懂的超详细教程)

分层削峰:用Redis抗住读,队列抗住写减少数据库压力:能不用数据库就不用预防为主:限流、降级、熔断提前做好监控到位:实时发现瓶颈按照这个方案,你的秒杀系统就能稳稳抗住双11级别的流量啦!

2025-05-06 23:07:54 831

原创 用现代Java(17+)写出优雅高效的代码:从入门到大师级技巧

KISS原则:保持简单(Keep It Simple, Stupid)使用var简化局部变量声明使用记录类替代样板代码防御性编程使用校验参数优先使用不可变集合函数式思维多用Stream API处理集合避免副作用并发安全使用不可变对象考虑虚拟线程处理I/O密集型任务代码可读性使用文本块处理多行字符串使用模式匹配简化条件逻辑哇!不知不觉我们已经一起探索了这么多现代Java的优雅编码技巧!😊 从简单的var。

2025-04-27 08:38:39 893

原创 探索Java中的设计模式:23种模式全面解析(超详细通俗版一)

一句话解释:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。通俗理解:就像家具城🛋️,有现代风格和古典风格的工厂,每个工厂能生产一整套配套的家具。使用场景跨平台UI组件(一套Windows风格或Mac风格的按钮、菜单等)游戏中的不同主题场景(森林主题、沙漠主题等)代码示例// 抽象产品A// 抽象产品B// 现代风格产品@OverrideSystem.out.println("坐在现代风格的椅子上");@Override。

2025-04-27 08:38:06 1034

原创 为什么用了 @Builder 反而报错?深入理解 Lombok 的“暗坑”与解决方案(二)

如果类中有。

2025-04-24 21:36:31 1071 1

原创 Java 中 String 字符串使用避坑指南:少走弯路的实用经验

String是 Java 中一个功能强大、使用频率极高的类,但它的不可变性、常量池机制、和各种 API 都需要我们小心对待。掌握上述避坑技巧,可以帮助我们写出性能更高、代码更优雅的程序。希望这份指南对大家在日常开发中有帮助!

2025-04-24 21:36:05 585

原创 探索 Java 中 String 类的常用方法

String类的这些常用方法为处理字符串提供了极大的便利。掌握这些方法,可以帮助你更有效地编写代码,处理各种字符串相关的问题。在实际开发中,合理利用这些方法,可以提高代码的可读性和效率。

2025-04-24 21:35:47 729

原创 JDK 21 的新特性:探索 Java 的最新进化

JDK 21 的推出标志着 Java 又一次向高性能、易用性迈进了一大步。无论是正式版的虚拟线程、模式匹配,还是 Scoped Values 等预览功能,JDK 21 都在为开发者提供更强大的工具,帮助我们写出更优雅、更高效的代码。

2025-04-24 20:49:47 628

原创 如何使用 CompletableFuture、Function 和 Optional 优雅地处理异步编程?

通过结合 CompletableFuture、Function和 Optional,我们可以更简洁、优雅地处理复杂的异步编程场景。这样做不仅提升了代码的可读性,还避免了常见的异常问题(如空指针异常)。这三者各自发挥着作用,但结合使用时能够发挥出最大的效能,让我们在开发过程中,既能提升生产力,又能减少潜在的错误。

2025-04-24 20:48:57 985

原创 Java 2025 技术全景与实战指南:从新特性到架构革新

Java在2025年不仅保持了"一次编写,到处运行"的核心优势,更在性能、开发体验和新兴技术集成方面取得了突破。拥抱变化,持续学习新特性在架构设计中考虑弹性和可观测性将Java生态与云原生、AI等趋势有机结合Java的未来不是替代,而是进化- 2025年的Java将比以往任何时候都更强大、更灵活、更适应现代软件开发的需求。现在就开始你的Java 2025之旅吧!

2025-04-24 20:48:16 1161

2023最新AI大模型学习与讨论

2023最新AI大模型学习与讨论:探索未知的智能边界! 迎接2023年,AI领域正迎来一场革命性的学术盛宴!我们诚邀您加入“2023最新AI大模型学习与讨论”——这是一个汇聚顶尖智能科学家、工程师和学者的独特平台,将AI的最新进展推向更高的高度。 在这里,您将深入了解2023年最激动人心的AI大模型,通过与同行的交流,共同揭开智能技术的神秘面纱。我们将探讨自然语言处理、计算机视觉、强化学习等领域的前沿研究,分享最新的模型架构、算法和应用案例。 无论您是刚踏入AI领域的新手,还是经验丰富的专业人士,这个学习与讨论的平台都为您提供了一个开放、包容的环境,让您可以与全球最杰出的思想领袖互动,共同推动AI技术的发展。 别错过这个与全球顶级AI专家交流见解的机会!加入我们,共同塑造未来智能的面貌,探索AI大模型的无限可能性! 看完可以了解AI大模型及微调概念、学以致用,走在技术最前沿

2024-01-17

截图工具FastStone.zip

截图工具方便下载

2021-03-28

最新反编译软件.zip

github下载太慢了, 所以上传一个以后备用, 大家也可以多多下载,用来理解源码执行顺序非常有好处

2021-03-14

春季面试突击版.zip

每次到了跳槽季,都要努力冲刺一波,刷刷面试, 这里准备了一份比较全的面试题,用来冲刺突击

2021-03-06

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除