- 博客(144)
- 资源 (42)
- 论坛 (5)
- 收藏
- 关注
原创 DevOps教程(一)GitLab服务搭建
1. DevOps教程(一)GitLab服务搭建1.1 GitLab服务GitLab:是一个基于Git实现的在线代码仓库托管软件,你可以用gitlab自己搭建一个类似于Github一样的系统,一般用于在企业、学校等内部网络搭建git私服。功能:Gitlab 是一个提供代码托管、提交审核和问题跟踪的代码管理平台。对于软件工程质量管理非常重要。版本:GitLab 分为社区版(CE) 和企业版(EE)。配置:建议CPU2核,内存2G以上。1.2 环境准备linux:CentOS 7GitL
2020-08-30 23:51:02
88
原创 数据结构和算法(二十二)二分查找算法
1. 数据结构和算法(二十二)二分查找算法1.1 线性查找二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。 但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。1.2 二分查找代码实现package com.yuanxw.datastructure.chapter22;import java.util.Arrays;/** * 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。 * 但是,折半查找
2020-08-30 15:33:13
96
原创 数据结构和算法(二十一)线性查找算法
1. 数据结构和算法(二十一)线性查找算法1.1 线性查找线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是从第一个记录开始,逐个比较记录的关键字,直到和给定的K值相等,则查找成功;若比较结果与文件中n个记录的关键字都不等,则查找失败。1.2 线性查找代码实现package com.yuanxw.datastructure.chapter21;import java.util.Arrays;/** * 线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是从第一个记录
2020-08-30 15:19:31
79
原创 数据结构和算法(二十)基数排序算法
1. 数据结构和算法(二十)基数排序算法1.1 什么是基数排序基数排序 (Radix Sort) 是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序的发明可以追溯到 1887 年赫尔曼·何乐礼在打孔卡片制表机 (Tabulation Machine)上的贡献。基数排序法会使用到桶 (Bucket),顾名思义,通过将要比较的位(个位、十位、百位…),将要排序的元素分配至 0~9 个桶中,借以达到排序的作用,在某些时候,基数排序法的效率高于其它的比
2020-08-29 00:51:40
87
原创 数据结构和算法(十九)归并排序算法
1. 数据结构和算法(十九)归并排序算法1.1 什么是归并排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数开始,谁小就先取谁。然后再进行比较,如果有数列比较完了,那直接将另一个数列的数据依次取出即可。可以看出合并有序数列的效率是比较高的,可以达到O(n)。1.2 算法基本思想 归并排序的核心思想其实很简单,如果要排序一个数组,我们
2020-08-29 00:46:56
67
原创 数据结构和算法(十八)快速排序算法
1. 数据结构和算法(十八)基数排序算法1.1 什么是基数排序基数排序 (Radix Sort) 是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序的发明可以追溯到 1887 年赫尔曼·何乐礼在打孔卡片制表机 (Tabulation Machine)上的贡献。基数排序法会使用到桶 (Bucket),顾名思义,通过将要比较的位(个位、十位、百位…),将要排序的元素分配至 0~9 个桶中,借以达到排序的作用,在某些时候,基数排序法的效率高于其它的比
2020-08-29 00:29:06
69
原创 数据结构和算法(十七)希尔排序算法
1. 数据结构和算法(十七)归并排序算法1.1 什么是归并排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数开始,谁小就先取谁。然后再进行比较,如果有数列比较完了,那直接将另一个数列的数据依次取出即可。可以看出合并有序数列的效率是比较高的,可以达到O(n)。1.2 算法基本思想 归并排序的核心思想其实很简单,如果要排序一个数组,我们
2020-08-29 00:26:37
67
原创 数据结构和算法(十六)插入排序算法
1. 数据结构和算法(十六)快速排序算法1.1 什么是快速排序快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。1.2 算法基本思想 快速排序需要如下三步骤完成:从数列中挑出一个元素作为基准。重新排列数列,把所有的比基准小的放在基准前面,反之放在后面(一样大可任意一
2020-08-29 00:24:00
52
原创 数据结构和算法(十五)选择排序算法
1. 数据结构和算法(十五)插入排序算法1.1 什么是插入排序假设数列第一个元素为已排序数列,剩余数列为未排序将待排序元素挨个插入到已排序数列中每次插入都必须保证数列是有序的,即通过比较和移动有序数列中的元素,将元素插入到合适的位置。1.2 算法基本思想 插入排序的基本思想是:将数组的第一个数认为是有序数组,从后往前(从前往后)扫描该有序数组,把数组中其余n-1个数,根据数值的大小,插入到有序数组中,直至数组中的所有数有序排列为止。这样的话,n个元素需要进行n-1趟排序。1.3 插入排
2020-08-29 00:18:02
61
原创 数据结构和算法(十四)冒泡排序算法
1. 数据结构和算法(十四)选择排序算法1.1 什么是选择排序选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。1.2 算法基本思想 选择排序是每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。分为三步:从待排序序列中,找到关键字最小的元素如果
2020-08-28 00:42:16
44
原创 数据结构和算法(十三)排序算法
1. 数据结构和算法(十三)冒泡排序算法1.1 什么是冒泡排序冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。1.2 算法基本思想 比较相邻的两个数,如果第一个数比第二个数大,则两数交换。对之后的相邻元素进行同样的工作,从开始到最后一对,这样进行一次排序后,数据的最后一位会是最大值 ,第一次循环进行的次数为 array.length-1。之后对所有的元素重复以上的步骤,且以后每次循环的次数为array.length-1-i (i为循环
2020-08-27 01:26:48
47
原创 数据结构和算法(十二)递归-汉若塔游戏
1. 数据结构和算法(十二)递归-汉若塔游戏1.1 汉诺塔 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。在线游戏地址:http://ertong.973.com/p114895汉诺塔游戏,玩法如下:1.有三根杆子A,B,C。A杆上有若干碟子2.每次
2020-08-27 01:15:45
69
原创 数据结构和算法(十一)递归-八皇后问题
1. 数据结构和算法(十一)递归-八皇后问题1.1 八皇后问题在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。大数学家高斯认为一共有76种摆法,1854年在柏林的象棋杂志上不同的作者发表了共计40种不同的见解,后来还有人利用图论的方法得出共有92种摆法。如何解决八皇后问题?使用递归回溯法,这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,
2020-08-25 00:55:19
76
原创 数据结构和算法(十)递归-迷宫游戏
1. 数据结构和算法(十)递归-迷宫游戏1.1 迷宫游戏 今天做一个简单的迷宫游戏,用二维数实现地图,让程序自动寻路的小游戏。1.2 简单的迷宫简单的迷宫用二维数实现地图,找路策略:【右->下->左->上】方式进行找路, 0:表示是路 1:表示迷宫墙 2:表示是通路 3:表示是不通。 package com.yuanxw.datastructure.chapter10;/** * 简单的迷宫 * 迷宫寻路的方法: * 找路策略:【右->下->左
2020-08-25 00:19:36
98
原创 数据结构和算法(九)递归
1. 数据结构和算法(九)递归1.1 什么是递归 在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。也就是说,递归算法是一种直接或者间接调用自身函数或者方法的算法。通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。1.2 递归的三大要素这个函数的功能他要完成什么样的一件事,而这个,是完全由你自己来定义的。也就是说,我们先不...
2020-03-18 01:33:02
118
原创 数据结构和算法(八)中缀表达式转逆波兰表达式
1. 数据结构和算法(八)中缀表达式转逆波兰表达式1.1 四则混合运算加法、减法、乘法、除法,统称为四则混合运算。其中,加法和减法叫做第一级运算;乘法和除法叫做第二级运算。表达式(算式):如:1+((2+3)*4)-5=16运算顺序:同级运算时,从左到右依次计算;两级运算时,先算乘除,后算加减。有括号时,先算括号里面的,再算括号外面的;有多层括号时,先算小括号里的,再算中括...
2020-02-21 22:14:58
212
原创 数据结构和算法(七)栈的设计与实现
1. 数据结构和算法(七)栈的设计与实现1.1 什么是栈 栈是一种抽象数据结构,是对现实世界对象的模拟。比如,自助餐厅中的一叠盘子,新盘子放在这一叠盘子的最上面,取得时候也是从最上面取。将其抽象出来就是栈,这是最合适的抽象方式。栈的特点:栈是一个先入后出(FILO-First In Last Out)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进...
2020-02-21 22:13:47
114
原创 数据结构和算法(六)Java实现跳表
1. 数据结构和算法(六)Java实现跳表1.1 什么是跳表(Skip List) 跳表确实是一种性能比较优秀的动态数据结构,跳表(skip list) 对标的是平衡树(AVL Tree),是一种 插入/删除/搜索 都是 O(log n) 的数据结构。它最大的优势是原理简单、容易实现、方便扩展、效率更高。因此在一些热门的项目里用来替代平衡树,如 redis, leveldb 等。跳表的数据结...
2020-02-19 23:10:00
287
原创 数据结构和算法(五)Java实现双向链表
1. 数据结构和算法(五)Java实现双向链表1.1 什么是双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。value域–存放结点值的数据域prev域–存放结点的直接前继的地址(位置)的指针域(链域)next域–存放结点...
2020-02-17 17:23:10
298
原创 数据结构和算法(四)Java实现环形链表
1. 数据结构和算法(四)Java实现环形链表1.1 约瑟夫问题约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中。罗马将军韦斯巴芗(Vespasian)派人来劝降,他主张投降,其余的人不答应,并以死相逼。最后,约瑟夫提议,与其死在自己的手上,不如死在彼此的手上。因此他便将游戏规则告知众人:N个人围成一圈,从第一...
2020-02-17 17:21:46
280
原创 数据结构和算法(三)图解单向链表反转
1. 数据结构和算法(三)图解单向链表反转 所谓的单链表反转,就是把每个节点的指针域由原来的指向下一个节点变为指向其前一个节点。一直觉得反转链表实现代码不是很好理解,今天用画图的方式去理解它。1.1 需求分析反转链表需求:输入:[HBase,Redis,Kafka]输出:[Kafka,Redis,HBase]分析:存在链表 HBase → Redis → Kafk...
2020-02-17 17:20:24
174
原创 数据结构和算法(二)Java实现单向链表
1. 数据结构和算法(二)Java实现单向链表1.1 什么是单向链表 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向NULL的指针...
2020-02-17 17:19:25
266
原创 数据结构和算法(一)Java实现循环队列
1. 数据结构和算法(一)Java实现循环队列1.1 什么是循环队列 循环队列:具有队头指针(front)和队尾指针(rear),指示队列元素所在的位置,避免删除元素时移动大量元素。队列也是一种线性表,只不过它是操作受限的线性表,只能在两端操作,先进先出(First In First Out,FIFO)。循环队列特性:只能队尾插入元素、在队头删除元素。先进先出(First In ...
2020-02-17 17:18:18
375
2
原创 JAVA多线程(二十八)Java多线程之SynchronousQueue容器
1.JAVA多线程(二十八)Java多线程之SynchronousQueue容器1.1 什么是SynchronousQueue Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take,反过来也一样。不像ArrayBlockingQueue或LinkedListBlocking...
2020-02-11 18:50:01
77
原创 JAVA多线程(二十七)Java多线程之LinkedBlockingQueue容器
1.JAVA多线程(二十七)Java多线程之LinkedBlockingQueue容器1.1 什么是LinkedBlockingQueue LinkedBlockingQueue 底层基于单向链表实现的阻塞队列,可以当做无界队列也可以当做有界队列来使用,同样满足 FIFO 的特性,与 ArrayBlockingQueue 相比起来具有更高的吞吐量,为了防止 LinkedBlockingQue...
2020-02-11 18:48:46
104
原创 JAVA多线程(二十六)Java多线程之PriorityBlockingQueue容器
1.JAVA多线程(二十六)Java多线程之PriorityBlockingQueue容器1.1 什么是PriorityBlockingQueue PriorityBlockingQueue 是一个支持优先级的无界阻塞队列。默认情况下元素采用自然顺序进行排序,也可以通过自定义类实现 compareTo() 方法来指定元素排序规则,或者初始化时通过构造器参数 Comparator 来指定排序规...
2020-02-11 18:47:55
83
原创 JAVA多线程(二十五)Java多线程之ArrayBlockingQueue容器
1.JAVA多线程(二十五)Java多线程之ArrayBlockingQueue容器1.1 什么是BlockingQueue 阻塞队列(BlockingQueue)被广泛使用在“生产者-消费者”问题中,其原因是 BlockingQueue 提供了可阻塞的插入和移除的方法。当队列容器已满,生产者线程会被阻塞,直到队列未满;当队列容器为空时,消费者线程会被阻塞,直至队列非空时为止。Blocki...
2020-02-11 18:46:51
163
原创 JAVA多线程(二十四)Java多线程之CompletableFuture类
1.JAVA多线程(二十四)Java多线程之CompletableFuture类1.1 什么是Future Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执行。package com.yuanxw.chapter24;import ja...
2020-02-06 19:40:15
227
原创 JAVA多线程(二十三)Java多线程之ScheduledThreadPoolExecutor定时执行任务线程池
1.JAVA多线程(二十三)Java多线程之ScheduledThreadPoolExecutor定时执行任务线程池1.1 定时执行任务线程池ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor是一个使用线程池执行定时任务的类,相较于Java中提供的另一个执行定时任务的类Timer,其主要有如下两个优点:使用多线程执行任务,不用...
2020-02-03 21:39:05
226
原创 JAVA多线程(二十二)Java多线程之WorkStealingPool工作窃取线程池
1.JAVA多线程(二十二)Java多线程之WorkStealingPool工作窃取线程池1.1 工作窃取线程池WorkStealingPool 在Java 8中,引入了一种新型的线程池,作为newWorkStealingPool()来补充现有的线程池。WorkStealingPool线程池,来维持相应的并行级别,它会通过工作窃取的方式,使得多核的 CPU 不会闲置,总会有活着的线程让 C...
2020-02-03 21:37:30
1165
原创 JAVA多线程(二十一)Java多线程之SingleThreadExecutor单线程化线程池
1.JAVA多线程(二十一)Java多线程之SingleThreadExecutor单线程化线程池1.1 单线程化线程池SingleThreadExecutor SingleThreadExecutor 是只有一个线程的线程池。通过源代码查看SingleThreadExecutor实现: /** * Creates an Executor that uses a sing...
2020-02-01 18:56:59
132
原创 JAVA多线程(二十)Java多线程之FixedThreadPool可重用固定线程数的线程池
1.JAVA多线程(二十)Java多线程之FixedThreadPool可重用固定线程数的线程池1.1 可重用固定线程数的线程池FixedThreadPool 可重用固定线程数的线程池FixedThreadPool特点是:只有核心线程,不会被回收、线程数量固定、任务队列无大小限制(超出的线程任务会在队列中等待),通过源代码查看FixedThreadPool实现: /** ...
2020-02-01 18:56:29
183
原创 JAVA多线程(十九)Java多线程之CachedThreadPool可缓存线程池
1.JAVA多线程(十九)Java多线程之CachedThreadPool可缓存线程池1.1 可缓存线程池CachedThreadPool 可缓存线程池CachedThreadPool是一个根据需要创建新线程的线程池。通过源代码查看CachedThreadPool实现: /** * Creates a thread pool that creates new threa...
2020-02-01 18:55:46
296
原创 JAVA多线程(十八)Java多线程之Executor框架&ThreadPoolExecutor类
1.JAVA多线程(十八)Java多线程之Executor框架&ThreadPoolExecutor类 Executor 框架是 Java5 之后引进的,在 Java 5 之后,通过 Executor 来启动线程比使用 Thread 的 start 方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免 this 逃逸问题。this 逃逸是指在构...
2020-01-31 18:31:14
197
原创 JAVA多线程(十七)Java多线程之ForkJoin框架
1.JAVA多线程(十七)Java多线程之ForkJoin框架1.1 什么是ForkJoin框架? Fork/Join 框架,可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。通过这种方式,Fork/Join 能试着去使用所有可用的处理器,以达到加速处理多线程的目的。本文中对Fork/Join框架的讲解,基于JDK1.8+中的Fork/Joi...
2020-01-30 15:41:07
83
原创 JAVA多线程(十六)Java多线程之Condition对象
1.JAVA多线程(十六)Java多线程之Condition对象1.1 什么是Condition? Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较...
2020-01-29 14:51:36
76
原创 JAVA多线程(十五)Java多线程之ReentrantLock重入锁
1.JAVA多线程(十五)Java多线程之ReentrantLock重入锁1.1 什么是ReentrantLock重入锁? 重入锁:自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。1...
2020-01-27 18:51:52
82
原创 JAVA多线程(十四)Java多线程之Semaphore信号量
1.JAVA多线程(十四)Java多线程之Semaphore信号量 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。把它比作是控制流量的红绿灯,比如一条马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入马路,但是如果前一百辆中有五辆...
2020-01-16 00:35:10
215
原创 JAVA多线程(十三)Java多线程之CyclicBarrier
1.JAVA多线程(十三)Java多线程之CyclicBarrier CyclicBarrier 和 CountDownLatch 非常类似,它也可以实现线程间的技术等待,但是它的功能比 CountDownLatch 更加复杂和强大。主要应用场景和 CountDownLatch 类似。1.1 CyclicBarrier类 CyclicBarrier是java.util.concur...
2020-01-15 18:37:37
102
原创 JAVA多线程(十二)Java多线程之CountDownLatch
1.JAVA多线程(十一)Java多线程之CountDownLatch1.1 CountDownLatch是什么? CountDownLatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashM...
2020-01-15 17:09:28
120
Junit-4.11.jar
2013-09-13
jquery.EasyUI-1.3.1手册 API.chm
2013-07-12
jquery.EasyUI-1.2.4中文手册.chm
2013-07-12
Java网络Socket编程
2013-07-12
重构-改善既有代码的设计(简体中文)
2013-07-12
Oracle经典教程.pdf
2012-09-07
tcpmon.jar
2012-07-22
SVN客户端使用简要教程
2011-10-19
apacheant-1.6.5-bin.zip
2011-07-12
IBM的AJAX教程
2011-07-04
struts笔记.doc
2011-06-22
正则表达式教程.CHM
2011-06-21
javascript10.chm
2011-06-21
Spring环境搭建
2011-06-21
Hibernate_3官方手册
2011-05-18
kafka-demo.rar
2018-01-28
SQLyog可视化MySQL工具
2016-05-30
hadoop技术内幕:深入解析YARN架构设计与实现原理
2015-11-24
Hadoop技术内幕 深入理解MapReduce架构设计与实现原理.pdf
2015-11-24
Hadoop技术内幕 深入解析Hadoop Common和HDFS架构设计与实现原理.pdf
2015-11-24
Hadoop权威指南.pdf
2015-11-24
鸟哥的Linux私房菜基础篇-第三版.pdf
2015-11-14
Scala编程(中文版).pdf
2015-11-12
快学Scala.pdf
2015-11-12
Scala编程中文版.pdf
2015-11-12
Scala编程.pdf
2015-11-12
在天庭当托塔李天王的日子的留言板
发表于 2020-01-02 最后回复 2020-01-02
求解ipanel浏览器嵌套Iframe问题
发表于 2013-03-27 最后回复 2013-03-28
谁有优化sql的书?给推荐几本?
发表于 2011-07-13 最后回复 2013-03-27
公司怎么样?
发表于 2011-09-25 最后回复 2013-03-27
电子商务的前景如何?
发表于 2011-09-25 最后回复 2013-03-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人 TA的粉丝