自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(144)
  • 资源 (11)
  • 收藏
  • 关注

原创 springboot 资源resource文件加载优先级

文章目录1.问题2.springboot的资源目录优先级3.相关源码3. webjars1.问题在通过spring项目官网生成的springbootproject项目中,通常我们知道,resource目录是存放项目的静态资源的目录,如在很久以前,项目开发没有采用前后端分离的时候,那么大量的js文件和html都将放到resource目录。但是我们可以看到,这个自动生成的目录中有个static目录:这不仅引起了我的好奇,什么情况下的文件需要放置道static目录?2.springboot的资源目录

2021-02-24 19:02:06 24

原创 在springboot 中配置使用servlet

文章目录1.前言2.servlet3.springboot配置4.启动项目5.UrlMapping设置6.Filter7.Listener8.总结1.前言还记得,说到web项目,最早接触的就是servlet,实际上SSH项目,也是依赖于servlet,在web.xml文件中进行配置。那么使用了springboot之后,不仅有一个疑问,虽然SpringMVC已经帮我们很容易的实现了spring web项目的使用,只需要@Controller就能搞定。但是我们需要使用servlet该如何做呢?虽然这种需求非

2021-02-23 11:12:59 32 1

原创 在IDEA中Jrebel插件安装与使用

1.简介在进行java开发的过程中,需要将代码编译为class文件,之后打包为jar文件,如果在tomcat等容器下运行,则需要反复重新部署。这个操作非常耗时和无聊,虽然IDEA和eclipse等有诸多热部署的插件来解决这个问题,Jrebel则是最好的热部署插件之一。本文介绍在IDEA下如何安装Jrebel及激活该插件。2.安装在Idea的File -> settings -> Plugins中搜素 Jrebel。点击安装:安装完成从之后需要对IDEA重启。这样Jrebel

2021-02-19 16:24:44 36

原创 关于springboot配置文件路径优先级

在springboot项目中,最重要的配置文件是application.yaml文件。然而这个文件究竟应该放置在什么位置呢?在实际操作的过程中,配置文件可以存在的路径如下表:配置文件位置说明file:./config/为于project目录下的config目录,实际上对应于jar文件同一目录的config目录。file:./projet目录。实际上对应于jar文件的同一目录。classpath:/config/jar包内的文件目录,对应代码的resource目录中的c

2021-02-02 15:00:23 37

原创 springBoot读取配置文件的注解@ConfigurationProperties及与@Value区别

在sprigboot中,处理配置文件最好的方法是采用@ConfigurationProperties注解。该注解能方便的将配置文件中的属性配置到具体的对象中。本文基于的springboot版本如下:plugins { id 'org.springframework.boot' version '2.4.2' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'idea'}1.如何使用@Con

2021-02-01 16:21:23 63 1

原创 springboot 项目的打开方式

1.生成springboot项目springboot项目有两种生成的方法,一是通过https://start.spring.io/网站,自定义生成,另外就是通过idea创建springboot项目。个人觉得方式一特别方便。操作如下:我们只需要打开https://start.spring.io/网站:选择合适的项目打开方式,和项目的metadata进行配置:此外还能方便的加入依赖的包。之后点击generate就能产生一个目录完备的zip包。在build.gradle文件中,已经将我们需要的依

2021-01-28 18:58:21 58

原创 对复杂if-else代码块的优化方案

1.1 问题提出对于很多码农而言,if-else可能是最高频的代码关键字,毕竟,这也比较符合人们二维思考问题的方式,试想大部分问题的答案都是只有两个维度,要么true,要么false,那么通过if-else的方式是再好不过了。当然,if-else固然好,但是在代码中过多的使用,或者反复的嵌套使用,那样就不好了。前几天看到了下面这张图,固然这张图比较夸张,但是也说明了,多重嵌套的if-else的不可取之处。今天本文就来聊聊,在java中,面对已经出现了的多重if-else嵌套的情况,我们应该怎么去优化

2021-01-22 15:39:42 44 1

原创 解决IDEA中采用gradle编译的控制台输出乱码问题

最近在学习netty的过程中,顺便将编译环境从maven换为了gradle,gradle的配置方式也是非常简单的,但是在实际使用的过程中,出现了乱码问题,就是控制台输出中文的时候,总会出现乱码。情况如下:我用JFrame写了一个netty的聊天室小程序。结果在后台采用system.out的时候,输出就变成了乱码:实际上在netty输出的过程中没有影响,我猜想可能idea的配置出现了问题。分别对idea的配置进行了检查:在File->Settings->Editor->File E

2021-01-11 11:39:34 53

原创 多线程基础(二十一):StampedLock源码分析

1.类结构及其注释1.1 类结构StampedLock是在java8中引入的一个新的并发工具,主要为了解决此前java7中Lock实现上的一些问题,如ReentrantReadWriteLock的锁饥饿问题。StampedLock是一个全新的Lock,其内部通过ReadWriteLockView、ReadLockView、writeLockView这三个内部类分别实现了Lock和ReadWriteLock接口。而WNode节点,则是一个链表的数据结构,其目的在于实现StanpedLock的CLH锁。

2020-12-30 19:42:18 81

原创 多线程基础(二十):CyclicBarrier源码分析

CyclicBarrier是java并发包中的常用工具之一,通常被用来与CountDownlatch对比。CyclicBarrier能够实现CountDownLatch的效果,此外还能重复使用,而CountDownLatch则只能做一次计数。但是对于实现的源码而言,CyclicBarrier对于CountDowLatch有着本质的不同。CountDownLatch基于AQS的等待队列实现。而CyclicBarrier则依赖于ReentrantLock的Condition。我们前面在介绍AQS的时候知道,Co

2020-11-16 15:07:10 76

原创 java中基本类型boolean在jvm中的具体实现

在前面在java中boolean类型占多少字节?一文中,对java的基本数据类型,boolean进行过一些简单的分析。在该文中得出,java的boolean类型,实际上存储的时候是4Byte,boolean的操作与int无异。但是在boolean数组中,则每个boolean的长度为1Byte。最近在极客时间学习深入拆解Java虚拟机专栏的时候,也看到类似的问题,现在按照极客时间学习的思路,对boolean的使用进行验证。$ echo 'public class Foo { public static

2020-11-13 17:54:18 86

原创 多线程基础(十九):Semaphore源码分析

文章目录1.类结构及注释1.1 类结构1.2 注释部分2.内部类Sync2.1 nonfairTryAcquireShared2.2 tryReleaseShared2.3 reducePermits2.4 drainPermits3.NonfairSync与FairSync3.1 NonfairSync3.2 FairSync4.构造方法4.1 Semaphore(int permits)4.2 Semaphore(int permits, boolean fair)5.其他方法5.1 acquire5.

2020-11-12 17:38:41 83

原创 ReentrantReadWriteLock的一些问题

前面对ReentrantReadWriteLock源码进行了分析,可以发现,ReentrantReadWriteLock揽括了公平锁、非公平锁,读锁、写锁等并发场景下常见的实现。相对于ReentrantLock,有者本质的提升。在ReentrantLock中,读锁和写锁都是同等地位的,读和写都是独占锁。那么在ReentrantLock中,获取锁的过程如下:可以看到,每次只有一个线程能获取到锁。读、写没有本质的不同,这样会造成ReentrantLock的性能比较低。将所有的操作都串行化处理。上图就是采

2020-11-11 19:55:57 36

原创 多线程基础(十八):ReentrantReadWriteLock源码分析

文章目录1.类结构及注释1.1 类结构1.2 注释说明2.成员变量及构造函数2.1 成员变量2.2 构造函数2.2.1 ReentrantReadWriteLock()2.2.2 ReentrantReadWriteLock(boolean fair)3. 核心内部类Sync3.1 常量3.2 count计数器3.3 成员变量3.4 抽象方法3.5 抽象方法在NonfairSync与FairSync中的实现3.5.1 NonfairSync3.5.2 FairSync3.6 其他方法4.实现类ReadLo

2020-11-09 18:33:26 53

原创 多线程基础(十七):Condition及ConditionObjet源码分析

文章目录1.Condition说明2 Condition接口2.1 Condition注释2.2 Condition的方法2.2.1 await2.2.2 awaitUninterruptibly2.2.3 awaitNanos2.2.4 await2.2.5 awaitUntil2.2.6 signal2.2.7 signalAll3.AQS中的ConditionObject实现3.1 类结构及成员变量3.2 重要方法3.2.1 await3.2.2 awaitNanos3.2.3 awaitUntil3

2020-11-05 18:11:28 33

原创 多线程基础(十六):CountDownLatch源码分析

文章目录1.类结构及注释部分1.1 类结构1.22. 内部类Sync3.构造方法4.其他方法4.1 await4.2 await(long timeout, TimeUnit unit)4.3 countDown4.4 getCount5. 总结1.类结构及注释部分1.1 类结构CountDownLatch是我们常用的并发工具,主要用于倒数计数等场景,如在zookeeper连接管理中用于初始化连接数。CountDownlatch是AbstractQueueSynchronizer的共享模式实现。实际上

2020-11-04 16:19:17 27

原创 多线程基础(十五):ReentrantLock源码分析

文章目录1.类结构及注释1.1 类结构1.2 类注释2.构造函数及成员变量2.1 ReentrantLock()2.2 ReentrantLock(boolean fair)3.公平锁与非公平锁的内部类3.1 Sync3.1.1 nonfairTryAcquire3.1.2 tryRelease3.2 NonfairSync3.3 公平锁4.其他方法4.1 lock4.2 lockInterruptibly4.3 tryLock4.4 unlock4.5 其他工具方法1.类结构及注释1.1 类结构Re

2020-11-03 16:26:00 34

原创 多线程基础(十四):AbstractQueuedSynchronizer源码分析

文章目录1.类结构及成员变量1.1 类结构和注释1.1.1 类结构1.1.2 注释1.2 成员变量及常量2.构造方法3.关键的内部类3.1 Node3.1.1 注释3.1.2 常量3.1.3 变量3.1.3.1 waitStatus3.1.3.2 其他变量3.1.4 构造函数3.1.4.1 Node()3.1.4.2 Node(Thread thread, Node mode)3.1.4.3 Node(Thread thread, int waitStatus)3.2 ConditionObject4.基

2020-11-03 11:04:38 30 1

翻译 Apache Kafka,Apache Pulsar和RabbitMQ的基准测试:哪一个是最快的MQ?

ApacheKafka是最流行的事件流处理系统。在这个领域中有很多同类的系统可以拿来比较。但是最关键的一点就是性能。Kafka以速度著称,但是,它现在能有多快,以及与其他系统相比又如何呢?我们决定在最新的云硬件上测试kafka的性能。为了进行比较,我们选择了传统的消息broker RabbitMQ和基于Apache Bookeeper的消息broker Apache Pulsar。我们要关注以下几点,1.系统吞吐量。2.系统延迟。因为他们是生产中事件流系统的主要性能指标,特别是吞吐量测试测量每个系统在利

2020-10-26 15:34:59 124 1

原创 多线程基础(十三):java中的FutureTask

文章目录1.类结构及常量、变量1.1 类结构1.2 常量1.3 变量2.构造函数2.1 FutureTask(Callable callable)2.2 FutureTask(Runnable runnable, V result)3.重要方法3.1 get()3.2 get(long timeout, TimeUnit unit)3.3 awaitDone3.4 cancel3.5 finishCompletion3.6 removeWaiter3.7 run3.8 runAndReset4.内部类Wai

2020-10-22 21:02:56 37 1

原创 java线程池(八):ForkJoinPool源码分析之四(ForkJoinWorkerThread源码)

文章目录1.类结构及其成员变量1.1 类结构和注释1.2 常量2.构造函数2.1 ForkJoinWorkerThread(ForkJoinPool pool)2.2 ForkJoinWorkerThread(ForkJoinPool pool, ThreadGroup threadGroup, AccessControlContext acc)3.重要的方法3.1 run3.2 定义的可扩展方法4.内部类InnocuousForkJoinWorkerThread5. ForkJoinPool中创建工作线程

2020-10-22 14:44:31 54

原创 java线程池(七):ForkJoinPool源码分析之三(ForkJoinTask源码)

文章目录1.类结构及其成员变量1.1 类结构和注释1.2 变量及常量2.实现方法2.1 抽象方法2.2 实现方法2.2.1 get()2.2.2 get(long timeout, TimeUnit unit)2.2.3 externalInterruptibleAwaitDone2.2.4 其他实现方法2.3 外部调用方法2.3.1 fork2.3.2 join2.3.3 invoke2.3.4 invokeAll3.异常机制3.1 异常table3.2 ExceptionNode3.3 异常的调用方法3

2020-10-21 20:11:25 64 1

翻译 Callable and Future in Java(java中的Callable和Future)

需要Callable的理由通常,我们有两种方式创建线程,一种方式是继承Thread类,另外一种方式是实现Runnable接口。然而,Runnable方式缺少的一个特性就是,当线程终止的时候,即run运行完成的时候,我们布恩那个让线程返回一个执行结果。为了之处这个特性,在java中就增加了Callable接口。Callable vs Runnable为了实现Runnable接口,需要实现不返回任何返回值的run方法,而对于callable,我们需要实现在完成的时候,返回接口的call方法,注意,线程不

2020-09-25 18:46:05 46

原创 java线程池(六):ForkJoinPool源码分析之二(WorkQueue源码)

文章目录1.类结构及其成员变量1.1 类结构和注释1.2 常量1.2.1 MAXIMUM_QUEUE_CAPACITY1.2.2 MAXIMUM_QUEUE_CAPACITY1.3 成员变量2.构造函数3.重要的方法3.1 push3.2 growArray3.3 pop3.4 poll3.5 pollAt3.6 nextLocalTask3.7 peek3.8 tryUnpush3.9 runTask3.10 execLocalTasks3.11 pollAndExecAll3.12 tryRemoveA

2020-09-25 17:34:27 95

原创 java线程池(五):ForkJoinPool源码分析之一(外部提交及worker执行过程)

文章目录1.ForkJoinPool总体介绍2 常量及成员变量2.1 常量2.2 成员变量3.构造函数3.1 ForkJoinPool(parallelism, factory,handler,asyncMode)3.2 ForkJoinPool(parallelism,factory,handler,mode,workerNamePrefix)3.3 ForkJoinPool()4. ForkJoinPool的基本组成5. ForkJoinPool外部任务的提交5.1 invoke5.2 execute5

2020-09-24 20:37:53 105

原创 java线程池(四):ForkJoinPool的使用及基本原理

文章目录1.ForkJoinPool是什么1.1 分治法1.2 工作窃取(work-stealing)2.简单使用2.1 不带返回值的计算2.2 带返回值的计算3.ForkJoin源码注释3.1 类注释3.2 关于原理的注释3.2.1 ForkJoinPool实现概述3.2.2 WorkQueues3.2.3 管理3.2.4 Joining Tasks3.2.5 Common Pool3.2.6 Style notes4.总结在前面学习了ThreadpoolExecutor线程池之后,我们知道,Threa

2020-09-22 17:40:11 229

翻译 A Java Fork/Join Framework(Doug Lea 关于java Fork/Join框架的论文翻译)

A Java Fork/Join FrameworkDoug LeaState University of New York atOswegoOswego NY 13126315−341−2688dl@cs.oswego.edu摘要本文描述了一种Java框架的设计、实现和性能,该Java框架用于支持一种并行编程风格,在该并行编程中,可以通过以下方式解决问题:在该框架中,通过(递归)将问题分解为并行解决的子任务,等待它们完成,然后合成结果来解决问题。总体设计是为Cilk设计的工作窃取框架的变

2020-09-22 11:20:59 191

原创 多线程基础(十二):Thread优先级分析

1.thread中的优先级在前面学习Thread源码的时候,提到了Thread可以设置优先级。其优先级通过setPriority方法进行设置。/** * The minimum priority that a thread can have. */public final static int MIN_PRIORITY = 1;/** * The default priority that is assigned to a thread. */public final static in

2020-09-21 11:22:49 56 1

原创 多线程基础(十一):interrupt深度分析

文章目录1.java的中断机制2.Thread提供的有关interrupt的方法2.1 interrupt2.2 interrupted2.3 isInterrupted3 interrupt对Thread各状态的影响3.1 NEW3.2 TERMINATED3.3 RUNNABLE3.4 BLOCKED3.5 WAITING/TIMED_WAITING4.总结在前面学习ThreadPoolExecutor的时候,我们知道,当线程池中的线程数量大于核心线程数的时候,或者开启了allowCoreThread

2020-09-17 17:43:32 57

原创 java线程池(三):ThreadPoolExecutor源码分析

文章目录1.类的结构及其成员变量1.类的基本结构1.2 成员变量及常量1.2.1 ctl1.2.2 workQueue1.2.3 workers1.2.4 mainLock & termination1.2.5 其他成员变量2.重要的内部类2.1 Worker2.2 拒绝策略类2.2.1 CallerRunsPolicy2.2.2 AbortPolicy2.2.3 DiscardPolicy2.2.4 DiscardOldestPolicy3. 构造函数3.1 ThreadPoolExecutor(

2020-09-16 19:24:52 57

原创 java线程池(二):聊聊newFixedThreadPool(1)和newSingleThreadExecutor()的区别

文章目录1.顺序性验证2.线程异常恢复机制3.本质区别4. FinalizableDelegatedExecutorService 以及DelegatedExecutorService5.unconfigurableExecutorService与unconfigurableScheduledExecutorService6 总结在第一部分中介绍完java中Executors的线程池创建的方式之后,实际上有一个非常好奇的问题。既然newFixedThreadPool(1)也能保证创建只有一个线程运行的线程

2020-09-14 19:43:58 268 1

原创 java线程池(一):java线程池基本使用及Executors

文章目录1.为什么需要线程池2.java中线程池的实现3.创建线程的工厂方法Executors3.1 newFixedThreadPool3.2 newSingleThreadExecutor3.3 newCachedThreadPool2.4 newScheduledThreadPool3.5 newWorkStealingPool4.线程池的使用方式5.总结在前面学习线程组的时候就提到过线程池。实际上线程组在我们的日常工作中已经不太会用到,但是线程池恰恰相反,是我们日常工作中必不可少的工具之一。现在开

2020-09-14 18:36:39 33

原创 一道多线程协同面试题的三种解决方案

最近看到一道线程协同的阿里面试题。(JAVA)有3 个独立的线程,一个只会输出A,一个只会输出L,一个只会输出I。在三个线程同时启动的情况下,请用合理的方式让他们按顺序打印ALIALI。三个线程开始正常输出后,主线程若检测到用户任意的输入则停止三个打印线程的工作,整体退出。这个题目实际上是在考察线程间协调。鉴于前面学习的线程间通信的三种方法,现在用三种方法来完成该问题。1.synchronized 配合 wait/notify首先用最经典的synchronized来实现。import jav

2020-09-13 19:34:53 59

原创 多线程基础(十):LockSupport源码及其使用

文章目录1.类注释说明2.主要方法2.1 park2.2 park(Object blocker)2.3 parkNanos(Object blocker, long nanos)2.4 parkUntil(Object blocker, long deadline)2.5 unpark3.应用测试3.1 测试 interrupt3.2 park & unpark4.总结在前面学习过java线程间通信的几种方式,分别是synchronized结合wait/notify。以及ReentrantLoc

2020-09-13 18:32:17 23

原创 多线程基础(九):守护线程、yield、join及线程组

文章目录守护线程2.yield3. join4. 线程组不经意间都已经在上一篇文章中聊到ReentrantLock了,但是回头一看,关于多线程基础的内容还有很多没涉及2到,而ReentrantLock却是属于比较高级的线程应用了。今天统一回顾下这些基础的知识点。守护线程在前面《多线程基础(二): Thread源码分析》中,我们提到了诸如守护线程,join等概念,现在来看看什么是守护线程。在java中,线程有两种,一种是用户线程,一种是守护线程。所谓守护线程,就是在线程创建之后,启动之前,通过setD

2020-09-11 20:16:10 32

原创 多线程基础(八):ReentrantLock的使用及与synchronized的区别

文章目录1.交替打印数字和阻塞队列2.可以被Interrupt3.支持超时4.配合Condition5.可重入性6.总结前面部分,我们着重讨论了synchronized的使用和wait、notify及notifyAll方法等并发的基础部分。今天,我们来学习另外一种解决方案。1.交替打印数字和阻塞队列还记得,前面一篇文章《什么?面试官让我用ArrayList实现一个阻塞队列?》中,描述了一个关于实现两个线程交替打印以及实现阻塞队列的例子,那么今天,我们来看看另外一种解决办法—ReentrantLock。

2020-09-10 21:27:48 36

翻译 Difference between notify() and notifyAll() in Java (在java中notify和notifyAll的区别)

notify()和notifyAll()以及wait()方法用于线程间的通信。通过调用wait()方法进入WaitSet的线程会一直处于WAITING状态,直到任何其他的线程在同一锁的对象上调用notify()或者notify()方法。限制的问题是,notify()和notifyAll()方法都是用来向处于WAITING状态的线程发送通知的,那么他们之间有什么区别,或者我们应该在哪使用notify()或者notifyAll方法?让我们先来看看notify的行文:class Geek1 extends

2020-09-09 20:40:54 24

原创 在java中boolean类型占多少字节?

文章目录1.八大基本数据类型2.jvm规范描述3.java字节码4.代码证明5.结论近看到一个特别有意思的面试题,就是面试官问boolean占多少字节。一时间还不知道如何回答。我们先来看看java中的基本数据类型。1.八大基本数据类型java提供了8大基本数据类型:数据类型长度位数默认值byte1Byte80short2Byte160int4Byte320long8Byte640float4Byte320.0fdou

2020-09-09 19:31:34 222 1

原创 多线程基础(七):关于HotSpot中notify方法不具备随机性的证明

文章目录1.实验一2.实验二3.问题分析4.HotSpot源码5.总结在前面关于wait/notify及notifyAll方法的时候,notify在源码的注释中说到notify选择唤醒的线程是任意的,但是依赖于具体实现的jvm。原文如下: * Wakes up a single thread that is waiting on this object's * monitor. If any threads are waiting on this object, one of them * is c

2020-09-09 14:49:11 83

原创 多线程基础(六):Object的wait方法以及notify与notifyAll的区别

文章目录1.生产者和消费者模型2. 死锁产生3.解决问题4.notify和notifyAll区别5.死锁产生的原因5.1 两个线程5.2 三个线程5.总结还记得前面用ArrayList实现阻塞队列的文章:《什么?面试官让我用ArrayList实现一个阻塞队列?》。我们通过synchronized并配合wait和notify实现了一个阻塞队列。在介绍完前文的synchronized关键字的基本使用之后,本文来对这些方法进行分析。1.生产者和消费者模型Producer代码如下:public class

2020-09-08 19:47:37 48

阿里云技术面试红宝书.7z

阿里云技术面试红宝书,阿里云开发者社区Offer 5000独家资料。阿里云技术面试真题公开。大数据、数据库领域。

2020-09-12

mysql-8.0-en.pdf

MySQL 8.0 Reference Manual 英文版本。深入学习mysql最佳技术文档。 Including MySQL NDB Cluster 8.0

2020-07-30

java函数速查手册常用函数

速查java函数 常用函数都有 很方便 对java初学者很有帮助

2009-11-23

Oracle九阴真经

Oracle九阴真经 chm帮助文档 7zip解压

2009-02-06

together for eclipse 2008 破解文件

together for eclipse 2008 破解文件 破解方法见压缩包中的破解说明

2011-01-06

北大青鸟的javaEE教程 初学者入门

北大青鸟的javaEE教程 初学者入门北大青鸟的javaEE教程 初学者入门

2009-11-23

PL_SQL基础.7z

PL_SQL基础.7z PL_SQL基础.7z

2009-02-06

Ora9iSQLRef.7z 帮助文档

Ora9iSQLRef.7z 帮助文档 7zip解压

2009-02-06

spring整合cxf 实现webservice

前几天在网上找了很多资料来学习webservice 发现都很难看懂 不过终于还是搞定了 现在吧自己的心得贴出来

2010-07-27

struts2-API.7z

struts2-API.7z struts2帮助文档

2009-02-06

j2ee14.7z 帮助文档

j2ee14.7z 帮助文档 7zip解压

2009-02-06

空空如也

空空如也

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

TA关注的人 TA的粉丝

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