总结
我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。
面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!
当然,我们用起来也比较简单,只需要调用工具类 showDiagram() 方法,把要查看的类传进去即可。
DiagramUtils.showDiagram(ArrayList.class, true);
如果你想要查看接口或类的简名,只需要把第二个参数改为 false 即可(效果图如下):
【源码展示】
package com.test.inherited;
import java.util.ArrayList;
import java.util.List;
/**
* 类图查看工具类
*
* @author zyq
* @since 2021/08/18
*/
public class DiagramUtils {
private static List<String> list = new ArrayList<>();
public static void main(String[] args) {
DiagramUtils.showDiagram(ArrayList.class, false);
}
/**
* 打印类或接口的类图关系
*
* @param clazz 类或接口
* @param isShowFullName 是否显示类全名,true-显示类全名,false-显示简名
*/
public static void showDiagram(Class clazz, boolean isShowFullName) {
if (clazz == null) {
System.out.println("你没有传参");
}
Node node = getSupper(clazz, isShowFullName);
if (node != null) {
print(node, 0);
}
handleAll();
for (int i = list.size() - 1; i >= 0; i--) {
System.out.println(list.get(i).substring(4));
}
}
private static void handleAll() {
// 获取最大的层级
int max = 1;
for (int i = list.size() - 1; i > 0; i--) {
int level = getLevel(list.get(i));
if (max < level) {
max = level;
}
}
// 循环处理每层树状
for (int i = max; i > 0; i--) {
handle(i);
}
}
private static void handle(int level) {
// 获取该层次的所有序号
List<Integer> rowList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if (level == getLevel(list.get(i))) {
rowList.add(i);
}
}
if (rowList.size() <= 1) {
return;
}
// 判断两个依次同层级的是否为连续
int i = 0;
while (i < rowList.size() - 1) {
int num1 = rowList.get(i);
int num2 = rowList.get(i + 1);
i++;
// 相邻的直接略过
if (num1 + 1 == num2) {
continue;
}
// 判断两行之间是否有阻碍,没有阻碍才连续
boolean isOk = true;
int levelIndex = level * 4;
for (int j = num1; j < num2; j++) {
String s = list.get(j);
if (s.length() > levelIndex) {
char c = s.charAt(levelIndex);
if (c != ' ' && c != '|') {
isOk = false;
}
}
}
if (isOk) {
for (int j = num1; j < num2; j++) {
list.set(j, setLevel(list.get(j), level));
}
}
}
}
private static String setLevel(String s, int level) {
int levelIndex = level * 4;
if (s.length() > levelIndex) {
char[] chars = s.toCharArray();
chars[levelIndex] = '|';
return new String(chars);
} else {
int diff = levelIndex - s.length();
for (int i = 0; i < diff - 1; i++) {
s += " ";
}
return s + "|";
}
}
private static int getLevel(String s) {
String start = "|---";
int level = 0;
while (level < 100) {
level ++;
start = " " + start;
## Kafka进阶篇知识点
![image](https://img-blog.csdnimg.cn/img_convert/35f407c2cfb959179e809f1ea12c6087.webp?x-oss-process=image/format,png)
**Kafka**高级篇知识点
![image](https://img-blog.csdnimg.cn/img_convert/3bb212a692f6d3527e3bc1fe98929b36.webp?x-oss-process=image/format,png)
**44个Kafka知识点(基础+进阶+高级)解析如下**
![image](https://img-blog.csdnimg.cn/img_convert/81f7149a7fde54fac13f4ccc47f020f4.webp?x-oss-process=image/format,png)
由于篇幅有限,小编已将上面介绍的**《Kafka源码解析与实战》、Kafka面试专题解析、复习学习必备44个Kafka知识点(基础+进阶+高级)都整理成册,全部都是PDF文档**
> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618154847)**
lCrJcg-1714910740413)]
由于篇幅有限,小编已将上面介绍的**《Kafka源码解析与实战》、Kafka面试专题解析、复习学习必备44个Kafka知识点(基础+进阶+高级)都整理成册,全部都是PDF文档**
> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618154847)**