面试题
文章平均质量分 72
kaixin201505
编程就是算法和数据结构,算法和数据结构是编程的灵魂。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
过滤器 和 拦截器的 6个区别,别再傻傻分不清了
过滤器 和 拦截器的 6个区别,别再傻傻分不清了转载 2022-10-18 17:55:01 · 274 阅读 · 0 评论 -
SpringCloud常用注解总结
https://blog.youkuaiyun.com/u014666697/article/details/90756644公司正在用springcloud微服务改造老项目,为了方便查找和学习,汇总一些常用的注解。使用过程中定期更新。SpringCloud常用注解总结:@Controller 控制层,里面有多个连接@Service 业务层,一般对于接口和实现@Qualifier 如果一个接口有多个实现,那么注入时候加上唯一标示@Repository 一般的dao层@Autowired 自动注入依转载 2021-09-14 16:37:08 · 2279 阅读 · 0 评论 -
Java Lambda 表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。语法lambda 表达式的语法格式如下:(parameters) -> expression 或 (parameters) ->{ statements; }以下是lambda表达式的重要特征:可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。 可选的参转载 2021-07-22 09:04:02 · 121 阅读 · 0 评论 -
假设字符串类似这样的aba和aab,abc和bca就相等,现在随便给你二组字符串,请编程比较他们看是否相等
public static boolean stringSame(String str1,String str2){if(str1.length() != str2.length()){//先判断长度return false;}StringBuffer strTemp = new StringBuffer();//把str2放到一个StringBufferstrTemp.append(str2);for(int i = 0;i < str1.length();i++){//循环字符串1.转载 2021-07-21 20:25:46 · 953 阅读 · 0 评论 -
假设字符串类似这样的aba和aab,abc和bca就相等,现在随便给你二组字符串,请编程比较他们看是否相等
public static equals(String s1,String s2){ if (s1.length() != s2.length()) return false;if (s1.equals(s2)) return true;if (s1 == s2) return true; char[] ca1 = s1.toCharArray();char[] ca2 = s2.toCharArray();Arrays.sort(ca1);Arrays.sort(ca2);.转载 2021-07-21 20:08:43 · 536 阅读 · 0 评论 -
SpringBean的生命周期
spring是Java软件开发的事实标准。答:spring最基础的能力是IOC(依赖注入),AOP(面向切面编程),ioc改善了模块之间的耦合问题,依赖注入的方式:set方法,构造方法,成员变量+@Autowire ;Bean的管理是IOC的主要功能。bean的生命周期完全由spring容器管理,从属性设置到各种依赖关系的注入,简化了开发人员对bean的生命周期认知;Spring的容器中Bean生命周期如下:对象创建1,从xml配置的Bean,@Bean注解,或者Java代码Bean..转载 2021-07-20 19:39:21 · 118 阅读 · 0 评论 -
linux设置开机自启动
一、在/etc/rc.local文件中添加自启动命令执行命令: 编辑"/etc/rc.local",添加你想开机运行的命令运行程序脚本:然后在文件最后一行添加要执行程序的全路径。例如,每次开机时要执行一个hello.sh,这个脚本放在/usr下面,那就可以在"/etc/rc.local"中加一行"/usr/./hello.sh",或者" cd /opt && ./hello.sh "注意,你的命令应该添加在:exit 0 之前二、在/etc/init.d目录下添加自启转载 2021-07-20 15:00:05 · 5729 阅读 · 0 评论 -
sleep和wait的区别
摘要sleep和wait的区别在于这两个方法来自不同的类分别是Thread和Object,sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)。sleep的作用sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行。wait的作用调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的noti转载 2021-07-20 10:51:14 · 509 阅读 · 0 评论 -
Spring-bean的生命周期
在我的面试经验中,这个是必问的问题,几乎每家公司都会问一下这个。答不上来基本没戏!基本生命周期就如下图所示了:如果还想详细一点如下:1、Spring支持五个作用域:singleton、prototype、request、session、global sessionsingleton :默认的作用域 spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,在创建起容器时就同时自动创建了一个bean的对象 prototype:每次从容器中调用Bean时,都返回一个新的实例,即.转载 2021-07-20 10:42:18 · 272 阅读 · 0 评论 -
linux下cpu过高问题排查
在服务器报cpu过高时,可使用以下命令,快速导出堆栈信息,以方便查看具体的问题。1. 使用top命令定位异常进程。可以看见12836的CPU和内存占用率都非常高此时可以再执行ps -ef | grep java,查看所有的java进程,在结果中找到进程号为12836的进程,即可查看是哪个应用占用的该进程。2. 使用top -H -p 进程号查看异常线程3. 使用printf "%x\n" 线程号将异常线程号转化为16进制4. 使用jstack 进程号|grep 16进制异常线转载 2021-07-19 17:42:26 · 458 阅读 · 0 评论 -
垃圾回收机制及算法
垃圾对象判定1、垃圾回收-对象是否已死优点: 实现简单,执行效率高,很好的和程序交织。 缺点: 无法检测出循环引用。2、判断对象是否存活-可达性分析算法分代收集理论部分收集(Partial GC) : 指目标不是完整收集整个Java堆的垃圾收集, 其中又分为:新生代收集(Minor GC/Young GC): 指目标只是新生代的垃圾收集。 老年代收集(Major GC/Old GC): 指目标只是老年代的垃圾收集,目前只有CMS收集器会有单 独收集老年代的行为。 混合收集(M原创 2021-07-18 15:02:50 · 336 阅读 · 1 评论 -
redis6种数据淘汰策略
1、volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰2、volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰3、volatile-random:从已设置过期时间的数据集中任意选择数据淘汰4、allkeys-lru:从数据集中挑选最近最少使用的数据淘汰5、allkeys-random:从数据集中任意选择数据淘汰6、no-enviction:禁止驱逐数据...原创 2021-07-17 11:00:43 · 784 阅读 · 0 评论 -
CurrentHashMap线程安全
HashMap是线程不安全的,因此为了解决线程安全问题,提出了两个类:HashTable和CurrentHashMap。HashTable相关操作都是对方法加synchronized的大锁,效率比较低。ConcurrentHashMap避免了对全局加锁改成了局部加锁操作,这样就极大地提高了并发环境下的操作速度,由于ConcurrentHashMap在JDK1.7和1.8中的实现非常不同,接下来我们谈谈JDK在1.7和1.8中的区别。一、1.7版本在JDK1.7中ConcurrentHashMap转载 2021-07-15 16:18:43 · 2318 阅读 · 0 评论 -
总结springboot如何处理异常的
SpringBoot默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常SpringBoot会向/error 的 url 发送请求。在springBoot中提供了一个叫BasicErrorController来处理/error请求,然后跳转到默认显示异常的页面来展示异常信息。如果我们需要将所有的异常同一跳转到自定义的错误页面, 需要再src/main/resources/templates 目录下创建error.html页面。注意:名称必须叫erro转载 2021-07-15 16:04:18 · 341 阅读 · 0 评论 -
spring之自定义注解
1.什么是注解Annontation是Java5开始引入的新特征,它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。注解本身是没有功能的,就和xml一样,注解和xml一样是一种元数据,所谓元数据就是解转载 2021-07-14 17:36:43 · 424 阅读 · 0 评论 -
springBoot filter的实现利用注解和方法两种实现方法
filter和servlet有着很大联系 filter实现就是对接口的一种过滤 在接口处调用前和接口调用后的数据处理和判定Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletRe转载 2021-07-14 15:04:01 · 1017 阅读 · 0 评论 -
69道Spring面试题和答案
目录Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVCSpring概述1.什么是spring?Spring是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。2.使用Spring框架的好处是什么?...转载 2021-07-14 13:24:59 · 407 阅读 · 0 评论 -
集合继承关系图解
java集合继承关系图 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。 数组虽然也可以存储对象,但长度是固定的;集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象。 集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractColle转载 2021-07-14 07:31:04 · 1907 阅读 · 0 评论 -
Java 7之基础 - 强引用、弱引用、软引用、虚引用
1、强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:Object o=new Object(); // 强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时,要通过如下方式来弱化引用,如下:o=null; // 帮助垃圾收集器回收此对象 显式地设置o为nul...转载 2021-07-14 07:20:54 · 163 阅读 · 0 评论 -
多线程之callable详解
多线程之callable详解面试有人会问:线程的实现方式有几种?很多人可能回答:2种,继承Thread类,实现Runnable接口。很多忽略了callable这种方式。也许有人知道callable,也知道callable和Runnable的区别是callable可以有返回值,也可以抛出异常的特性,而Runnable没有。这里估计很多人懵逼,接下来我们就从源码层次讲解这个问题。注意callable可以有返回值,也可以抛出异常这点很关键。很多时候我们让多线程去帮我们处理事情,是需要拿到返回值的转载 2021-07-14 07:13:05 · 641 阅读 · 0 评论 -
Callable接口及Futrue接口详解
Callable接口有两种创建线程的方法-一种是通过创建Thread类,另一种是通过使用Runnable创建线程。但是,Runnable缺少的一项功能是,当线程终止时(即run()完成时),我们无法使线程返回结果。为了支持此功能,Java中提供了Callable接口。为了实现Runnable,需要实现不返回任何内容的run()方法,而对于Callable,需要实现在完成时返回结果的call()方法。请注意,不能使用Callable创建线程,只能使用Runnable创建线程。 另一个区别是call(转载 2021-07-14 07:08:50 · 447 阅读 · 0 评论 -
Integer 类型与 int 的==比较
困惑的地方 先贴上代码,显示让我一开始很困惑的地方package com.lizi.basic;public class IntegerDemo { public static void main(String[] args) { Integer a = new Integer(3); Integer b = 3; int c = 3; System.out.println(a == b); ...转载 2021-07-12 16:07:04 · 692 阅读 · 0 评论 -
分布式系统的无状态和有状态详解
「数据一致性」和「高可用」其实本质是一个通过提升复杂度让整体更完善的方式。本文主要讲一些让系统更简单,更容易维护的东西——「易伸缩」,首当其冲的主题就是「stateless」,也叫「无状态」。服务的“状态”无状态的服务客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份。服务端不保存任何客户端请求者信息。无状态的好处?客户端请求不依赖服务端的信息,任何多次请求不需要必须访问到同一台服务 服务端的集群和状态对客户端透明 =-服务端可以任意的迁移和伸缩 =-减小服务端存储.转载 2021-07-02 07:36:57 · 424 阅读 · 0 评论 -
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/se转载 2021-06-30 18:26:08 · 1586 阅读 · 0 评论 -
leetcode14 编写一个函数来查找字符串数组中的最长公共前缀
题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。package leetcode.easy.week01;public class problem14 { public Str转载 2021-06-30 16:49:59 · 500 阅读 · 0 评论 -
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。功能实现这个算法有两种实现,第一种很简单就是两层for循环取出最大值就行了,没什么意思,所以就不再赘述了,第二种方式就是贪心法,先找到最大的横坐标,然后依次减小横坐标,变幻纵坐标,但是只能减小两个相比最小的纵坐标的横坐标,这样才能找到最大值(注释:因为我们要找转载 2021-06-30 16:40:30 · 591 阅读 · 0 评论 -
java synchronize原理图
来源:https://www.zhihu.com/question/267980537转载 2021-06-29 14:17:57 · 142 阅读 · 0 评论 -
Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级
一、Synchronized使用场景Synchronized是一个同步关键字,在某些多线程场景下,如果不进行同步会导致数据不安全,而Synchronized关键字就是用于代码同步。什么情况下会数据不安全呢,要满足两个条件:一是数据共享(临界资源),二是多线程同时访问并改变该数据。例如:public class AccountingSync implements Runnable{ //共享资源(临界资源) static int i=0; /** * syn...转载 2021-06-29 13:23:05 · 194 阅读 · 0 评论 -
MyISAM与InnoDB 的区别(9个不同点)
区别:1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;3. InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅..转载 2021-06-29 12:31:37 · 136 阅读 · 0 评论 -
LeetCode 第8题:实现 atoi,将字符串转为整数
LeetCode 第8题:实现 atoi,将字符串转为整数。在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。...转载 2021-06-29 09:49:42 · 223 阅读 · 0 评论 -
LeetCode-给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。class Solution { public int reverse(int x) { int num = x;//...转载 2021-06-29 09:33:34 · 495 阅读 · 0 评论 -
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。解题思路:转载 2021-06-29 09:11:24 · 2342 阅读 · 0 评论 -
CurrentHashMap线程安全
HashMap是线程不安全的,因此为了解决线程安全问题,提出了两个类:HashTable和CurrentHashMap。HashTable相关操作都是对方法加synchronized的大锁,效率比较低。ConcurrentHashMap避免了对全局加锁改成了局部加锁操作,这样就极大地提高了并发环境下的操作速度,由于ConcurrentHashMap在JDK1.7和1.8中的实现非常不同,接下来我们谈谈JDK在1.7和1.8中的区别。一、1.7版本在JDK1.7中ConcurrentHashMap转载 2021-06-29 06:33:51 · 928 阅读 · 0 评论 -
TCP传输过程详解——三次握手、四次挥手
TCP 3.1 三次握手(重点) 3.2 四次挥手(重点) 3.3 通过序列号与确认应答提高可靠性 3.4 重发超时的确定 3.5 以段为单位发送数据 3.6 利用窗口控制提高速度 3.7 滑动窗口控制 3.8 窗口控制中的重发控制 TCPTCP 与 UDP 的区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在 UDP 中都没有。 此外,TCP 作为一种面向有连接..转载 2021-06-28 08:14:08 · 2540 阅读 · 0 评论 -
Java 并发高频面试题:聊聊你对 AQS 的理解?
一、 写在前面这篇文章,我们来聊聊面试时一个比较有杀伤力的问题:聊聊你对AQS的理解?之前有同学反馈,去互联网公司面试,面试官聊到并发时就问到了这个问题。当时那位同学内心估计受到了一万点伤害。。。因为首先,很多人可能连AQS是什么都不知道。或者仅仅是听说过AQS这个名词,但是可能连全称怎么拼写都不知道。更有甚者,可能会说:AQS?是不是一种思想?我们平时开发怎么来用AQS?总结起来,很多同学都对AQS有一种云里雾里的感觉,如果用搜索引擎查一下AQS是什么,估计看几篇文章就直接放弃了,因为密转载 2021-06-23 08:49:22 · 170 阅读 · 0 评论 -
算法-----买卖股票的最佳时机(Java 版本)
题目给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出...转载 2021-06-21 10:27:25 · 395 阅读 · 0 评论 -
最全阿里面试题:已拿offer,阿里P8岗位完整阿里技术面试题目,这些面试题你能答出多少
我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突)。如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从这一角度来说,锁对于数据库而言就显得尤为重要。MySQL 锁概述相对其他数据库而言,MySQL 的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如:MyISAM 和 MEMORY 存储引擎采用的是表级锁(table-level locking);InnoD转载 2021-06-16 08:22:01 · 4281 阅读 · 0 评论 -
TCP和UDP的最完整的区别
TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。 TCP的缺点: 慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致T转载 2021-06-15 11:22:46 · 234 阅读 · 0 评论 -
浏览器从输入URL到渲染完页面的整个过程
从输入URL到渲染出整个页面的过程包括三个部分:1、DNS解析URL的过程2、浏览器发送请求与服务器交互的过程3、浏览器对接收到的html页面渲染的过程一、DNS解析URL的过程 DNS解析的过程就是寻找哪个服务器上有请求的资源。因为ip地址不容易记忆,一般会使用URL域名(如www.baidu.com)作为网址。DNS解析就是将域名翻译成IP地址的过程。具体过程: 1)浏览器缓存:浏览器会按照一定的频率 缓存DNS记录 2)操作系统缓存:如果浏览器...转载 2021-06-15 10:45:49 · 225 阅读 · 0 评论 -
高频面试题:什么是零拷贝?在哪些地方使用了?
这是一道高频的面试题,而且在很多技术中都使用到了,比如javaNIO、kafka、Netty、Linux等等。作为一个非常重要的知识点,而且又是高频面试题,有必要从零开始好好地认识一下。即使你是刚入门的同行,相信也能看的懂。OK,开始今天的文章。一、什么是零拷贝?1、从一个案例说起为了解释这个概念,我们先要从一个需求说起,说某天某领导给你下发了一个任务,完成一个从文件中读取数据,并传输到网络上的一个小程序。代码很简单:首先我们在我们的操作系统中找到这个文件,然后把数据先读到缓冲区,最后把转载 2021-06-13 05:39:13 · 442 阅读 · 0 评论
分享