自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

can_chen的博客

再小的帆也能远航

  • 博客(100)
  • 收藏
  • 关注

原创 巴图鲁面经(09.25)

一面(50min)讲一下你比较熟悉的设计模式(还问了模板方法模式,单例模式的使用场景,以及装饰器模式和代理模式的区别)ArrayList和LinkedList使用上的一些区别ConcurrentHashMap了解吗,jdk1.7的分段锁是如何实现的?Hashtable不也是线程安全的,为什么不使用它ConcurrentMap中的size方法是如何实现的?多线程操作下,如果一个线程在查size方法,一个线程在执行put方法,底层是如何控制每次计算出来的值是正确的?线程池的七大参数

2020-09-27 21:24:14 947 4

原创 捷信二面(09.25)

二面还是两个面试官,一个问基础一个问实习,时长还是一个钟问基础的那个面试官很有流程化的问下来,分别问了JVM、Java集合、Mysql、Linux、Spring框架JVM:内存模型,常用的参数,JVM优化,产生OOM的几种原因,模拟一个StackOverFlow的场景,类加载机制以及双亲委派模型,各个类加载器分别加载的是什么Java集合:主要问的是HashMap,包括底层实现,红黑树与其他平衡二叉树的区别,红黑树的结构,红黑树的优势,平衡二叉树插入或者删除一个元素之后如何左旋或者右旋,底层扩容机制,

2020-09-25 17:58:55 486 3

原创 JVM之垃圾收集器

新生代垃圾收集器Serial:单线程垃圾收集器,当垃圾收集线程工作时,会导致所有用户线程暂停运行(Stop The World);这会给用户带来很不好的体验,就相当于你的电脑每运行一小时就要暂停响应五分钟,是很不好的体验ParNew:是Serial垃圾收集器的多线程并行版本,多线程并行指的是支持多条垃圾回收线程同时运行,但是还是会产生Stop The World;只是可以缩短用户线程暂停响应的时间Parallel Scavenge:与ParNew垃圾收集器的区别在于关注点不同,ParNew关注的是如

2020-09-24 21:28:02 225

原创 蘑菇街一面凉经(09.24)

HashMap和Hashtable的区别,底层数据结构分别是什么?Hashtable如何控制key value 不为空?HashMap为什么要引进红黑树?为什么不用其他的平衡二叉树之类的?它的优势在哪里?链表会转化为红黑树的两个条件是?HashMap发生哈希冲突,新节点是插入到链表头部还是链表的尾部,头部倒序插入死循环是怎么产生的?谈一谈CMS垃圾收集器?String a=“abc”;String b=new String(“abc”);a==b;执行结果返回true还是f..

2020-09-24 17:18:53 383 2

原创 可酷淘面经(9.22)

可酷淘公司牛客上应该没有他的相关信息,也没有啥笔经面经的,我应该是第一个!这是一个很小的游戏公司,当时HR在BOSS直聘上联系我,约我过去面试(游戏服务端开发),想着积累下面试经验也可以呀,就应邀了;一共笔试1小时+一面1小时+二面1小时,觉得他们公司的面试问题挺有意思的,也挺有技术含量的,所以就想着可以总结一下,写一写面经【现场笔试】时长一个小时笔试题分选择题和编程题,选择题考察了一些数学上的概率问题以及Java基础和数据结构;三道编程题是:①字符串转整数(要求满足代码的鲁棒性和考虑大数问题)②斐

2020-09-24 00:27:07 2970 7

原创 Mybatis的一级缓存和二级缓存

由于在最近的面试中,多次被问到Mybatis的一级缓存和二级缓存,因此在此进行总结,文章中的代码截图和最后的缓存执行顺序图摘抄自B站up主“狂神说”的Mybatis视频讲解,以下附上视频链接:https://www.bilibili.com/video/BV1NE411Q7Nx?p=26【一】Mybatis的一级缓存和二级缓存一级缓存: SqlSession级别,也叫本地缓存,默认开启,只要在同一个SqlSession中,执行相同的查询语句,并且查的是同一个mapper.xml文件,那么会走一级缓存,

2020-09-22 10:55:55 650

原创 捷信一面(09.21)

捷信一面是两个技术官,视频面试,面试时长是60多分钟捷信的面试体验应该是秋招以来面的这些公司中体验最好的一次了,没有之一,两个面试官都非常的nice,人挺好的!全程下来就是面试官提出一个简单的问题,然后就一直深挖下去,问底层问细节,直到我答不出来就转下一个问题~~~ArrayList和LinkedList的区别,添加一个元素的时间复杂度各是多少,既然ArrayList添加元素效率没有LinkedList高,为什么我们平时用的比较多的还是ArrayList?将一个Map集合变成栈,如何实现?(我的思

2020-09-22 00:34:19 475

原创 线程池相关

池化技术的出现是为了优化资源的使用,常见的池化技术有:线程池、JDBC连接池、内存池、对象池……线程池的好处有:线程复用,管理线程,控制最大并发数(假设线程池有5个线程,那么最大并发数为5,当然,还要考虑电脑的CPU是几核的)传统方式创建线程下面的代码例子是使用传统的方式创建10个线程,这样做的弊端是频繁的创建线程和销毁线程会导致非常大的系统开销;从代码的运行结果也可以看到每个线程都是不一样的,也就是线程用完即销毁,用时再创建,并没有实现复用public static void main(Stri

2020-09-20 16:25:56 275

原创 线程安全的集合——ConcurrentHashMap

为什么HashMap集合是线程不安全的?① 同时put碰撞导致数据丢失:多个线程同时执行put操作,计算出来的hashcode值相等,插入到同一位置导致有的数据被覆盖② 同时put扩容导致数据丢失:多个线程执行put操作时同时发现需要扩容,也会发生数据丢失③ 死循环导致CPU100%ConcurrentHashMap JDK1.7的底层实现Java 7中的ConcurrentHashMap最外层是多个segment,每个segment的底层数据结构与JDK 1.7的HashMap类似,是基于数组加

2020-09-19 22:07:54 556 1

原创 BlockingQueue(阻塞队列)

BlockingQueue是一个接口,继承于Queue接口,而Queue接口又继承于Collection;BlockingQueue接口常用的实现类有ArrayBlockingQueue(基于数组实现)和LinkedBlockingQueue(基于链表实现),BlockingQueue四组常用的API是:1. 操作队列失败时会抛出异常add(入队/添加,当队列满的时候抛出异常)remove(出队/删除,当队列空的时候抛出异常)element(查看队首元素,当队列空的时候抛出异常)2. 操作队列失

2020-09-19 21:28:20 329

原创 CopyOnWriteArrayList和CopyOnWriteArraySet

对于ArrayList和HashSet集合,都是线程不安全的,在并发操作下会出现问题,报出ConcurrentModificationException(并发修改异常),虽然他们也有对应的线程安全类,例如ArrayList对应有Vector,是线程安全的,但是看了底层源码都知道,Vector类底层的很多方法都是加了synchronized关键字去加锁实现线程安全,这样一来会导致效率非常低下,所以在并发操作下,一般也不会去使用它集合工具类Collections里面给我们提供了可以将线程不安全的类转换为线程安

2020-09-19 21:21:10 471

原创 凡科面经(09.04)

【一】 笔试(60min)题型包括单选+多选+判断+1道解答题考的比较基础,很多代码分析题,最后的解答题没啥思路写不出来~【二】一面(65min)一面主要问基础,底层问的挺多,多线程和java锁这块占了20min左右谈谈你对多线程的了解谈谈你对synchronized锁的理解,锁的粒度的是什么,一个线程怎么去判断synchronized锁已经被占用,底层实现是什么?synchronized锁方法和锁代码块的区别是什么,你平时写代码怎么用synchronized锁,举例~Concurrent

2020-09-04 23:54:44 1252 7

原创 java序列化和反序列化

先回顾一下java流之间的关系:序列化: 指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点(网络传输)。这个过程称为序列化,通常是指将数据结构或对象转化成二进制的过程。序列化的好处就是便于运输和存储反序列化: 把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程java代码实现序列化和反序列化public class Main { public static

2020-08-17 13:20:59 336

原创 关于力扣上链表题目的一个重要细节

最近几天在力扣上刷关于链表的题目,发现了一个问题,就是出现了执行代码的时候正常,但是在提交代码的时候就出现“解答错误”,并且代码在本地测试也是正常无误的,最终,找出了问题的所在,就是链表头节点导致的,一般来说,单链表会设置一个头节点,这个头节点不存放任何具体的数值,用来指向链表的第一个节点,所以在解题的时候我都会先用if (head.next == null) 这段代码来判断链表是否为空,因为head.next指的是链表的第一个存放数值的节点,也就是真正意义上的第一个节点,而我在leetcode上提交的代码

2020-08-09 00:36:43 1072 2

原创 Spring之面试常问的知识点

Spirng框架是非常重要的,是我们学习其他框架的一个基础,Spring中有很多重要的知识点,例如IOC、DI、AOP等,Spring的相关知识也是面试官常问的一个模块,所以我们有必要去了解一下Spring底层的一些实现原理,以下整理了Spring在面试中经常被问到的一些问题:1. Spring Bean 的作用域①singleton:单例作用域,默认,用到了单例模式创建bean②prototype:原型作用域,用到了原型模式创建bean③request:同一个 Http Request 共享一个

2020-08-06 22:11:00 395

原创 设计模式之代理模式

代理模式属于结构型模式,是23种设计模式中较为重要的一种,代理模式分为静态代理和动态代理,动态代理又分为基于接口实现的动态代理和基于子类实现的动态代理;在jdk源码中,很多底层的实现也是基于代理模式的,例如创建线程的方式之一实现Runnable接口就使用了静态代理模式,而Spring框架最为重要的AOP的实现是基于动态代理模式,可见,学习代理模式是我们能看懂底层源码实现原理的一个基础。静态代理关于静态代理,我们以小明结婚为例,看以下代码://代理对象和真实对象共同实现的接口,里面有结婚方法inter

2020-08-05 23:50:52 2501

原创 Dockerfile文件定制镜像

Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。我们一般会使用Dockerfile 文件来定制镜像。我们知道通过docker commit可以提交一个镜像,其实也是在原有镜像的基础上定制新的镜像,但实际中我们应该慎用docker commit来定制镜像,原因就是使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人

2020-07-12 15:45:37 600

原创 Docker常用命令

Docker常用命令1. 帮助命令docker version # 查看docker版本信息docker info # 查看docker系统信息,包括容器和镜像的数量docker 命令 --help # 查看命令的帮助信息,可以看到命令的所有选项2. 镜像命令# 1. 查看镜像docker images # 列出本地所有的镜像docker images -a # 列出本地所有的镜像(含中间映像层,

2020-07-12 15:05:54 548

原创 阿里云容器镜像服务

1. 镜像加速器如果我们已经购买了阿里云服务器,并且在服务器里面安装Docker,那么在安装完Docker之后,我们可以配置一下阿里云的镜像加速器;使用镜像加速器的好处就是一般我们想要拉取镜像都会从Docker Hub上拉取,但是这个站点在国外,对于我们来说使用很不方便,下载非常慢,而国内的阿里云上有自己已经拉取过来的镜像可以供我们直接使用,但是如果我们使用的镜像阿里云上面没有,那么我们也可以借助阿里云镜像加速器来拉取镜像。镜像加速器的获取步骤:登录阿里云官网(https://www.aliyun.c

2020-07-12 13:12:49 5200

原创 项目部署的完整流程

作为一个合格的程序猿,仅仅会打代码还是远远不够的,项目的部署也是我们必须要会的操作,也就是所谓的上线,将我们本地开发好的项目部署到远程服务器上,使得任何机器都可以通过我们远程服务器的公网ip或者域名加上端口号访问到我们的项目。这篇博客详细的列出每个步骤,并且也列举了在部署过程中常见的问题,看完这篇文章,你一定会有所收获!首先,我先给大家捋一下项目部署的流程:环境搭建: 我们以当下最流行的springboot项目为例,最终打成的是一个jar包,jar包要在远程服务器上跑起来,环境搭建是第一步,也就是安

2020-07-09 12:26:04 71297 6

原创 本地Navicat连接远程数据库

之所以写这篇文章是因为今天在本地想通过Navicat去连接远程服务器的mysql数据库时出现了问题,一直连接不上,试了很多种解决方法,阿里云服务器上的3306端口也开放了,还是不行,最终找到了解决方案,在此进行分享!首先,我的问题是:想在本地去连接远程服务器mysql数据库,并且是以root用户连接,但是被拒绝访问了,报错的提示是:Access denied for user 'root'@'我本机的公网ip(using password:YES) 当时非常郁闷,报错提示信息显示的ip地址不是我远程阿里云

2020-07-07 16:33:51 4601 1

原创 Windows与Linux文件互传的几种方式

在对Linux系统操作过程中,我们经常会需要从Windows上传文件或是将文件上传到Windows上,也就是实现Windows与Linux文件互传,以下是本人在学习和工作的过程中学到的几种方式:1. 使用xftpxftp的下载链接如下:链接:https://pan.baidu.com/s/1U6cSfjrLas4Z-1jcqnfASA 提取码:23i5使用xftp进行文件传输的步骤: 安装完xftp之后,xshell操作界面就会显示xftp的图标,点击该图标之后就可以就行文件互传,左边是windo

2020-06-29 20:07:36 6436

原创 Git常用命令

Git命令非常之多,本人也是经常会记混一些命令,下面总结了在日常开发中常用的一些Git命令,方便日后查看,接下来还会继续进行补充!设置用户名和邮箱(用户标识,必须设置)git config --global user.name “用户名”git config --global user.email 邮箱查看Git所有配置:git config -l查看Git系统配置:git config --system --list查看Git全局用户配置:git config

2020-06-28 19:07:40 633 1

原创 设计模式之适配器模式

工作原理:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作从用户的角度看是看不到被适配者的,是解耦的适配器模式属于结构型模式,主要分三类:类适配器模式、对象适配器模式、接口适配器模式类适配器模式假设我们现在有这么一个需求:需要给我们的手机充电,手机充电只能使用5V的电压,但是我们家里的插座却是220V的电压,也就是说手机无法直接使用220V的插座进行充电,那么现在就需要一个适配器来进行5V电压和220V电压的转换,这个适配器

2020-06-26 13:06:42 615

原创 jdk1.8新特性——Optional类

Java 8增加了很多新的工具类,这里要介绍的就是在开发中非常有用的一个jdk8新增的工具类,java.util.Optional;Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。总而言之,Optional 类的引入很好的解决空指针异常,给无数开发者带来便利。我们先看看下面的例子

2020-06-21 15:58:32 1163 2

原创 jdk1.8新特性——方法引用

方法引用主要是为了进一步简化Lambda表达式而生,采用的语法是双冒号 :: 写法,主要有以下几种情况:通过对象名引用成员方法public class Main { public static void testA(InterfaceA a){ a.show(); } public static void main(String[] args) { //Lambda表达式写法 testA(()->{ ClassA c=new ClassA(); c.say();

2020-06-21 15:54:04 745

原创 jdk1.8新特性——Stream流式编程

Stream流是Java 8新加入的最常用的流接口,位于java.util.stream包下(java.util.stream.Stream ),这并不是一个函数式接口,接口里面包含了很多抽象方法,这些方法对于Stream流的操作都是至关重要的,最常见的方法有filter、map、foreach、count、limit、skip、concat获取Stream流的两种方法所有的 Collection 集合都可以通过 stream 默认方法获取流,stream()方法是Collection集合接口的一个默

2020-06-21 15:51:07 2356

原创 jdk1.8新特性——Lambda表达式与函数式接口

书到用时方恨少,由于前几日在对接公司的一个项目中,发现该项目用到了很多jdk8的新特性,代码非常的简洁,但是却由于对jdk8的新特性了解甚少,以致很多代码逻辑都看不懂,所以花了些时间学习了jdk8比较重要的几个新特性,并在此进行总结!Lambda表达式在java集合中,通过forEach方法遍历集合就用到了jdk1.8的新特性:Lambda表达式与函数式接口先看forEach方法的源码:default void forEach(Consumer<? super T> action) {

2020-06-21 15:47:30 942

原创 Git进阶——git stash

git stash工具对于工作区和暂存区,有一个特别重要也是容易被大家忽略的点:那就是对于所有分支而言,工作区和暂存区是公共的。也就是说,未add的内容不属于任何一个分支, 未commit的内容也不属于任何一个分支,git 切换分支时会把未add或未commit的内容带过去。假设有这么一个需求,你现在在develop分支上进行某个功能的开发,当你开发到一半的时候,你的leader告诉你说master分支上出现了一点紧急bug,需要你立即修复,那么你只能放下手头的工作去修复bug了,在你新建一个hotfi

2020-06-20 01:30:58 2103 2

原创 关于Object类的clone()方法

clone()方法是用于浅克隆或者深克隆一个java对象的,但是要注意一个误区:clone方法是Object类的,并不是Cloneable接口的,Cloneable只是一个标记接口,标记接口是用于标记实现该接口的类具有某种该接口标记的功能,常见的标记接口有三个:Serializable、Cloneable、RandomAccess,没有实现Cloneable接口,那么调用clone方法就会爆出CloneNotSupportedException异常。要使得一个java类可以实现克隆,那么该类就需要实现Cl

2020-06-17 19:26:15 1853

原创 策略模式在jdk源码中的应用

关于策略模式的介绍可以参考上一篇博客:https://blog.csdn.net/can_chen/article/details/106745298策略模式的典型例子设计一个网上书店,该系统中所有的计算机图书(ComputerBook),每本都有10%的折扣;所有的语言类图书(LanguageBook),每本有2元的折扣;小说类图书以每100元有10元的折扣,用策略模式设计该系统模式类图:代码实现://策略接口public interface BookStrategy { //提供计

2020-06-14 18:51:43 953

原创 设计模式之策略模式

策略模式(Strategy Pattern)我们先通过一个例子来引出策略模式:猴子问题:有各种各样的猴子,婴猴,长臂猿,玩具猴等,猴子有各种行为,比如叫爬树、叫、直立行走等;现在我们需要对各种猴子进行一个设计,使得每种猴子都可以显示自己的种类信息。编码如下://抽象的猴子,包含猴子普遍拥有的行为public abstract class Monkey { public abstract void show(); public void quack(){ System.out.printl

2020-06-14 13:50:34 604

原创 设计模式之迭代器模式

迭代器模式(Iterator Pattern)迭代器模式是非常常见的设计模式,属于行为型模式,迭代器模式提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。迭代器模式的优缺点优点:封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。提供了一种 设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责

2020-06-06 21:51:15 418

原创 IP地址相关知识点

Internet中的主机地址是用IP地址来唯一标识的,换言之,就是每台主机都有一个唯一的IP地址。每个IP地址都有4个小于256的数字组成,数字之间用"."分开,Internet的IP地址共有32为,4个字节,可以用二进制表示也可以用十进制表示。IP地址的分类Internet中的地址可分为5类:A类、B类、C类、D类和E类A类:网络地址占1个字节(8位),定义最高位为0来标识此类地址,余下7位为真正的网络地址,支持1~126个网络。后面的三个字节(24位)为主机地址,因此每个A类网络中最大的主机数为

2020-05-23 16:48:26 2752

转载 Idea自动生成代码神器EasyCode

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、 Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。今天要介绍的EasyCode是IDEA的一个代码生成器插件,使用方法比AutoGenerator还要简单,无需编写代码生成器的相关配置,直接使用!转载:https://mp.weixin.qq.com/s/qeVKeEwslx0n7CtC1LzchQ..

2020-05-11 16:07:13 1202

原创 TCP三次握手与四次挥手

TCP属于传输层协议,是整个TCP/IP协议族中最重要的协议之一。它在IP提供的不可靠数据服务的基础上为应用程序提供了一个可靠的 、面向连接的 、全双工 的数据传输服务。​TCP报文格式序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报

2020-05-11 14:42:48 527

原创 Ngrok——无需部署到服务器别人也能访问到你的本地项目

一般来说,我们在本地写好一个项目之后,要让别人能够访问到我们的项目是通过Linux部署到远程服务器上或者通过比较简单的宝塔一键部署,这两者的本质都是需要部署到远程服务器上才能让被人访问到我们的本地项目。而Ngrok是一款内网穿透工具,可以通过外部域名映射到本地端口,什么是内网穿透?使用内网穿透,能够直接将开发者电脑这个内网的IP映射到公网,将开发人员的机子作为服务端,有开发环境,又有tomcat,数据库等等,换言之,使用内网穿透,开发者无需将项目部署到远程服务器是上,只需要在本地上部署好,并让项目在本地跑

2020-05-09 15:42:06 1671

原创 String字符串的常见题型汇总

String字符串的题型是非常常见的,我个人在牛客网上刷题也遇到过很多次,虽然题目不难,但是如果一些细节不加以注意,就会做错,接下来我将列出常见的几种类型题,并通过内存图解的方式进行一一解答,如有不对的地方,欢迎指正!(所画内存图解都是基于JDK1.8的,也就是字符串常量池已经移到堆内存中了)1.字符串常量String s1="hello";String s2="hello";System...

2020-05-07 18:19:50 762

原创 淘宝 NPM 镜像解决软件下载速度慢的问题

今天在官网下载Git的时候,发现下载速度非常慢,又恰好在学习Git的视频中发现了很有用的东西,也就是使用淘宝NPM镜像下载,可以解决从官网下载速度慢的问题,通过镜像下载速度非常的快,必须推荐!阿里云镜像站的网址:https://developer.aliyun.com/mirror/NPM?from=tnpm首页截图:如果在阿里云镜像站中找不到我们要的镜像,可以直接上百度找,以下附上我找g...

2020-05-06 13:28:59 1526

原创 解决智慧树考试酷无法复制粘粘的问题

相信用过智慧树和考试酷的大学生在做章节测试和考试等都会遇到无法复制粘粘的困惑,这篇博客总结了几个步骤,希望能帮助到大家!复制首先在我们答题的页面,按住F12(有的电脑是Fn+F12)点击下图圈出来的位置,选择我们要复制的地方我们将鼠标移动要复制的文字上,单击,就可以看到右边对应有显示蓝色区域右键右边蓝色区域,选择Edit as HTML(编辑为HTML),即可实现复制!...

2020-05-06 12:26:42 30753 10

空空如也

空空如也

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

TA关注的人

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