自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(115)
  • 收藏
  • 关注

原创 排序算法 - 堆排序详解

预备知识堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。如图:同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子特点该数组从逻辑上讲就是一个堆结构,要查找数组中某个数的父结点和左右孩子结点,设数组索引为i,那么父结点索引:(i-1)/2左孩子索引:2*i+1右孩子索引:2*i+2可得大顶堆特点

2022-05-17 21:20:45 3265 2

原创 数据结构 - 哈希表

基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。数组 + 链表实例有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id、性别、年龄、住址……),当输入该员工的id时,要求查找到该员工的所有信息。要求:不使用数据库,尽量节省内存,速度越快越好 => 哈希表(散列表)。员工实体类Employe

2022-05-13 23:13:09 504

原创 查找算法:顺序(线性)查找、二分(折半)查找、插值查找

文章目录顺序查找二分查找插值查找斐波那契查找顺序查找依次遍历数据,查找到就返回下标,没有查找到就返回-1/** * @ClassName SeqSearch * @author: shouanzh * @Description 线性查找 * @date 2022/5/11 16:44 */public class SeqSearch { public static void main(String[] args) { int[] array = new int[

2022-05-12 20:15:00 419 2

原创 排序算法 - 基数排序详解

基本介绍基数排序(radix sort)的思想是多关键字排序,属于分配式排序。它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,然后依次收集各个桶内数据,通过分配和收集达到排序的目的。基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序示意图:执行流程下面通过一个例子来体会基数排序过程。原始序列:80, 43, 155, 987, 100, 31, 6, 299, 155, 00)初始桶每个关键字的每一位都是由“

2022-05-10 22:21:31 3381 1

原创 排序算法 - 归并排序详解

基本介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。基本思想将序列中待排序数字分为若干组,最终每个数字分为一组。(默认长度为1的序列是有序的)将若干个组两两合并,保证合并后的组是有序的。(俩个子序列头部进行比较大小)重复第二步操作直到只剩下一组,排序完成。归并排序思想示

2022-05-09 22:38:42 4344

原创 排序算法 - 快速排序详解

基本思想对于一组数据,选择一个基准元素(base),通常选择第一个或最后一个元素,通过一轮扫描,比base小的元素都在base左边,比base大的元素都在base右边,对左右子序列用相同的方法递归排序,直到序列中所有数据均有序为止。快速排序,说白了就是给基准数据找其正确索引位置的过程。思路图解以 [19,97,09,17,01,08] 为例,以第一个元素19为base,定义左右两个指针 L和 R,分别从两端开始扫描。从右向左找比19小的数,替换L所在位置的元素。再从左往右找比19大的数,然后替换

2022-05-08 19:35:30 1166

原创 排序算法 - 希尔排序

基本介绍简单插入排序存在的问题:数组 array = {2,3,4,5,6,1} 这时需要插入的数 1 (最小),这样的过程是:{2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6}结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响。希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更

2022-05-06 23:26:35 168

原创 排序算法 - 插入排序

基本介绍插入式排序属于内部排序法,是对于待排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序法思想插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。插入排序(图解)代码实现/** * @ClassName InsertSo

2022-05-06 20:45:00 117

原创 排序算法 - 选择排序

基本介绍选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序思想选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]交换第三次从arr[2]~arr[n-1]中选取最小值,与arr[2]交换…第i次从arr[i-1]~arr[n-1]中选取最小值,与arr[i-1

2022-05-06 08:00:00 107

原创 排序算法 - 冒泡排序

基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对 需要排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。如果有 n 个数进行排序,只需将 n-1 个数归位,也就是要进行 n-1 趟操作。而 “每一趟 ” 都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后

2022-05-05 23:00:00 777

原创 算法的时间复杂度

文章目录1.度量一个程序(算法)执行时间的两种方法1.1 事后统计的方法1.2 事前估算法2.时间频度2.1 特点2.1.1 举例说明—忽略常数项2.1.2 举例说明—忽略低次项2.1.3 举例说明—忽略系数3.时间复杂度3.1 常见的时间复杂度3.2 常数阶O(1)3.3 对数阶O(log~2~n)3.4 线性阶O(n)3.5 线性对数阶O(nlog~2~n)3.6 平方阶O(n²)3.7 立方阶O(n³)、K次方阶O(n^k^)4.平均时间复杂度和最坏时间复杂度5.空间复杂度1.度量一个程序(算法)执

2022-05-04 17:30:44 521

原创 递归详解及迷宫问题和八皇后问题

递归概述递归就是方法自己调用自己。递归必须具备两个条件,一个是调用自己,一个是有终止条件。这两个条件必须同时具备,且一个都不能少。并且终止条件必须是在递归最开始的地方,也就是下面这样public void recursion(参数0) { if (终止条件) { return; } recursion(参数1);}递归调用机制递归调用机制(栈的运行原理):JVM直接对Java栈的操作只有两个,就是对栈帧的压栈和出栈,遵循“先进后出”/“后进先出”原

2022-05-02 22:31:33 394

原创 前缀、中缀、后缀表达式及逆波兰计算器实现

文章目录1.前缀表达式(波兰表达式)1.1 介绍1.2 前缀表达式的计算机求值2.中缀表达式3.后缀表达式(逆波兰表达式)3.1 介绍3.2 后缀表达式的计算机求值4.逆波兰计算器5.中缀表达式转换为后缀表达式5.1 思路分析5.2 代码实现6.完整版逆波兰计算器1.前缀表达式(波兰表达式)1.1 介绍前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前。举例说明:(3+4)*5-6 对应的前缀表达式就是 - * + 3 4 5 61.2 前缀表达式的计算机求值从右至左扫描表达式,遇到数字

2022-05-01 21:53:13 971

原创 数据结构 - 栈(Stack)

文章目录栈的介绍用数组模拟栈栈实现计算器栈的介绍栈的英文为(stack)。栈是一个先入后出(FILO : First In Last Out)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊的线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶;而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。入栈(push)示

2022-04-30 21:32:54 2511

原创 数据结构 - 约瑟夫环

文章目录约瑟夫问题由来约瑟夫环介绍单向环形列表约瑟夫问题由来据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越

2022-04-29 23:30:32 795

原创 数据结构 - 双向链表

文章目录双向链表特点双向链表增、删、改、查、图解分析双向链表增、删、改、查、代码实现双向链表特点单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp(temp是待删除节点的前一个节点),temp.next = temp.next.next 。双向链表增、删、改、查、图解分析一、遍历方法和单链表一样,只是可以向前遍历,也可以向后遍历。二、添加 (默认添加到双向链表

2022-04-29 22:30:00 410

原创 数据结构 - 单链表

文章目录链表(Linked List) 介绍单链表创建和遍历的分析与实现单链表:按顺序插入、删除、修改、判重获取单链表中有效节点的个数查找单链表中的倒数第k个结点单链表的反转从尾到头打印单链表链表(Linked List) 介绍链表是有序的列表,但是它在内存中是存储如下链表是以节点的方式来存储,是链式存储。每个节点包含 data域:存放数据, next 域:指向下一个节点。如图:发现链表的各个节点不一定是连续存储。链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。单链表(带头

2022-04-29 00:46:22 2777

原创 数据结构 - 队列 && 环形队列(循环队列)

文章目录队列介绍数组模拟队列数组模拟队列设计思路数组模拟环形队列队列介绍队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。数组模拟队列队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 MaxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改

2022-04-27 00:01:58 3118

原创 稀疏数组 - SparseArray

文章目录基本介绍二维数组转稀疏数组稀疏数组转二维数组基本介绍对于二维数组中如果有多数数据为相同的值,少数为有效值的数组,可以通过稀疏数组进行重新存储,达到较少空间占用,后面可以通过这个稀疏数组恢复之前的二维数组。稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值。把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。举例说明比如一个棋盘,可以用二维数组表示,这个棋牌(只有三种数据,0为没有棋子,1为黑棋,2为蓝棋)如图,把一个11 X 11的二维数组变为

2022-04-26 20:30:45 199

原创 分布式配置中心Spring Cloud Config介绍

文章目录Spring Cloud Config介绍Config服务端配置中心搭建配置文件存放本地配置文件存放git上Spring Cloud Config介绍用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持, 它分为服务端与客户端两个部分。其中服务端也称为分布式配置中心, 它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;而客户端则是微服务架构中的各个微服务应用或基础设施, 它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的

2022-04-22 20:28:46 990 3

原创 服务网关Spring Cloud Gateway

文章目录Gateway基本介绍Gateway工作流程Gateway9527搭建Gateway环境准备路由配置方式路由规则(Predicate)全局过滤器Gateway基本介绍Spring Cloud Gateway官方网站:https://spring.io/projects/spring-cloud-gatewaySpring Cloud Gateway是基于Spring生态系统之上构建的API网关,包括:Spring 5.x,Spring Boot 2.x和Project Reactor。Spr

2022-04-22 00:12:35 1843 4

原创 FeignClient名称重复无法启动的问题解决

比如我们有个user服务,但user服务中有很多个接口,我们不想将所有的调用接口都定义在一个FeignClient中,比如:Client 1@FeignClient(value = "cloud-user-service")public interface RemoteUserClient { @GetMapping("/user/get/v1") public User getUser(@RequestParam("id") int id);}Client 2@FeignCl

2022-04-20 18:25:48 2014

原创 Hystrix断路器详解

文章目录Hystrix重要概念为什么需要断路器功能Hystrix的作用Hystrix命令执行流程Hystrix使用教程代码准备Hystrix之服务降级(服务端)Hystrix之服务降级(消费端)Hystrix之全局服务降级DefaultPropertiesHystrix之服务降级FeignFallbackHystrix重要概念为什么需要断路器功能在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用。为了保证其高可用,单个服务又必须集群部署。由于网络原因或者自身的原因,服务并不能保证

2022-04-20 12:43:17 1410

原创 Feign拦截器:RequestInterceptor

文章目录RequestInterceptor概述自定义拦截器RequestInterceptor概述Feign支持请求拦截器,在发送请求前,对发送的模板进行操作,例如设置请求头等属性。public interface RequestInterceptor { /** * 每个请求都会调用apply方法 */ void apply(RequestTemplate template);}自定义拦截器自定义拦截器@Configuration@Slf4jpublic cla

2022-04-18 22:13:50 5626

原创 服务调用:OpenFeign详解

文章目录OpenFeign基本介绍概述为什么要使用FeignFeign vs OpenFeignFeign的实现流程OpenFeign使用步骤OpenFeign超时控制OpenFeign日志增强OpenFeign文件传输OpenFeign基本介绍概述服务之间如果需要相互访问,可以使用RestTemplate, 也可以使用 Feign客户端访问。它默认会使用Ribbon来实现负载均衡。可以理解为Feign是一个超级方便的调用Spring Cloud远程服务的框架/工具,帮助开发者以更少耦合,更少代码,

2022-04-18 17:55:08 5349 3

原创 Ribbon底层执行流程源码剖析

文章目录代码准备源码解析 LoadBalancerClient负载均衡器总结代码准备实际应用中,通常将 RestTemplate 和 Ribbon 结合使用,RestTemplate增加 @LoadBalance注解后,在进行远程调度时能够做到负载均衡,例如:@Configurationpublic class ApplicationContextConfig { @Bean @LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能

2022-04-18 00:02:56 442

原创 Spring Clould之客户端负载均衡(Ribbon)详解

文章目录Ribbon入门介绍Ribbon概述负载均衡器组件Ribbon实现负载均衡原理Ribbon的负载均衡和RestTemplate调用Ribbon默认自带的负载规则Ribbon负载规则替换Ribbon默认负载轮询算法原理RoundRobinRule源码分析Ribbon之手写轮询算法Ribbon入门介绍Ribbon概述Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均

2022-04-17 21:12:12 1083

原创 微服务注册中心:Eureka详解

文章目录Eureka基础概念Eureka概述Eureka架构图Eureka集群架构图Eureka关键概念Eureka的自我保护模式创建Eureka服务端服务提供者cloud-provider-8001入驻进EurekaServer消费者模块入驻进EurekaServerEureka工作原理Eureka集群环境构建将服务注册进Eureka集群服务提供端搭建集群actuator微服务信息完善服务发现Discovery禁用自我保护模式Eureka基础概念Eureka概述Eureka:服务注册与发现提供了一个

2022-04-17 00:57:43 8314 1

原创 Spring Cloud 环境初搭建:多模块项目管理

文章目录Spring Boot 和 Spring Cloud 版本选择父工程Project空间创建公共模块创建服务提供者模块创建消费者模块创建Spring Boot 和 Spring Cloud 版本选择Spring Cloud 官网:https://spring.io/projects/spring-cloud#learnSpring Boot 官网:https://spring.io/projects/spring-boot#learnSpring Boot 官方强烈建议你升级到2.X以上版本

2022-04-16 19:18:16 1932

转载 Spring Cloud核心组件概览

文章目录概述业务场景介绍Spring Cloud核心组件:EurekaSpring Cloud核心组件:FeignSpring Cloud核心组件:RibbonSpring Cloud核心组件:HystrixSpring Cloud核心组件:Zuul总结概述毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本文将通过大量的手绘图,给大家谈谈Spring C

2022-04-14 16:56:11 292

原创 JDWP远程调试详解

文章目录JDWP介绍JDWP使用说明JDWP具体操作在IDEA 中进行远程调试JDWP介绍JDWP:Java Debug Wire Protocol (Java 调试协议)前面我们已经把项目打成jar包,可以直接在目标服务器上执行。启动命令:java -jar kernel-1.0-SNAPSHOT.jar但是在日常工作中,难免会遇到这样场景,明明在本地测试没有任何问题,一到测试环境、开发环境就抛异常。接下来我们就介绍一下怎么Debug 远程服务器上的代码。(前提保证本地代码和远程服务器代码保持一

2022-04-12 20:04:12 4287 1

原创 SpringBoot自动配置原理

文章目录底层注解@Configuration@Import@Conditional@ImportResource底层注解@Configuration@Configuration : 告诉SpringBoot这是一个配置类配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的配置类本身也是组件proxyBeanMethods : 代理bean的方法Full(proxyBeanMethods = true)【保证每个@Bean方法被调用多少次返回的组件都是单实例的】Lite(p

2022-04-09 00:11:46 411

原创 SpringBoot环境搭建

SpringBoot官方文档:https://spring.io/projects/spring-boot1.创建Maven工程项目结构2.引入依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sc

2022-04-07 21:47:39 778

原创 Spring声明式事务执行流程源码分析

文章目录1.执行入口2.事务三大接口3.TransactionInterceptor 事务拦截器3.1 创建事务1.执行入口StudentService studentService = (StudentService) defaultIistableBeanFactory.getBean("studentServiceProxy");studentService.saveStudent(student)如果一个方法开启了事务,最终在getBean的时候,获取到的一定是代理对象。当执行saveSt

2022-04-05 14:00:08 1013

原创 事务、事务隔离级别、Spring事务配置、Spring事务的传播特性

文章目录什么是事务事务的概念事务的四大特性(ACID)事务的隔离级别Spring事务配置Spring事务的传播特性什么是事务事务的概念事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向 系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);通俗点说就是:一组sql语句组成的数据库逻辑处理单元,在这组的sql操作中,要么全部执行成功,要么全部执行失败。最常见的例子就转账:小明给如花转账:开启事务 ------1.从

2022-04-03 23:07:24 147

原创 Spring AOP详解、ProxyFactoryBean介绍、AOP实现方式(代理模式)

文章目录Spring AOP 目标AOP 核心概念Spring AOP实现ProxyFactoryBean介绍ProxyFactoryBean的典型配置ProxyFactoryBean的构成ProxyFactoryBean的作用目标代理对象的创建代理模式详解JDK动态代理CGLIB代理小结Spring AOP 目标将分散在程序各处的横切关注点剥离出来并以集中的方式进行表达使得开发人员能够专注于业务逻辑的实现而非繁杂的非功能代码, 简化了程序编写与单元测试应用场景日志安全事务AOP

2022-04-01 21:19:11 1397

转载 SpringBoot:切面AOP详解及应用举例(配合自定义注解实现权限校验、日志记录)

文章目录1.理解AOP1.1 什么是AOP1.2 AOP体系与概念2.AOP应用2.1 配合自定义注解实现权限校验2.2 日志记录3.AOP相关注解3.1 @Pointcut3.2 @Around3.3 @Before3.4 @After3.5 @AfterReturning3.6 @AfterThrowing1.理解AOP1.1 什么是AOPAOP(Aspect Oriented Programming),面向切面思想,是Spring的三大核心思想之一(两外两个:IOC-控制反转、DI-依赖注入)。

2022-03-30 22:48:09 2632

原创 Spring源码解析:Bean的加载流程

文章目录1.缓存中获取单例 bean2.创建单例对象经过上篇的分析,我们已经完成了Bean实例的注册流程解析,已经将XML文件内容解析成一个个的 BeanDefinition 实例存在于容器之中。接下来就可以调用 BeanFactory的getBean 方法获取目标 Bean 实例。public class SpringClient { public static void main(String[] args) { // 类路径下的资源 将其具体抽象成资源对象

2022-03-27 17:36:18 2558

原创 Spring源码分析、资源抽象Resource、工厂BeanFactory、Bean定义读取器BeanDefinitionReader、Bean实例的注册流程解读

文章目录代码准备Spring容器管理Bean的过程以及加载模式Spring对于Bean管理的核心组件IOC和DI概念1.Resource概述及ClassPathResource源码分析2.创建Bean工厂实例代码准备新建一个简单的Java Bean/** * @ClassName Student * @author: shouanzh * @Description POJO: Plain Old Java Object 简单的java对象,也就是普通JavaBeans * @date 2022

2022-03-25 00:40:28 960

原创 Semaphore、CountdownLatch、CyclicBarrier详解

文章目录1.Semaphore1.1 基本使用1.2 Semaphore原理-图解流程1.3 Semaphore原理-源码分析2.CountdownLatch3.CyclicBarrier1.Semaphore信号量,用来限制能同时访问共享资源的线程上限。1.1 基本使用/** * @ClassName SemaphoreTest * @author: shouanzh * @Description 信号量,用来限制能同时访问共享资源的线程上限。 * @date 2022/3/20 11:3

2022-03-20 15:00:42 722

空空如也

空空如也

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

TA关注的人

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