自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(155)
  • 资源 (3)
  • 收藏
  • 关注

转载 spring解决循环依赖问题

一、简介:循环依赖就是循环引用,就是两个或多个bean互相之间持有对方。比如beanA引用beanB,beanB引用beanA,当我们实例化beanA的时候发现beanB作为beanA的成员对象出现了,那么我们就可能在实例化beanA的中间需要先实例化beanB,然后完成beanB的实例化之后,才能完成beanA的实例化;可惜的是beanB中也引用了beanA,在实例化beanB过程中又需要实例化beanA,而beanA正在进行实例化,但完成beanA的实例化的条件是beanB实例化完成,完成beanB实

2021-09-01 22:24:12 679 1

原创 从Arrays.asList到Collection.toArray()

Arrays.asList()简介Arrays.asList()在平时开发中还是比较常见的,我们可以使用它将一个数组转换为一个List集合。String[] myArray = {"Apple", "Banana", "Orange"};List<String> myList = Arrays.asList(myArray);//上面两个语句等价于下面一条语句List<String> myList = Arrays.asList("Apple","Banana", "Or

2021-08-29 21:46:34 594

原创 Java基础面试题-第一集

1. 面向对象与面向过程面向对象和面向过程是两种不同的处理问题的角度面向过程更注重事情的每一个步骤以及顺序,面向对象更注重事务有哪些(对象)、以及各自需要做什么比如:洗衣机洗衣服面向过程会将任务拆解成一些列的步骤(函数),1.打开洗衣机 2.放衣服 3.放洗衣粉 4.清洗 5.烘干面向对象会拆出人和洗衣机两个对象:人:打开洗衣机 放衣服 放洗衣粉洗衣机:清洗 烘干可以看出,面向过程比较直接高效,而面向对象更易于复用、拓展和维护2.类的三大特性1.封装:属性私有化,公开访问方

2021-08-23 23:55:33 389

原创 Object类各个方法的详解

getClassfinal native getClass 获取当前运行时对象的 Class 对象hashCodenative hashCode 返回对象的 hash 码clonenative clone 拷贝当前对象浅拷贝:仅进行值拷贝深拷贝:进行值拷贝和引用类型拷贝,新建对象equalsequals 通过内存地址比较两个对象是否相等底层用的 this == objString 类重写了这个方法使用值来比较是否相等,通过比较字符数组的每个元素toString

2021-08-07 22:25:03 153

原创 Redis缓存

Redis缓存对于Redis缓存,首先我们先来说说为什么Redis适用于缓存以及Redis缓存的工作机制吧。缓存的特征要想弄明白 Redis 为什么适合用作缓存,我们得清楚缓存都有什么特征。​ 首先,你要知道,一个系统中的不同层之间的访问速度不一样,所以我们才需要缓存,这样就可以把一些需要频繁访问的数据放在缓存中,以加快它们的访问速度。​ 以计算机系统为例,来解释一下。下图是计算机系统中的三层存储结构,以及它们各自的常用容量和访问性能。最上面是处理器,中间是内存,最下面是磁盘。​ 从图上可以看

2021-07-19 12:36:42 1039 2

原创 hadoop不同版本下载地址链接

hadoop不同版本下载地址链接https://archive.apache.org/dist/hadoop/common/

2021-05-24 19:38:06 125

原创 centos7下压缩包手动安装mysql以及设置开机自启动

1、说明在Centos7连接Xshell,Xftp 安装mysql-5.5.47我百度网盘里有网盘地址:https://pan.baidu.com/s/1W3iU06mGhyhCTd7NxdEwsw提取码:ni1u2、安装Mysql-5.5.471.首先下载mysql的压缩文件,然后通过xftp上传到centos的/usr/local目录下2.然后通过tar命令解压压缩包,得到文件夹mysql-5.5.47-linux2.6-x86_64,删除压缩包,然后重命名解压后的文件夹名cd /u

2021-05-18 12:16:38 587

原创 Linux的常用测试比较操作符

Linux的常用的测试操作符1、常用文件测试操作符-d 测试是否目录-e 测试目录或文件是否存在-f 测试是否文件-r 测试是否有读权限-w 测试是否有写权限-x 测试是否有执行权限-L 测试是否为符号连接文件2、常用的整数值比较操作符-eq: 等于-ne: 不等于-gt:大于-lt:小于-le:小于或等于-ge:大于或等于3、字符串比较操作符字符串比较格式[字符串1 = 字符串2][字符串1 != 字符串2][-z 字符串]=:字符串内容相同!=:字符串内

2021-05-18 11:01:25 459

原创 centos7下安装mongodb以及通过rc.local设置自启动

1、MongoDB下载安装MongoDB 源码下载地址:https://www.mongodb.com/download-center#community1.首先下载MongoDB 的压缩文件,然后通过xftp上传到centos的/usr/local目录下2.然后通过tar命令解压压缩包,得到文件夹jdk1.8.0_291,删除压缩包,然后重命名解压后的文件夹名cd /usr/localtar zxvf mongodb-linux-x86_64-ubuntu1604-4.4.6.tgz rm

2021-05-16 17:54:43 823 5

原创 centos7下安装jdk和tomcat以及通过rc.local设置开机自启动

1、说明在Centos7连接Xshell,Xftp 安装jdk1.8以及tomcat9其中jdk1.8和tomcat9的压缩文件我百度网盘里有网盘地址:https://pan.baidu.com/s/1EVfBCfG_yvYJNPHeGbidpg提取码:qjkk2、安装jdk1.81.首先下载jdk1.8的压缩文件,然后通过xftp上传到centos的/usr/local目录下2.然后通过tar命令解压压缩包,得到文件夹jdk1.8.0_291,删除压缩包,然后重命名解压后的文件夹名cd

2021-05-15 21:24:51 718

原创 网络配置-NAT方式进行IP配置

网络配置-NAT方式进行IP配置​1、DHCP 服务验证在已经装好了centos情况下,以NAT方式进行组网,那么我们怎么样如何快速实现虚拟机系统访问外网呢?能不能直接上网呢,来我们试一下ping baidu.com2:提示未知的名字或服务,来咱们查看下ip,用ip addr 试下ip addr3: ens32是我们的网卡,我们发现没有分配ip地址,那当然上不了网啦,那么我们可以用dhcp服务给网卡快速分配一个ip,然后看能否上网,我们输入.4: 我们发现折现网络通了,我们ifoc

2021-05-09 11:23:46 1885

原创 a+=b和a=a+b是一样的吗?

a+=b和a=a+b是一样的吗?我们来先看一张图a+=b 是先进行 a+b 的加法 ,然后将结果赋值给a ,举一个例子public static void main(String[] args) { int a = 100; a = a + 1; System.out.println(a); int c = 100; c += 1; System.out.println(c);

2021-04-24 10:07:49 1025 2

转载 剑指 Offer 03-数组中重复的数字

剑指 Offer 03. 数组中重复的数字找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 方法一:哈希表 / Set利用数据结构特点,容易想到使用哈希表(Set)记录数组的各个数字,当查找到重复数字则直接返回。算法流程:初始化: 新建 HashSet ,

2021-04-18 09:18:25 263

原创 数据结构与算法学习之排序算法

文章目录1、排序算法的介绍1.1、排序的分类2、算法的时间复杂度2.1、度量一个程序(算法)执行时间的两种方法2.2、时间频度2.2.1、基本介绍2.2.2、举例说明-基本案例2.2.3、举例说明-忽略常数项结论:2.2.4、举例说明-忽略低次项结论:2.2.5、举例说明-忽略系数结论:2.3、时间复杂度2.4、常见的时间复杂度说明:2.4.1、常数阶O(1)2.4.2、对数阶O(log2n)2.4.3、线性阶O(n)2.4.4、线性对数阶O(nlogN)2.4.5、平方阶O(n²)2.4.6、立方阶O(n

2021-04-17 20:33:26 1271

原创 Kotlin学习之枚举类

Kotlin 枚举类枚举类最基本的用法是实现一个类型安全的枚举。enum关键字在类头中的class关键字前面enum class Color{ ...}枚举常量枚举常量使用逗号分隔,每个枚举常量都是一个对象。enum class Color { RED, GREEN, BLUE}访问枚举常量枚举相关属性:val name: String //获取枚举名称val ordinal: Int //获取枚举值在所有枚举数组中定义的顺序使用方式为:枚举

2021-04-17 16:25:31 238

原创 剑指 Offer 52-两个链表的第一个公共节点

剑指 Offer 52. 两个链表的第一个公共节点输入两个链表,找出它们的第一个公共节点。如下面的两个链表:](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/14/160_statement.png)在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Re

2021-04-14 19:27:12 85

原创 leetcode-179-最大数

179. 最大数给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。**注意:**输出结果可能非常大,所以你需要返回一个字符串而不是整数。示例 1:输入:nums = [10,2]输出:"210"示例 2:输入:nums = [3,30,34,5,9]输出:"9534330"示例 3:输入:nums = [1]输出:"1"示例 4:输入:nums = [10]输出:"10"提示:1 <= nums.length <=

2021-04-13 18:02:55 166

原创 Kotlin学习之类与对象、继承与构造函数

2.5.1 类与对象首先创建一个Person类。右击包→New→Kotlin File/Class,在弹出的对话框中输入“Person”。对话框在默认情况下自动选中的是创建一个File,File通常是用于编写Kotlin顶层函数和扩展函数的,我们可以点击展开下拉列表进行切换,如图所示。这里选中Class表示创建一个类,点击“OK”完成创建,会生成如下所示的代码:class Person {}这是一个空的类实现,可以看到,Kotlin中也是使用class关键字来声明一个类的,这一点和Java一致

2021-04-09 21:19:03 310 3

原创 kotlin学习之类的修饰符与抽象类,嵌套类,内部类,匿名内部类

类的修饰符与抽象类,嵌套类,内部类,匿名内部类类的修饰符类的修饰符包括 classModifier 和**accessModifier**:classModifier: 类属性修饰符,标示类本身特性。abstract // 抽象类 final // 类不可继承,默认属性enum // 枚举类open // 类可继承,类默认是final的annotation // 注解类accessModifier: 访问权限修饰符private

2021-04-09 20:09:06 144

原创 Kotlin学习之Kotlin 类和属性

Kotlin 类和属性类定义Kotlin 类可以包含:构造函数和初始化代码块、函数、属性、内部类、对象声明。Kotlin 中使用关键字 class 声明类,后面紧跟类名:class Runoob { // 类名为 Runoob // 大括号内是类体构成}我们也可以定义一个空类:class Empty可以在类中定义成员函数:class Runoob() { fun foo() { print("Foo") } // 成员函数}类的属性属性定义类的属性可以用关

2021-04-09 19:48:17 176

原创 kotlin学习之标签与break、continue、return

Kotlin 标签@使用标签定义在 Kotlin 中任何表达式都可以用标签(label)来标记。 标签的格式为标识符后跟 @ 符号,例如:abc@、fooBar@都是有效的标签。 要为一个表达式加标签,我们只要在其前加标签即可。Break 和 Continue 标签为for循环贴上标签loop@ for (i in 1..100) { // ……}现在,我们可以用标签限制 break 或者continue:loop@ for (i in 1..100) { for (j i

2021-04-07 20:31:16 451

原创 Kotlin学习之基本数据类型

Kotlin 基本数据类型Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于 Java 的是,字符不属于数值类型,是一个独立的数据类型。类型位宽度Double64Float32Long64Int32Short16Byte8字面常量下面是所有类型的字面常量:十进制:123长整型以大写的 L 结尾:123L16 进制以 0x 开头:0x0F2 进制以 0b 开头:0b

2021-04-07 19:47:40 229

原创 leetcode-81-搜索旋转排序数组 II

81. 搜索旋转排序数组 II已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,

2021-04-07 16:39:28 144

原创 leetcode-88. 合并两个有序数组

88. 合并两个有序数组给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中*,*使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]示例 2:输入:n

2021-04-05 12:12:26 53

原创 面试题-17.21-直方图的水量

面试题 17.21. 直方图的水量给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6方法一、 双指针加数学思维总体积减去柱子体积就是水的容量利用左右指针的下标差值计算出每一层雨水和柱子的体积。如下图,第一层体积为11,第二层为8

2021-04-02 11:02:27 177

原创 数据结构与算法学习之递归和迷宫+八皇后问题

1、递归应用场景各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛)各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.将用栈解决的问题–>递归代码比较简洁看个实际应用场景,迷宫问题(回溯), 递归(Recursion)2、递归的概念简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。3、递归调用机制这里列举两个小案例,来帮助大家理解递归打印问

2021-04-01 20:49:45 110

原创 leetcode-1006-笨阶乘

1006. 笨阶乘通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积。例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1。相反,我们设计了一个笨阶乘 clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。例如,clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1。然而,这些运算仍然使用通常的算术

2021-04-01 19:57:04 118

原创 leetcode-90-子集 II

90. 子集 II给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。示例 1:输入:nums = [1,2,2]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]示例 2:输入:nums = [0]输出:[[],[0]]本题解基于「78. 子集的官方题解」,请读者在充分理解该题解后继续阅读。方法一:迭代法实现子集枚举思路考虑数组 [1,2,2],选择前

2021-03-31 18:17:43 174

原创 leetcode-78-子集

78. 子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]方法一:迭代法实现子集枚举思路与算法因为在这数组中没有重复的元素,所有我们可以利用二进制的0,1表示元素是否出现,从而进行组合。记原

2021-03-31 18:16:45 259

原创 数据结构与算法学习之栈和逆波兰计算器

逆波兰计算器逆波兰计算器我们完成一个逆波兰计算器,要求完成如下任务:输入一个逆波兰表达式(后缀表达式),使用栈(Stack), 计算其结果支持小括号和多位数整数,因为这里我们主要讲的是数据结构,因此计算器进行简化,只支持对整数的计算。思路分析例如: (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 - , 针对后缀表达式求值步骤如下:1. 从左至右扫描,将3和4压入堆栈;2. 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值,得7,再将7入栈

2021-03-30 22:29:57 96

原创 leetcode-74-搜索二维矩阵

74. 搜索二维矩阵编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。示例 1:输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3输出:true示例 2:输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13输出:false

2021-03-30 18:13:43 106

原创 剑指 Offer 20-表示数值的字符串

剑指 Offer 20. 表示数值的字符串请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。解题思路这题编码难度不大,难点在于归纳各种正确的情况‘.’出现正确情况:只出现一次,且在e的前面‘e’出现正确情况:只出现一次,且出现前有数字‘+’ 、‘-’ 出现正确情况:只能在开头或出现在e的后

2021-03-29 20:22:09 83

原创 leetcode-190-颠倒二进制位

190. 颠倒二进制位颠倒给定的 32 位无符号整数的二进制位。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。进阶:如果多次调用这个函数,你将如何优化你的算法?示例 1:

2021-03-29 18:56:16 116

原创 数据结构与算法学习之栈

数据结构和算法 - 栈栈的一个实际需求请输入一个表达式计算式:[722-5+1-5+3-3] 点击计算【如下图】[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PFfYyZau-1616935348448)(%E6%A0%88/1.png)]请问: 计算机底层是如何运算得到结果的?注意不是简单的把算式列出运算,因为我们看这个算式 7 * 2 * 2 - 5, 但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。-> 栈

2021-03-28 20:43:08 76

原创 leetcode-173-二叉搜索树迭代器

173. 二叉搜索树迭代器实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。int next()将指针向右

2021-03-28 10:00:10 111

原创 数据结构与算法学习之单向环形链表和Josephu(约瑟夫问题)

单向环形链表和Josephu(约瑟夫问题)单向环形链表应用场景Josephu(约瑟夫、约瑟夫环) 问题Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表

2021-03-27 19:54:56 164

转载 Spring IOC 实现原理 - XML

Spring IOC 实现原理IOC: Inversion of Control ,即 “控制反转” , 不是什么技术,而是一种思想。原先需要自行实例化的对象, 交给IOC容器去实现。那么控制反转,谁被控制? 谁被反转 ?在传统的JavaSE程序中,直接在类的内部通过new关键字来创建对象的实例,是程序主动去创建依赖对象,而IOC有一个专门的容器,来创建这些对象,由IOC容器来控制对象的创建,依赖对象也是容器帮忙查找创建并进行注入,对象只是被动的接受,依赖对象的获取被反转了。它还有一个更加形象的名字叫

2021-03-27 11:15:57 118

原创 leetcode-61-旋转链表

61. 旋转链表给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例 1:输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3]示例 2:输入:head = [0,1,2], k = 4输出:[2,0,1]提示:链表中节点的数目在范围 [0, 500] 内-100 <= Node.val <= 1000 <= k <= 2 * 109解题思路​ 首先进行一个常规的非空的判断,然后开始我

2021-03-27 10:18:16 119

原创 leetcode-83-删除排序链表中的重复元素

83. 删除排序链表中的重复元素存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。示例 1:输入:head = [1,1,2]输出:[1,2]示例 2:输入:head = [1,1,2,3,3]输出:[1,2,3]提示:链表中节点数目在范围 [0, 300] 内-100 <= Node.val <= 100题目数据保证链表已经按升序排列一次遍历法解题思路还是和 删除排

2021-03-26 09:58:41 204

原创 leetcode-82-删除排序链表中的重复元素 II

82. 删除排序链表中的重复元素 II存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。示例 1:输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]示例 2:输入:head = [1,1,1,2,3]输出:[2,3]提示:链表中节点数目在范围 [0, 300] 内-100 <= Node.val <= 100题目数据保证链

2021-03-25 18:33:52 120

Spring Boot Actuator.xmind

自己整理的一些actuator学习记录,还算详细

2021-05-17

尚硅谷面试题第二季Java面试题.xmind

看尚硅谷面试题知识讲解时候记得笔记,需要的自取

2021-04-05

spring.xmind

在B站花了一段时间把spring看了一边,边上课边记笔记,手写尚硅谷spring笔记,内容可能有点乱,但是听到的都记在里面,也是留着以后复习用的,用的的到自取。

2020-08-06

空空如也

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

TA关注的人

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