自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Java并发编程】面试题

文章目录并发编程基础为什么有多线程守护线程是什么线程的生命周期Runnable和Callable区别run()与start()方法区别wait方法和sleep方法的区别Thread.interrupt() 方法的工作原理什么是线程上下文切换可见性、原子性、有序性问题产生原因线程安全相关volatile原理happens-before原则是什么synchronized原理synchronized与Lock区别Java中如何进行锁优化Java 锁升级过程死锁、活锁、饥饿区别乐观锁与悲观锁公平锁与非公平锁可重入锁

2021-10-10 09:38:47 505

原创 【Java基础】面试题

文章目录01 谈谈你对Java平台的理解?"Java是解释执行"这句话对吗?02 什么是面向对象?它与面向过程有什么区别?03 谈谈接口和抽象类有什么区别?04 什么是内部类?匿名内部类呢?05 Java 中的几种基本数据类型是什么?各自占用多少字节?06 String、StringBuffer、StringBuilder有什么区别?String为什么是不可变的?07 equals()与==和hashcode()的区别与联系?08 int和Integer有什么区别?09 Exception和Error有什么

2021-08-31 15:54:51 297

原创 【计算机网络】面试题

文章目录简述一下计算机网络体系结构应用层运输层网络层数据链路层物理层TCP与UDP协议如果设计一个聊天系统,应该用 TCP 还是 UDP?为什么?TCP 如何保证传输可靠性?ARQ协议停止等待ARQ协议连续ARQ协议什么是 TCP 滑动窗口?什么是拥塞控制?TCP 三次握手和四次挥手是什么?三次握手第2次握手传回了ACK,为什么也传回了SYN?为什么要三次握手?两次握手不行吗?四次挥手为什么要四次挥手?为何一定要等 2MSL ?什么是 TCP 粘包/拆包?有什么解决办法呢?粘包拆包本质原因如何解决粘包/拆.

2021-08-02 15:13:20 569

原创 一文搞懂线程池原理——Executor框架详解

文章目录1 使用线程池的好处2 Executor 框架2.1 Executor 框架结构2.2 Executor 框架使用示意图2.3 Executor 框架成员2.3.1 Executor 与 ExecutorService2.3.2 Future接口2.3.3 Runnable接口和Callable接口2.3.4 Executors创建线程池3 ThreadPoolExecutor 详解3.1 线程池状态转换3.2 线程池处理流程3.2.1 execute()方法3.2.2 Worker线程管理3.2.

2021-06-19 17:16:34 1449 3

原创 并发容器总结

文章目录1 JDK 提供的并发容器简介2 Map2.1 ConcurrentHashMap2.2 ConcurrentSkipListMap3 List3.1 CopyOnWriteArrayList简介3.2 CopyOnWriteArrayList实现原理3.3 读取和写入源码简析4 Set5 Queue5.1 阻塞与非阻塞5.2 ConcurrentLinkedQueue5.3 阻塞队列5.3.1 ArrayBlockingQueue5.3.2 LinkedBlockingQueue5.3.3 Pri

2021-06-19 00:58:30 259

原创 队列同步器(AbstractQueuedSynchronizer)源码简析

文章目录1 AQS概述2 AQS常用方法2 AQS实现分析2.1 同步队列2.1.1 入队2.1.2 出列2.2 同步状态2.2.1 独占式(EXCLUSIVE)2.2.2 共享式(SHARED)2.2.3 超时获取方式2.3 阻塞和唤醒线程2.3.1 parkAndCheckInterrupt2.3.2 unparkSuccessor2.3.3 LockSupport3 总结参考资料文章后续于https://github.com/zgkaii/CS-Study-Notes更新,欢迎批评指正!1 A

2021-06-09 15:33:24 506

原创 JVM常见命令行及图形工具

目录JDK 命令行工具jps:查看所有 Java 进程jinfo:实时地查看和调整虚拟机各项参数jstat:监视虚拟机各种运行状态信息jmap:生成堆转储快照jhat:分析 heapdump 文件jstack :生成虚拟机当前时刻的线程快照jcmd:执行 JVM 相关分析命令(整合命令)JDK 可视化分析工具jsonsole:Java 监视与管理控制台连接 Jconsole查看 Java 程序概况内存监控线程监控VM概要jvisualvmVisualGCjmc文章后续更改会放置于:https://git

2021-05-29 15:38:12 444 1

原创 JVM常用启动参数

目录JVM常用启动参数系统属性参数运行模式参数堆内存设置参数显式指定堆内存`–Xms`和`-Xmx`显式新生代内存显示指定永久代/元空间的大小其他常用参数GC设置参数垃圾回收器GC记录分析诊断参数JavaAgent参数文章放置于:https://github.com/zgkaii/CS-Study-Notes,欢迎批评指正!JVM常用启动参数JVM启动参数的前缀主要有-、-D、-X、-XX、+/-、:以-开头为标准参数,所以的JVM都要实现这些参数,并且向后兼容。例如-server。-D

2021-05-29 10:07:29 4807 1

原创 记WSL下MySQL安装和使用BUG

这里完全按照WSL官网安装MySQLTo install MySQL on WSL (Ubuntu 18.04):Open your WSL terminal (ie. Ubuntu 18.04).Update your Ubuntu packages: sudo apt updateOnce the packages have updated, install MySQL with: sudo apt install mysql-serverConfirm installation and

2021-05-26 14:00:21 598

原创 Windows压力测试工具SuperBenchmarker

Windows系统下压测工具SuperBenchmarker,俗称sb。安装以管理员身份打开powershell。运行(先关闭防火墙):Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object

2021-05-24 17:07:53 2583

原创 算法 - 十大经典排序算法简析

十大经典排序算法-简析1 冒泡排序(Bubble Sort)2 选择排序(Selection-Sort)3 插入排序(Insertion-Sort)4 希尔排序(Shell Sort)5 归并排序(Merge Sort)5.1 自顶向下归并排序5.2 自底向上归并排序6 快速排序(Quick Sort)7 堆排序(Heap Sort)7.1 堆(1)堆中插入元素(2)堆中删除元素7.2 堆排序(1)建堆(2)排序8 计数排序(Counting So.

2021-05-18 17:15:24 261 2

原创 04-Netty网络程序优化

文章目录TCP 粘包/拆包什么是 TCP 粘包/拆包?有什么解决办法呢?为什么会出现粘包 / 拆包?粘包拆包本质原因如何解决粘包/拆包?Netty二次编码为什么需要一次编解码和二次编解码呢?一次编解码和二次编解码可以合并吗?Netty 中如何快速区分一次编解码和二次编解码呢?常见的二次编解码方式Netty 长连接、心跳机制了解么?Netty 的零拷贝了解么?文章放置于:https://github.com/zgkaii/CS-Study-Notes,欢迎批评指正!TCP 粘包/拆包什么是 TCP

2021-04-14 11:20:04 238

原创 03-Netty运行原理

文章目录一、创建Netty程序1.1 服务端1.2 客户端1.3 启动测试二、Netty运行原理2.1 Netty启动与运行流程2.2 Netty运行原理文章放置于:https://github.com/zgkaii/CS-Study-Notes,欢迎批评指正!一、创建Netty程序1.1 服务端public class EchoServer { static final int PORT = Integer.parseInt(System.getProperty("port", "88

2021-04-14 11:17:24 211

原创 02-Netty模型架构

目录一、Netty架构设计1.1 功能特性1.2 核心组件1.2.1 Bootstrap&ServerBootstrap(启动引导类)1.2.2 EventLoop(事件循环)(1)NioEventLoopGroup(2)NioEventLoop1.2.3 ByteBuf(字节容器)1.2.4 Channel(网络操作抽象类)1.2.5 ChannelHandler(消息处理器)1.2.6 ChannelHandlerContext1.2.7 ChannelFuture(操作执行结果)1.2.8 C

2021-04-14 11:09:33 261 1

原创 01-IO模型(BIO、NIO、AIO)

目录一、IO模型分类1.1 阻塞型 IO1.2 非阻塞型 IO1.3 I/O 多路复用1.4 信号驱动 I/O1.5 异步 I/O1.6 五大 I/O 模型比较二、BIO、NIO与AIO2.1 BIO2.1.1 传统 BIO2.1.2 伪异步 IO1.3 代码示例2.2 NIO (New I/O)2.2.1 NIO 简介2.2.2 NIO与BIO的区别(1)Non-blocking(非阻塞)(2)Buffer(缓冲区)(3)Channel (通道)(4)Selector (选择器)2.2.3 代码示例2.3

2021-04-14 10:59:46 644

原创 WSL配置GoLang开发环境

自动安装更新版本设置环境变量测试安装go tools从官方github仓库中拉取来自官方的tools按提示拉取非官方工具文章放置于:https://github.com/zgkaii/CS-Notes-Kz,欢迎批评指正!自动安装$ sudo apt install golang-go但是!用这样的办法自动安装的golang并非最新版。更新版本卸载旧版本$ apt remove golang-go下载,这里选择1.15.2版本$ wget https://st.

2021-03-26 15:11:43 3197

原创 算法 - 位运算

目录位运算基础位运算符概览基础应用实战演练只出现一次的数字 III比特位计数N皇后参考位运算基础位运算符概览符号描述运算规则&与两个位都为1时,结果才为1|或两个位都为0时,结果才为0~非~1 = 0 , ~0 = 1^异或两个位相同为0,相异为1<<左移各二进位全部左移若干位,高位丢弃,低位补0>>右移各二进位全部右移若干位,对无符号数,高位补0;有符号数,各编译器处理方法不一样,有的补符号位

2021-03-21 23:41:45 176

原创 算法 - 深度优先遍历与广度优先遍历

深度优先搜索基本概念经典举例括号生成单词搜索树的前序遍历广度优先搜索基本概念经典举例单词接龙树的层序遍历深度优先搜索基本概念深度优先搜索(Depth-First-Search,简称DFS)与是一种用于遍历或搜索树或图的算法,其执行过程类似于树的前序遍历。其思想是,从图中某个顶点v出发尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点.

2021-03-19 16:19:05 824

原创 算法 - 贪心算法与动态规划

目录贪心算法基本概念经典举例教室调度跳跃游戏动态规划基本概念经典举例状态转移表状态转移方程高阶实战最长公共子序列莱文斯坦距离推荐阅读贪心算法基本概念贪心算法(Greedy)是在每一步选择中都采取在当前状态下最好或者最优(即最有利的)选择,从而希望导致结果是全局最好或最优的算法(实际上考虑的是局部最优解)。适用贪心算法的场景:局部最优策略能导致产生全局最优解。当问题能够分解成子问题解决,并且每个子问题的最优解能递推到最终问题的最优解(这种子问题最优解被称为最优子结构)。经典举例教室调度以《算法图

2021-03-14 21:22:05 314

原创 算法 - 分治与回溯

目录分治基本概念经典举例回溯基本概念经典举例参考分治基本概念分治算法(divide and conquer)和核心思想正如其字面含义,分而治之,就是把一个复杂问题分成两个或者更多的相同和相似的问题,直到最后问题可以简单的直接求解,原问题的解即是子问题解的合并。这个定义看起来类似递归的定义,区别在于分治算法是一种处理问题的思想,而递归是一种编程技巧。实际上,分治算法一般比较适合用递归来实现,当然也可以用迭代来实现,这也是区别之一。递归算法从本质上来就是分治算法,无非就是有些问题递归需要将原问题分解成多

2021-03-14 21:17:55 825

原创 算法 - 递归与迭代 区别与联系

目录迭代递归基本概念应用场景尾递归递归与迭代区别递归与迭代的转换参考迭代迭代(iteration)是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。 每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。利用迭代算法解决问题,需要做好以下三个方面的工作:确定迭代变量建立迭代关系式对迭代过程进行控制以计算n的阶乘n!为例,先计算1乘2,然后得到结果再乘以3,在用得到结果乘以4…一直乘到n。用Java代码表示: public sta

2021-03-07 22:53:53 4864

原创 Leetcode 题解 - 栈和队列

文章目录1. 用栈实现队列2. 用队列实现栈3. 最小值栈4. 有效的括号5. 每日温度6. 下一个更大元素 II7. 柱状图中最大的矩形8. 接雨水1. 用栈实现队列232. Implement Queue using Stacks (Easy)Leetcode / 力扣栈的顺序为后进先出,而队列的顺序为先进先出。使用两个栈实现队列,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被反转,此时就是先进先出顺序。public class MyQueue {

2021-02-24 21:01:27 170

原创 Leetcode 题解 - 链表

1. 找出两个链表的交点160. Intersection of Two Linked Lists (Easy)Leetcode / 力扣设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部开始访问链表 B;同样地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。

2021-02-23 10:58:53 196

原创 Leetcode 题解 - 数组与矩阵

数组1. 移动零2. 最大连续 1 的个数3. 加一4. 删除排序数组中的重复项5. 合并两个有序数组6. 盛最多水的容器7. 旋转数组8. 三数之和9. 有效的数独矩阵1. 改变矩阵维度2. 有序矩阵查找3. 有序矩阵的 Kth Element4. 对角元素相等的矩阵数组1. 移动零283. Move Zeroes (Easy)Leetcode / 力扣For example, given nums = [0, 1, 0, 3, 12], after .

2021-02-21 18:06:22 228

原创 Leetcode 题解 - 哈希表

1. 数组中两个数的和为给定值2. 判断数组是否含有重复元素3. 最长和谐序列4. 最长连续序列5. TinyURL 的加密与解密6. 有效的字母异位词7. 字母异位词分组哈希表使用 O(N) 空间复杂度存储数据,并且以 O(1) 时间复杂度求解问题。Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中。如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在。例如对于只有小写字符的元素,就可以用一个长度为 26 的布尔数组来存储一个字符集.

2021-02-20 00:41:12 121

原创 ==、equals()与hashcode()的区别和联系

文章目录Java里面已有`==`运算符了,为什么还需要equals()呢?那么hashCode()方法又有什么用?那么hashCode()与equals() 有什么联系呢?如何重写equals()与hashCode()方法呢?总结参考Java里面已有==运算符了,为什么还需要equals()呢?在理解==运算符之前,我们先来明确一下基本数据类型与引用数据类型的区别:基本数据类型包括 boolean(布尔型)、float(单精度浮点型)、char(字符型)、byte(字节型)、short(短整型)、in

2021-02-05 22:15:07 199

转载 三道题套路解决递归问题

文章来源:lyl’s blog递归解题三部曲何为递归?程序反复调用自身即是递归。我自己在刚开始解决递归问题的时候,总是会去纠结这一层函数做了什么,它调用自身后的下一层函数又做了什么…然后就会觉得实现一个递归解法十分复杂,根本就无从下手。相信很多初学者和我一样,这是一个思维误区,一定要走出来。既然递归是一个反复调用自身的过程,这就说明它每一级的功能都是一样的,因此我们只需要关注一级递归的解决过程即可。如上图所示,我们需要关心的主要是以下三点:整个递归的终止条件。一级递归需要做什么?应该.

2021-01-15 16:07:19 170

原创 BIO、NIO与AIO

目录前言1. BIO (Blocking I/O)1.1 传统 BIO1.2 伪异步 IO1.3 代码示例1.4 总结2. NIO (New I/O)2.1 NIO 简介2.2 NIO与BIO的区别2.2.1 Non-blocking IO(非阻塞IO)2.2.2 Buffer(缓冲区)2.2.3 Channel (通道)2.2.4 Selector (选择器)2.3 代码示例3. AIO (Asynchronous I/O)4. BIO、NIO、AIO适用场景学习资料前言Java 中的 BIO、NIO

2021-01-09 23:26:59 130

原创 Spring概述

SpringSpring是一个生态体系(也可以说是技术体系),它包含了许多应用在特定场景的具体框架,如Spring Framework、Spring Security、Spring Boot、Spring Cloud等等,其中Spring Framework框架是整个生态的核心基础,其他框架都需要依赖Spring Framework提供的基础功能。Spring 官网:https://spring.io/。Spring FrameworkSpring 是分层的 Java SE/EE 应用 full

2020-12-21 16:05:16 299

原创 Spring Boot CLI 安装及使用

参考:《SpringBoot实战》安装 Spring Boot CLI下载 spring-boot-cli-2.4.0解压到任意目录将 bin 目录添加到环境变量中查看安装结果#输入spring --version#输出Spring CLI v2.4.0使用Spring Initializr 初始化 Spring Boot 项目Spring Initializr 的几种用法通过Web 界面使用通过Spring Tool Suite 使用通过 Intellij IDEA.

2020-12-16 20:39:00 356

原创 数据库设计那些事儿

目录什么是数据库设计数据库设计的步骤需求分析逻辑设计ER图(实体关系图)设计范式设计范式概要1NF2NF3NFBCNF物理设计数据库系统选择表及字段命令字段类型char与varchardecimal与float时间类型反范式化设计维护优化如何维护数据字典如何维护索引表结构的维护数据库中适合的操作垂直拆分和水平拆分参考什么是数据库设计数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS(数据库管理系统),为这个业务系统构造出最优的数据存储模型,并建立数据库中的表结构以及表与表之间的关联关系的过程

2020-12-15 22:06:12 374

转载 The X-Y Problem

文章来源:https://coolshell.cn/articles/10804.htmlX-Y Problem对于X-Y Problem的意思如下:1)有人想解决问题X2)他觉得Y可能是解决X问题的方法3)但是他不知道Y应该怎么做4)于是他去问别人Y应该怎么做?简而言之,没有去问怎么解决问题X,而是去问解决方案Y应该怎么去实现和操作。于是乎:1)热心的人们帮助并告诉这个人Y应该怎么搞,但是大家都觉得Y这个方案有点怪异。2)在经过大量地讨论和浪费了大量的时间后,热心的人终于明白了原始的.

2020-12-15 16:54:20 181

转载 超完整的Chrome浏览器客户端调试大全

文章来源:http://www.igeekbar.com/igeekbar/post/156.htm引言“工欲善其事,必先利其器”没错,这句话个人觉得说的特别有道理,举个例子来说吧,厉害的化妆师都有一套非常专业的刷子,散粉刷负责定妆,眼影刷负责打眼影,各司其职,有了专业的工具才能干专业的事,这个灵感要来源于之前我想买化妆品时,店里的海报标语,由此联想到,如果你想在某个事情上做好,并且做的专业,那么你一定要把你的工具用好,这样才能事半功倍,我见过很多师兄师姐,写了很多代码,能够很快的完成工作,能.

2020-12-13 15:45:00 227

原创 设计模式_合集

1 概述软件工程中,**设计模式(design pattern)**是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在 1990 年代从建筑设计领域引入到计算机科学的。模式不是代码,而是众多软件开发人员经过长时间的试验总结出来的最佳实践。编写软件过程中,程序员面临着来自耦合性、内聚性、灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好的——代码重用性 (即:相同功能的代码,不用多次编写)可读性 (即:编程规范性,

2020-12-09 21:04:04 169

转载 桥接模式

前言:在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如果为每一种形状都提供一套各种颜色的版本,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。如果用桥接模式就能很好地解决这些问题。定义桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。结构桥接(Bridge)模式包含以下主要角色。.

2020-12-09 16:59:09 100

原创 适配器模式

前言:在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。在软件系统中,需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时使用适配器模式能很好地解决这些问题。定义适配器模式(Adapter Pattern) 又叫包装器(Wrapper),它将一个类的接口转换成客户希望的另外.

2020-12-09 15:12:31 194

原创 原型模式

前言:在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效,就像孙悟空拔下猴毛轻轻一吹就变出很多孙悟空一样简单。定义原型模式(Prototype Pattern) 是一种创建型设计模式,它指的是:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。直白地讲,使用原型实例指定要创建对象的类型,通过拷贝这个原型来创建新对象。原型模式的拷贝分为浅拷贝和深拷贝。浅拷贝(Shallow Cop.

2020-12-08 22:24:10 112

原创 建造者模式

前言:无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分。如汽车,它包括车轮、方向盘、发送机等各种部件;又比如就计算机,由CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成。而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一辆完整的汽车,使用一台完整的计算机。建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。部件的组合过程往往.

2020-12-08 21:27:57 127

原创 Top Tips For VSCode

VSCode常用快捷键General快捷键作用Ctrl+Shift+P, F1显示命令面板Ctrl+P启动文件搜索框,方便快速打开文件Ctrl+Shift+N新建一个窗口Ctrl+Shift+W关闭当前窗口Ctrl+,User SettingCtrl+K Ctrl+S查看快捷键基础编辑快捷键作用Ctrl+Shift+K删除当前行Ctrl+Enter在当前行之后插入一行Ctrl+Shift+Enter

2020-12-08 16:11:28 343

原创 工厂模式之简单工厂、工厂方法与抽象工厂

1 简单工厂(Simple Factory)1.1 问题引出假如有一个披萨店,Pizza的种类有很多,如CheesePizza、VeggiePizza、PepperPizza等。披萨店根据收到的订单制作Pizza,披萨的制作流程有材料的准备材料、烤、切、包装几步。如何设计Pizza的订购呢?按照一般的设计思路:那么当用户订购时: Pizza OrderPizza(String orderType) { Pizza pizza; if (orderType.e

2020-12-08 11:21:41 6992 1

空空如也

空空如也

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

TA关注的人

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