自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 阿里巴巴告诉你什么是多线程

文章目录1 多线程 2线程是不是越多越好? 2.1 例子说明 2.2 原因: 3 线程池 往下看 51 多线程2线程是不是越多越好?2.1 例子说明启动:查看运行情况:2.2 原因:3 线程池...

2022-02-23 19:46:10 313

原创 腾讯二面:MySQL的半同步是什么?

前言年后在进行腾讯二面的时候,写完算法的后问的第一个问题就是,MySQL的半同步是什么?我当时直接懵了,我以为是问的MySQL的两阶段提交的问题呢?结果确认了一下后不是两阶段提交,然后面试官看我连问的是啥都不知道,就直接跳过这个问题,直接聊下一个问题了。所以这次总结一下这部分的知识内容,文字内容比较多,可能会有些枯燥,但对于这方面感兴趣的人来说还是比较有意思的。MySQL的主从复制我们的一般在大规模的项目上,都是使用MySQL的复制功能来创建MySQL的主从集群的。主要是可以通过为服务器配置一个

2022-02-23 19:35:00 219

原创 从本质彻底精通Git——4个模型1个周期1个史观1个工作流

一、什么是Git?  Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。  Git是Linus Torvalds为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。二、分布式VS集中式  VisualSVN、TortoiseSVN、Bazzar为集中式版本控制系统,而Mercurial、Git、Bitkeeper为分布式版本控制系统。  1. 集中式版本控制    优点:可以对具体的文件或目录进行权限控制,有全局的版本号。    缺点:

2022-02-23 19:32:38 283

原创 SQL优化三步曲

有一天开发同学反馈线上业务库中有一条SQL执行很满,每次几乎要跑1分钟才结束,希望我们帮忙优化一下,具体SQL如下:SQL优化第一步 - 查看执行计划对于一个SQL的优化,我们的第一步也是最重要的一步就是查看SQL执行计划,SQL执行计划一方面告诉我们SQL具体的处理行为,另外一方面也可以体现每个执行步骤下大致的资源消耗点。所以我们拿到问题SQL以及对应数据库环境后,登录该环境只读实例进行SQL分析测试。从以上的SQL执行计划我们可以获取到哪些有效信息呢?SQL先对t表扫描查

2022-02-23 19:31:11 254

原创 2022年java面试汇总

面试题汇总1、Java的SDK起到的作用答:SDK:软件开发工具包(Software Development Kit) 包含JDK同时肯定包含JRE。2、进程和线程的区别答:线程在进程下运行,一个进程可以包含多个线程,就比如一个银行门店,开始营业,就是进程开启,然后每个窗口就是处理业务,每个窗口就是线程。3、进程切换会发生什么答:进程的切换,实质上就是被中断运行进程与待运行进程的上下文切换,分为两步:1、切换新得页表,然后使用新得虚拟地址空间。2、切换内核栈,加入新得内容(PCB控制

2022-02-22 19:15:16 288

原创 硬核长篇,深入理解 Java 字节码指令

Java 字节码指令是 JVM 体系中非常难啃的一块硬骨头,我估计有些读者会有这样的疑惑,“Java 字节码难学吗?我能不能学会啊?”讲良心话,不是我谦虚,一开始学 Java 字节码和 Java 虚拟机方面的知识我也感觉头大!但硬着头皮学了一阵子之后,突然就开窍了,觉得好有意思,尤其是明白了 Java 代码在底层竟然是这样执行的时候,感觉既膨胀又飘飘然,浑身上下散发着自信的光芒!GitHub 开源地址(欢迎 star):https://github.com/itwanger/jmx-javaJa

2022-02-22 19:08:10 405 1

原创 面试官常问的十大java面向对象的问题

0. 目录对面向对象思想的理解 Java 对象初始化顺序 Overload 和 Override 的区别 int 和 Integer 的区别 char 型变量中能否存储一个中文汉字 Java 中 Serializable 和 Externalizable 的区别 抽象类和接口的区别 String 和 StringBuilder、StringBuffer 的区别 阐述 final、finally 和 finalize 的区别 Java 中的异常处理机制和简单的应用1. 面向对象思想的理

2022-02-22 17:10:35 654

原创 面试官:for循环你知道几种

背景J2SE 1.5提供了另一种形式的for循环。借助这种形式的for循环,可以用更简单的方式来遍历数组和Collection等类型的对象。本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类,并解释和这一机制的一些常见问题。在Java程序中,要“逐一处理”――或者说,“遍历”――某一个数组或Collection中的元素的时候,一般会使用一个for循环来实现(当然,用其它种类的循环也不是不可以,只是不知道是因为for这个词的长度比较短,还是因为for这个词的含义和这种操作比较配,在这种时候f

2022-02-22 17:07:44 227

原创 15年程序员告诉你java中ArrayList和LinkedList区别

一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(r...

2022-02-22 16:28:18 57

原创 腾讯推荐出来的九个java性能优化的工具

在这篇文章中,我会带着大家一起看一下9个可以帮助我们优化Java性能的工具。有一些我们已经在IDR Solutions中使用了,而另外一些有可能在个人项目中使用。1、NetBeans ProfilerNetBeans profiler是一个NetBeans IDE插件,主要为NetBeans IDE提供性能分析相关的功。NetBeans IDE是一个开源的集成开发环境。它很好地支持所有Java应用类型(包括Java SE、JavaFX、Java ME、Web、EJB和移动应用)的开发。这个性

2022-02-22 15:45:45 532

原创 阿里程序员常用的SpringBoot中处理校验逻辑的两种方式

大家好,我是阿远。最近正在开发一个知识库学习网站编程猫,需要对请求参数进行校验,很是头疼,最近前两天认识一个阿里的员工偷偷告诉我了两种方式。比如说非空啊、长度限制啊等等,可选的解决方案有两种: 一种是用 Hibernate Validator 来处理 一种是用全局异常来处理 两种方式,我们一一来实践体验一下。一、Hibernate ValidatorSpring Boot 已经内置了 Hibernate Validator 校验框架,这个可以通过 Spring Boot 官网查看

2022-02-22 15:37:33 538

原创 公司用的 MySQL 团队开发规范,真是太详细了

数据库对象命名规范数据库对象数据库对象是数据库的组成部分,常见的有以下几种: 表(Table )、索引(Index)、视图(View)、图表(Diagram)、缺省值(Default)、规则(Rule)、触发器(Trigger)、存储过程(Stored Procedure)、 用户(User)等。 命名规范是指数据库对象如数据库(SCHEMA)、表(TABLE)、索引(INDEX)、约束(CONSTRAINTS)等的命名约定。数据库对象全局命名规范1、命名使用具有意义的英文词汇,词汇中间以下

2022-02-22 15:30:25 178

原创 10年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理

Spring Boot嵌入式Web容器原理Spring Boot的目标是构建“非常容易创建、独立、产品级别的基于Spring的应用”。这些应用是“立即可运行的”。在这个过程中,完全没有代码生成,不需要配置任何特殊的XML配置,为了这个目标,Spring Boot在Spring 4.0框架之上提供了很多特性,帮助应用以“约定优于配置”“开箱即用”的方式来启动应用并运行上下文。Spring Boot同样改变了一个传统的Web应用服务的启动流程和部署方式。通过自动配置机制,Spring Boot提供了一个

2022-02-22 15:26:19 295

原创 手写死锁示例,竟让面试官一脸沉默

前言 项目环境 1.什么是死锁? 2.死锁的影响和危害 3.必然死锁示例 4.过程分析 5.总结前言只对死锁代码感兴趣的可以直接跳到第三小节 必然死锁示例,如果对死锁还不太了解的,我们可以一起来讨论以下几个议题什么是死锁? 死锁有什么危害和特点? 代码实现一个必然死锁的示例 分析死锁的过程推荐下自己做的 Spring Boot 的实战项目:https://github.com/YunaiV/ruoyi-vue-pro项目环境jdk 1.8 gith

2022-02-22 15:15:57 354

原创 并发的原理

说起并发的底层,不得不提volatile,CAS,AQS,本文就是揭露它们神秘的面纱一.volatile为了更好的理解volatile,我们需要知道以下几个概念JMM (java内存模型)抽象的概念,并不真实存在,它描述的是一组规则或者规范 规定了内存主要划分为主内存和工作内存 (与JVM是不同层面的划分) (可以泛泛的理解为主内存就是堆,工作内存就是栈。堆:线程共享 栈:线程独有)关于不同的线程操作共享资源的步骤如下:比如 i++将主内存的数据读到(拷贝)工作内存中.

2022-02-21 20:21:58 632

原创 MySQL调优

调优的目的?让吞吐量更大,响应速度更快。关于数据库优化,我们从以下5个维度进行。一.优化表结构表结构尽量遵循三范式的原则,在进行多表查询的时候,必要时可以采用反范式化进行优化。什么叫范式?在关系型数据库中,关于数据表设计的基本原则,规则就称为范式。一共有6大范式,知道前5个就行。满足了高级范式,就一定满足低级范式。比如满足第三范式,就一定满足第1,2范式。第一范式:确保每一个字段保证"原子性",不能被拆分。比如有一个字段叫"个人信息",它就可以拆分为地址,年龄,姓名等。就不满足第一

2022-02-21 20:06:51 3694 1

原创 MySQL事务与锁

一、事务与事务特性在关系型数据库内,事务是由一个SQL或一组SQL语句组成的逻辑处理单元。也就是说事务就相当于一个盛放SQL的容器,事务中的SQL要么全部执行成功,要么所有已经修改的操作都回滚到原来的操作,即一条SQL也不能执行成功。事务的四大特性(ACID): 原子性: 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行,当在执行过程中出现错误,就会回滚到事务开始前的状态。 一致性: 事务的执行结果必须是从一个一致性状态向另一个一致性状态的变更。

2022-02-21 19:54:32 263

原创 Spring中的Environment外部化配置管理详解

Environment的中文意思是环境,它表示整个spring应用运行时的环境信息,它包含两个关键因素profiles propertiesprofilesprofiles这个概念相信大家都已经理解了,最常见的就是不同环境下,决定当前spring容器中的不同配置上下文的解决方案。比如针对开发环境、测试环境、生产环境,构建不同的application.properties配置项,这个时候我们可以通过profiles这个属性来决定当前spring应用上下文中生效的配置项。实际上,通过profil

2022-02-21 19:26:36 435

转载 jdbc使用PreparedStatement批量插入数据

批量插入1. 批量执行SQL语句当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率JDBC的批量处理语句包括下面三个方法:addBatch(String):添加需要批量处理的SQL语句或是参数; executeBatch():执行批量处理语句; clearBatch():清空缓存的数据通常我们会遇到两种批量执行SQL语句的情况:多条SQL语句的批量处理; 一个SQL语句的批量传参;2.

2022-02-21 19:09:53 2083

原创 ​Java的集合类​

在Java的实际开发中。我们经常要和数据打交道。比如说从数据库中查到我们需要的一些数据。然后将这些数据进行处理。返回给请求的客户端相应的数据。那么我们在从数据库取数据的这个过程中需要对数据进行一个临时存储。Java为了解决我们在内存中临时存储变量的需求,给我们提供了集合类!可能我们会有疑问?数组不就是用来存储数据的吗,为什么还有引入集合类这个概念呢?这时候,相较于集合类我们就要说一下数组的缺点了。1.我们知道数组只能存本数据类型。无法存储引用数据类型。而我们java是采用面向对象编程思...

2022-02-21 19:04:46 519

原创 我以为我对Mysql很熟,直到遇到了阿里这份笔记

ava程序员该不该深入学习MySQL这不是废话吗,作为程序员怎么能不懂数据库,不过说真的,公司新来一位员工是这样说的:虽然我是个工作了五年多的Java程序员,但是对于数据库的认识还是停留在很初级够用就好的阶段,再加上我工作的那会各种ORM框架已经很成熟了,类似Hibernate和Mybatis。到现在的SpringJPA。可以说很多网上提到的需要优化数据库性能,分库分表等等各种场景,我工作中一个也没遇到o(╥﹏╥)o。我能怎么办,我也很急啊,谁不想成为高手。据说还有很多人跟他是一样的情况,今

2022-02-21 18:56:24 38

原创 java方法详解

1.何谓方法 java方法是语句的集合,他们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 设计方法原则:保持方法的原子性,即一个方法只完成一个功能,利于后期扩展。 2.方法的定义及调用方法的定义 java语言类似于其他语言的函数,是一段用来完成特定功能的代码片段 语法 方法包含一个方法头和一个方法体 修饰符:定义该方法的访问类型。 返回值类型

2022-02-21 18:52:28 315

原创 java 中的正则使用

说明:在 java 中使用正则,主要是java.util.regex.Pattern和java.util.regex.Matcher这两个类相关常用的调用匹配正则的方法String#matches(arg1) // 可以看到内部也是调用的 Pattern#matches(arg1,arg2) 方法 public boolean matches(String regex) { return Pattern.matches(regex, this); ...

2022-02-21 18:51:35 995

原创 Java基础之hashcode剖析

1. 前言散列是计算机科学的一个基本概念。在 Java 中,高效的散列算法支持一些最流行的集合,例如HashMap和HashSet,在本文中,我们将重点介绍hashCode() 的工作原理、它如何在集合中使用以及如何正确实现它。2. hashcode 原理2.1 Java equals()和hashCode()的关系Object.html#hashCode()hashcode的理解hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCod

2022-02-21 18:49:43 225

原创 MySQL提升笔记:日志文件详解

在MySQL数据库和InnoDB存储引擎中,有很多种文件,如:参数文件、日志文件、socket文件、pid文件、MySQL表结构文件、存储引擎文件。本节重点关注日志文件,MySQL的复制、事务等重要功能都和日志文件相关。日志文件主要包括错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件、重做日志文件等。其中重做日志文件是InnoDB引擎文件。1、日志文件介绍1.1、错误日志(error log)错误日志文件对MySQL的启动、运行、关闭过程进行了记录,是定位MySQL问题的第一把钥匙

2022-02-19 15:44:03 256

原创 开发 IDEA Plugin 引入探针,基于字节码插桩获取执行SQL

一、前言片面了!一月三舟,托尔斯泰说:“多么伟大的作家,也不过就是在书写自己的片面而已”。何况是我们,何况是我们!虽然我们不书写文章,但我们写需求、写代码、写注释,当我们遇到了需要讨论的问题点时,往往变成了争论点。这个好、那个差、你用的都是啥啥啥!当你把路走窄了,你所能接受到的新的思路、新的想法、新的视野,以及非常重要的收入,也都会随之减少。只有横向对比、参考借鉴、查漏补缺,才能让你的头脑中会有更多的思路,无论是在写代码上、还是在理财上、还是在生活上。二、需求目的你是否有在使用 In

2022-02-19 15:38:16 784

原创 解析—MyBatis在SpringBoot中动态多数据源配置

在分库的业务场景和跨数据库实例获取信息之类的场景中,我们会遇到处理多个数据源访问的问题,通常情况下可以采用中间件,如cobar, tddl, mycat等。但取决于业务需求,有时我们需要直接通过MyBatis和SpringData来完成这个任务。即使没有,理解MyBatis多数据源配置的过程也有助于理解其他分库分表操作的原理。背景依赖如下:<dependencies> <dependency> <groupId>org.springfra

2022-02-19 15:34:00 1212

原创 对MySQL底层索引深度解析

为什么需要索引?一句话概括:索引的出现其实就是为了提高数据查询的效率。一、索引常见模型模型: 哈希表、有序数组和搜索树哈希表哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的键即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。 时间复杂度:0(1) 画重点:如果索引的值有重复的话,会发生hash碰撞,虽然可以解决hash冲突,但是导致查

2022-02-19 15:31:21 128

原创 Java教程:IterationTag接口使用教程

在自定义标签的开发过程中,有时需要对标签体的内容进行重复处理,这时,可以使用IterationTag接口,它继承自Tag 接口,在Tag接口基础上新增了一个 EVAL_BODY_AGAIN常量和一个 doAfterBody()方法,具体如下。1. EVAL_BODY_AGAIN常量EVAL_BODY_AGAIN常量是doAfterBody()方法的返回值,如果doAfterBody()方法返回该常量,JSP容器会把标签体的内容重复执行一次。2. int doAfterBody()方法JSP容

2022-02-19 15:27:19 85

原创 35个提高java效率的小技巧,速看

前言代码优化 ,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。代码优化也是一样,如果项目着眼于尽快无 BUG 上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。代码优化的目标是:

2022-02-19 14:12:02 679

原创 Java五个最常用的集合类之间的区别和联系

Map<String, ?>只能是只读模式,不能增加,因为增加的时候不知道该写入什么类型的值;Map<String, Object>可以读和写,只要是所有Object类的子类都可以。常用的集合类有一下几种:List结构的集合类:ArrayList类,LinkedList类,Vector类,Stack类Map结构的集合类:HashMap类,Hashtable类Set结构的集合类:HashSet类,TreeSet类Queue结构的集合:Queue接口.

2022-02-19 14:06:21 784

原创 初级 Java 必须学会的 7 个知识点

如果你才刚开始学习 Java 编程,这里有七个你需要知道的基础知识。Java 是一个多功能的编程语言,在某种程度上,它用在几乎所有可能涉及计算机的行业了里。Java 的最大优势是,它运行在一个 Java 虚拟机(JVM)中,这是一个翻译 Java 代码为与操作系统兼容的字节码的层。只要有 JVM 存在于你的操作系统上 —— 不管这个操作系统是在一个服务器(或“无服务器”,也是同样的)、桌面电脑、笔记本电脑、移动设备,或嵌入式设备 —— 那么,Java 应用程序就可以运行在它上面。这使得 Ja.

2022-02-19 13:49:45 213

原创 java语法糖--类型推导/类型推断(type inference)

先看如下两个例子1. 泛型在Java7以前的版本中使用泛型类型,需要在声明并赋值的时候,两侧都加上泛型类型List<User> userList = new ArrayList<User>();在java7及java7之后,使用泛型可以简写为List<User> userList = new ArrayList<>();2. java8中,lambda表达式参数列表的参数类型可以省略不写List<Integer> ..

2022-02-19 13:36:35 1222

原创 Java中类变量(静态变量)和类方法(静态方法)

类变量类变量也叫静态变量或静态属性,是该类所有对象共享的变量任何一个该类的对象去访问它时,取得都是一样的值 语法: 访问修饰符 static 数据类型 变量名 static 访问修饰符数据类型 变量名 细节: 类变量随着类的加载而创建一次 什么时候需要类变量:当需要让某个类的所有对象都共享一个变量时,就可以考虑类变量。例如:定义学生类,定义类变量统一学生花了多少钱 类变量必须遵守访问权限 类变量与实例变量的区别:类变量时该类的所有对象实例共享的,实例变量时...

2022-02-19 13:29:28 758

原创 java的三大特性:封装、继承、多态

封装:可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问,适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。继承:就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接 访问父类中的非私有的属性和行为。多态:多态是指同一行为,具有多个不同表现形式。

2022-02-18 15:32:08 89

原创 XSON:高性能java序列化框架

XSON是一个Java对象的序列化和反序列化框架。它支持将Java对象序列化为字节数组,并将其从字节数组反序列化为Java对象。 网址:http : //xson.org 项目地址:https://github.com/xsonorg/xson 新版本功能 新的缓冲包,这个包中的相关类,在分配,使用,回收管理的过程中提供了byte []的分配; 进一步提供序列化速度并减少Full GC。 提供具有偏移内容的API支持。 提供XCO对象序列化和反序列化支持。..

2022-02-18 15:23:51 420

原创 java中如何生成UUID呢?

UUID简介UUID(Universally Unique Identifier)英文单词的缩写,UUID产生的目的:让分布式系统中所有元素都具有唯一性,无需由统一的终端数据生成器生成数据,避免数据出现重复UUID的组成UUID生成的数据在同一台机器上同一时空中是唯一值UUID由以下几个部分组成:当前机器上的日期和时间,UUID的第一个部分与时间有关 当我们在同一时间段生成UUID,我们可以发现两个UUID中,除第一部分不同之外,其他部分都相同 时钟序列 全局唯一的IEEE机器识

2022-02-18 14:30:39 3508

转载 java 8 stream reduce详解和误区

简介Stream API提供了一些预定义的reduce操作,比如count(), max(), min(), sum()等。如果我们需要自己写reduce的逻辑,则可以使用reduce方法。本文将会详细分析一下reduce方法的使用,并给出具体的例子。reduce详解Stream类中有三种reduce,分别接受1个参数,2个参数,和3个参数,首先来看一个参数的情况:Optional<T> reduce(BinaryOperator<T> accumulato

2022-02-18 14:25:34 317

原创 JAVA中如何取得一个数组中最大值和最小值呢?

数组是日常开发中,常用的数据结构,它可用于存储同一类型的数据,如:(基础类型,引用类型)那么我们如何获取一个数组中的最大值和最小值呢?对一些基础类型,我们可以直接使用比较,对一些引用类型,我们可以使用“自定义”的比较规则,下文笔者讲述获取数组中最大值和最小值的方法分享,如下所示:实现思路: 借助for循环,对数组进行遍历 然后获取其最大值和最小值例: package com.java265.other public class TestClass {

2022-02-18 14:15:59 4590

原创 分布式接口幂等性、分布式限流(Guava 、nginx和lua限流)

一、接口幂等性接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。幂等性的核心思想:通过唯一的业务单号保障幂等性,非并发的情况下,查询业务单号有没有操作过,没有则执行操作,并发情况下,这个操作过程需要加锁。1、

2022-02-18 14:09:56 114

空空如也

空空如也

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

TA关注的人

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