提交 c1e0bc10 编写于 作者: F feilong

init skill_tree_java dir, add readme

上级 301e259a
.vscode
.idea
.DS_Store
__pycache__
*.pyc
*.zip
\ No newline at end of file
# skill_tree_java # skill_tree_java
Java 技能树编辑 ## 初始化
\ No newline at end of file
```
pip install -r requirement.txt
```
## 目录结构说明
* 技能树`骨架文件`
* 位置:`data/tree.json`
* 说明:该文件是执行 `python main.py` 生成的,请勿人工编辑
* 技能树`根节点`配置文件:
* 位置:`data/config.json`
* 说明:可编辑配置关键词等字段,其中 `node_id` 字段是生成的,请勿编辑
* 技能树`难度节点`
* 位置:`data/xxx`,例如: `data/1.Java初阶`
* 说明:
* 每个技能树有 3 个等级,目录前的序号是必要的,用来保持文件夹目录的顺序
* 每个目录下有一个 `config.json` 可配置关键词信息,其中 `node_id` 字段是生成的,请勿编辑
* 技能树`章节点`
* 位置:`data/xxx/xxx`,例如:`data/1.Java初阶/1.Java概述`
* 说明:
* 每个技能树的每个难度等级有 n 个章节,目录前的序号是必要的,用来保持文件夹目录的顺序
* 每个目录下有一个 `config.json` 可配置关键词信息,其中 `node_id` 字段是生成的,请勿编辑
* 技能树`知识节点`
* 位置:`data/xxx/xxx/xxx`,例如:`data/1.Java初阶/1.Java概述/1.什么是Java`
* 说明:
* 每个技能树的每章有 `n` 个知识节点,目录前的序号是必要的,用来保持文件夹目录的顺序
* 每个目录下有一个 `config.json`
* 其中 `node_id` 字段是生成的,请勿编辑
* 其中 `keywords` 可配置关键字字段
* 其中 `children` 可配置该`知识节点`下的子树结构信息,参考后面描述
* 其中 `export` 可配置该`知识节点`下的导出习题信息,参考后面描述
## `知识节点` 子树信息结构
例如 `data/1.Java初阶/1.Java概述/1.什么是Java/config.json` 里配置对该知识节点子树信息结构:
```json
{
// ...
"children": [
// TODO ...
],
}
```
## `知识节点` 的导出习题编辑
例如 `data/1.Java初阶/1.Java概述/1.什么是Java/config.json` 里配置对该知识节点导出的习题
```json
{
// ...
"export": [
// TODO ...
]
}
```
格式说明:
* `file`: 指定该目录下的习题源文件
* `variants`: 指定习题同名的json选项配置文件,参考下一节
* `depends`: 如果习题依赖同目录下的其他习题源代码,则在此字段里配置依赖的其他习题源文件名
## `知识节点` 的导出习题选项配置编辑
首先,在知识节点下增加一个习题代码,例如在 `data/1.Java初阶/1.Java概述/1.什么是Java` 下增加一个`HelloWorld.java`代码:
```java
// TODO
```
其次,增加一个同名的选项配置文件`HelloWorld.json`,目前有两种配置规则
**单行替换规则**
* 配置由`one_line`字段指定的单行替换字典
* 格式是:`"<源字符串>"`: [`"<替换字符串A>"`, `<替换字符串B>`,...],
* 其中每个 `"<源字符串>"` `/` `"<替换字符串A>"` 被生成为是一个替换选项
* 指定的配置应该能至少生成 `3+` 个替换选项
```json
{
// TODO
}
```
上面的替换规则会将代码替换成 3 个变种的代码:
```c
// 变种代码1
// TODO
```
```c
// 变种代码2
#include <stdio.h>
int main(int argc, char** argv){
print("Hello,Wrold!");
return 0
}
```
```c
// 变种代码3
// TODO
```
这些变种代码将会作为技能树该知识点该代码选择题的选项。
**多行替换规则**
* 配置由`multiline`字段指定的多行替换数组
* 数组的每个元素是一组替换规则,会整组被替换
例如:
```json
{
// TODO
}
```
同样,该配置将支持将源代码生成3个变种代码
```java
// 变种代码1
// TODO
```
```java
// 变种代码2, 注意第2组替换规则,包含了两行替换
// TODO
```
```java
// 变种代码3
// TODO
```
## 技能树合成
在根目录下执行 `python main.py` 会合成技能树文件,合成的技能树文件: `data/tree.json`
* 合成过程中,会自动检查每个目录下 `config.json` 里的 `node_id` 是否存在,不存在则生成
* 合成过程中,会自动检查每个知识点目录下 `config.json` 里的 `export` 里导出的习题配置,检查是否存在`exercise_id` 字段,如果不存在则生成
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"字节流概述": {
"keywords": [],
"children": []
}
},
{
"字节流读写文件": {
"keywords": [],
"children": []
}
},
{
"文件的拷贝": {
"keywords": [],
"children": []
}
},
{
"字节流的缓冲区": {
"keywords": [],
"children": []
}
},
{
"字节缓冲流": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"File类的常用方法": {
"keywords": [],
"children": []
}
},
{
"遍历目录下的文件": {
"keywords": [],
"children": []
}
},
{
"删除文件及目录": {
"keywords": [],
"children": []
}
},
{
"创建文件对象": {
"keywords": [],
"children": []
}
},
{
"文件操作": {
"keywords": [],
"children": []
}
},
{
"文件夹操作": {
"keywords": [],
"children": []
}
},
{
"目录列表器": {
"keywords": [],
"children": []
}
},
{
"目录实用工具": {
"keywords": [],
"children": []
}
},
{
"目录的检查及创建": {
"keywords": [],
"children": []
}
},
{
"文件的创建与删除": {
"keywords": [],
"children": []
}
},
{
"获取文件信息": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"截尾和舍入": {
"keywords": [],
"children": []
}
},
{
"提升": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"一元加、减操作符": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"测试对象的等价性": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"短路": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"用构造器确保初始化": {
"keywords": [],
"children": []
}
},
{
"缺省构造器": {
"keywords": [],
"children": []
}
},
{
"成员初始化": {
"keywords": [],
"children": [
{
"指定初始化": {
"keywords": [],
"children": []
}
}
]
}
},
{
"构造器初始化": {
"keywords": [],
"children": [
{
"初始化顺序": {
"keywords": [],
"children": []
}
},
{
"静态数据的初始化": {
"keywords": [],
"children": []
}
},
{
"显式的静态初始化": {
"keywords": [],
"children": []
}
}
]
}
},
{
"数组初始化": {
"keywords": [],
"children": [
{
"可变参数列表": {
"keywords": [],
"children": []
}
}
]
}
},
{
"枚举类型": {
"keywords": [],
"children": [
{
"基本enum特性": {
"keywords": [],
"children": [
{
"将静态导入用于enum": {
"keywords": [],
"children": []
}
}
]
}
},
{
"向enum中添加新方法": {
"keywords": [],
"children": [
{
"覆盖enum的方法": {
"keywords": [],
"children": []
}
}
]
}
},
{
"switch语句中的enum": {
"keywords": [],
"children": []
}
},
{
"values()的神秘之处": {
"keywords": [],
"children": []
}
},
{
"实现但不继承随机选取": {
"keywords": [],
"children": []
}
},
{
"为组织而使用接口": {
"keywords": [],
"children": []
}
},
{
"使用EnumSet替代标志": {
"keywords": [],
"children": []
}
},
{
"使用EnumMap": {
"keywords": [],
"children": []
}
},
{
"常数相关的方法": {
"keywords": [],
"children": [
{
"使用enum的职责链": {
"keywords": [],
"children": []
}
},
{
"使用enum的状态机": {
"keywords": [],
"children": []
}
}
]
}
},
{
"多路分发": {
"keywords": [],
"children": [
{
"使用enum分发": {
"keywords": [],
"children": []
}
},
{
"使用EnumMap分发": {
"keywords": [],
"children": []
}
}
]
}
},
{
"使用枚举类型设置常量": {
"keywords": [],
"children": []
}
},
{
"使用枚举类型的优势": {
"keywords": [],
"children": []
}
}
]
}
},
{
"类初始化块": {
"keywords": [],
"children": []
}
},
{
"Java访问权限修饰词": {
"keywords": [],
"children": [
{
"包访问权限": {
"keywords": [],
"children": []
}
},
{
"public:接口访问权限": {
"keywords": [],
"children": []
}
},
{
"private: 你无法访问": {
"keywords": [],
"children": []
}
},
{
"protected:继承访问权限": {
"keywords": [],
"children": []
}
}
]
}
},
{
"类的访问权限": {
"keywords": [],
"children": []
}
},
{
"组合语法": {
"keywords": [],
"children": []
}
},
{
"继承语法": {
"keywords": [],
"children": [
{
"初始化基类": {
"keywords": [],
"children": []
}
}
]
}
},
{
"代理": {
"keywords": [],
"children": [
{
"创建代理对象": {
"keywords": [],
"children": []
}
},
{
"代理类的特性": {
"keywords": [],
"children": []
}
}
]
}
},
{
"在组合与继承之间选择": {
"keywords": [],
"children": []
}
},
{
"protected关键字": {
"keywords": [],
"children": []
}
},
{
"添加一组元素": {
"keywords": [],
"children": []
}
},
{
"容器的打印": {
"keywords": [],
"children": []
}
},
{
"List": {
"keywords": [],
"children": []
}
},
{
"迭代器": {
"keywords": [],
"children": [
{
"ListIterator": {
"keywords": [],
"children": []
}
}
]
}
},
{
"LinkedList": {
"keywords": [],
"children": []
}
},
{
"Stack": {
"keywords": [],
"children": []
}
},
{
"Set": {
"keywords": [],
"children": []
}
},
{
"Map": {
"keywords": [],
"children": []
}
},
{
"Queue": {
"keywords": [],
"children": [
{
"PriorityQueue": {
"keywords": [],
"children": []
}
}
]
}
},
{
"Collection和Iterator": {
"keywords": [],
"children": []
}
},
{
"Foreach与迭代器": {
"keywords": [],
"children": [
{
"适配器方法惯用法": {
"keywords": [],
"children": []
}
}
]
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"概念": {
"keywords": [],
"children": []
}
},
{
"捕获异常": {
"keywords": [],
"children": [
{
"try块": {
"keywords": [],
"children": []
}
},
{
"异常处理程序": {
"keywords": [],
"children": []
}
},
{
"f?inally子句": {
"keywords": [],
"children": []
}
},
{
"try-with-Resources语句": {
"keywords": [],
"children": []
}
},
{
"分析堆栈轨迹元素": {
"keywords": [],
"children": []
}
}
]
}
},
{
"创建自定义异常": {
"keywords": [],
"children": []
}
},
{
"异常说明": {
"keywords": [],
"children": []
}
},
{
"捕获所有异常": {
"keywords": [],
"children": [
{
"栈轨迹": {
"keywords": [],
"children": []
}
},
{
"重新抛出异常": {
"keywords": [],
"children": []
}
},
{
"异常链": {
"keywords": [],
"children": []
}
}
]
}
},
{
"Java标准异常": {
"keywords": [],
"children": [
{
"特例: RuntimeException(运行时异常)": {
"keywords": [],
"children": []
}
}
]
}
},
{
"使用finally进行清理": {
"keywords": [],
"children": [
{
"finally用来做什么": {
"keywords": [],
"children": []
}
},
{
"在return中使用finally": {
"keywords": [],
"children": []
}
},
{
"缺憾:异常丢失": {
"keywords": [],
"children": []
}
}
]
}
},
{
"构造器": {
"keywords": [],
"children": [
{
"使用构造器执行初始化": {
"keywords": [],
"children": []
}
},
{
"构造器重载": {
"keywords": [],
"children": []
}
}
]
}
},
{
"异常匹配": {
"keywords": [],
"children": []
}
},
{
"其他可选方式": {
"keywords": [],
"children": [
{
"历史": {
"keywords": [],
"children": []
}
},
{
"观点": {
"keywords": [],
"children": []
}
},
{
"把异常传递给控制台": {
"keywords": [],
"children": []
}
},
{
"把“受检查异常”转换为“不受检查的异常”": {
"keywords": [],
"children": []
}
}
]
}
},
{
"异常使用指南": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"do-while": {
"keywords": [],
"children": []
}
},
{
"逗号操作符": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"抽象过程": {
"keywords": [],
"children": []
}
},
{
"每个对象都有一个接口": {
"keywords": [],
"children": []
}
},
{
"每个对象都提供服务": {
"keywords": [],
"children": []
}
},
{
"被隐藏的具体实现": {
"keywords": [],
"children": []
}
},
{
"复用具体实现": {
"keywords": [],
"children": []
}
},
{
"伴随多态的可互换对象": {
"keywords": [],
"children": []
}
},
{
"单根继承结构": {
"keywords": [],
"children": []
}
},
{
"容器": {
"keywords": [],
"children": [
{
"参数化类型(范型)": {
"keywords": [],
"children": []
}
}
]
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"基本映射操作": {
"keywords": [],
"children": []
}
},
{
"更新映射条目": {
"keywords": [],
"children": []
}
},
{
"映射视图": {
"keywords": [],
"children": []
}
},
{
"弱散列映射": {
"keywords": [],
"children": []
}
},
{
"链接散列集与映射": {
"keywords": [],
"children": []
}
},
{
"枚举集与映射": {
"keywords": [],
"children": []
}
},
{
"标识散列映射": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"二分查找": {
"keywords": [],
"children": []
}
},
{
"简单算法": {
"keywords": [],
"children": []
}
},
{
"批操作": {
"keywords": [],
"children": []
}
},
{
"编写自己的算法": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"属性映射": {
"keywords": [],
"children": []
}
},
{
"栈": {
"keywords": [],
"children": []
}
},
{
"位集": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"List接口简介": {
"keywords": [],
"children": []
}
},
{
"ArrayList集合": {
"keywords": [],
"children": []
}
},
{
"LinkedList集合": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Iterator遍历集合": {
"keywords": [],
"children": []
}
},
{
"foreach遍历集合": {
"keywords": [],
"children": []
}
},
{
"JDK 8的forEach遍历集合": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Set接口简介": {
"keywords": [],
"children": []
}
},
{
"HashSet集合": {
"keywords": [],
"children": []
}
},
{
"TreeSet集合": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Map接口简介": {
"keywords": [],
"children": []
}
},
{
"HashMap集合": {
"keywords": [],
"children": []
}
},
{
"Map集合遍历": {
"keywords": [],
"children": []
}
},
{
"TreeMap集合": {
"keywords": [],
"children": []
}
},
{
"Properties集合": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Collections工具类": {
"keywords": [],
"children": []
}
},
{
"Arrays工具类": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"聚合操作简介": {
"keywords": [],
"children": []
}
},
{
"创建Stream流对象": {
"keywords": [],
"children": []
}
},
{
"Stream流的常用方法": {
"keywords": [],
"children": []
}
},
{
"Parallel Stream(并行流)": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"集合接口与实现分离": {
"keywords": [],
"children": []
}
},
{
"泛型实用方法": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"输入流": {
"keywords": [],
"children": []
}
},
{
"输出流": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"FileInputStream类与FileOutputStream类": {
"keywords": [],
"children": []
}
},
{
"FileReader类与FileWriter类": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"BufferedInputStream类与BufferedOutputStream类": {
"keywords": [],
"children": []
}
},
{
"BufferedReader类与BufferedWriter类": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"压缩文件": {
"keywords": [],
"children": []
}
},
{
"解压缩ZIP文件": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"定义注解": {
"keywords": [],
"children": []
}
},
{
"元注解": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"注解元素": {
"keywords": [],
"children": []
}
},
{
"缺省值限制": {
"keywords": [],
"children": []
}
},
{
"生成外部文件": {
"keywords": [],
"children": []
}
},
{
"注解不支持继承": {
"keywords": [],
"children": []
}
},
{
"实现处理器": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"将@Unit用于泛型": {
"keywords": [],
"children": []
}
},
{
"不需要任何“套件”": {
"keywords": [],
"children": []
}
},
{
"实现@Unit": {
"keywords": [],
"children": []
}
},
{
"移除测试代码": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"更快的执行": {
"keywords": [],
"children": []
}
},
{
"改进代码设计": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"新建线程": {
"keywords": [],
"children": []
}
},
{
"可运行线程": {
"keywords": [],
"children": []
}
},
{
"阻塞和等待线程": {
"keywords": [],
"children": []
}
},
{
"终止线程": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"中断线程": {
"keywords": [],
"children": []
}
},
{
"守护线程": {
"keywords": [],
"children": []
}
},
{
"线程名": {
"keywords": [],
"children": []
}
},
{
"未捕获异常的处理器": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"阻塞队列": {
"keywords": [],
"children": []
}
},
{
"映射条目的原子更新": {
"keywords": [],
"children": []
}
},
{
"对并发散列映射的批操作": {
"keywords": [],
"children": []
}
},
{
"并发集视图": {
"keywords": [],
"children": []
}
},
{
"写数组的拷贝": {
"keywords": [],
"children": []
}
},
{
"并行数组算法": {
"keywords": [],
"children": []
}
},
{
"较早的线程安全集合": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"可完成Future": {
"keywords": [],
"children": []
}
},
{
"组合可完成Future": {
"keywords": [],
"children": []
}
},
{
"用户界面回调中的长时间运行任务": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"定义任务让步": {
"keywords": [],
"children": []
}
},
{
"使用Executor": {
"keywords": [],
"children": []
}
},
{
"从任务产生返回值": {
"keywords": [],
"children": []
}
},
{
"休眠": {
"keywords": [],
"children": []
}
},
{
"让步": {
"keywords": [],
"children": []
}
},
{
"编码的变体": {
"keywords": [],
"children": []
}
},
{
"术语": {
"keywords": [],
"children": []
}
},
{
"创建有响应的用户界面": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"不正确地访问资源": {
"keywords": [],
"children": []
}
},
{
"解决共享资源竞争": {
"keywords": [],
"children": []
}
},
{
"原子性与易变性": {
"keywords": [],
"children": []
}
},
{
"原子类": {
"keywords": [],
"children": []
}
},
{
"临界资源": {
"keywords": [],
"children": []
}
},
{
"在其他对象上同步": {
"keywords": [],
"children": []
}
},
{
"线程局部存储": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"装饰性花园": {
"keywords": [],
"children": []
}
},
{
"在阻塞时终结": {
"keywords": [],
"children": []
}
},
{
"中断": {
"keywords": [],
"children": []
}
},
{
"检查中断": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"wait()与notifyAll()": {
"keywords": [],
"children": []
}
},
{
"notify()与notifyAll()": {
"keywords": [],
"children": []
}
},
{
"生产者与消费者": {
"keywords": [],
"children": []
}
},
{
"任务间使用管道进行输入输出": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"比较各类互斥技术": {
"keywords": [],
"children": []
}
},
{
"免锁容器": {
"keywords": [],
"children": []
}
},
{
"乐观锁": {
"keywords": [],
"children": []
}
},
{
"ReadWriteLock": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"JDBC-ODBC桥": {
"keywords": [],
"children": []
}
},
{
"JDBC技术": {
"keywords": [],
"children": []
}
},
{
"JDBC驱动程序的类型": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"数据库基础": {
"keywords": [],
"children": []
}
},
{
"数据查询": {
"keywords": [],
"children": []
}
},
{
"动态查询": {
"keywords": [],
"children": []
}
},
{
"添加、修改、删除记录": {
"keywords": [],
"children": []
}
},
{
"数据库基础知识": {
"keywords": [],
"children": [
{
"什么是数据库": {
"keywords": [],
"children": []
}
},
{
"数据库的种类及功能": {
"keywords": [],
"children": []
}
},
{
"SQL语言": {
"keywords": [],
"children": []
}
}
]
}
},
{
"向数据库发送SQL语句": {
"keywords": [],
"children": []
}
},
{
"处理查询结果集": {
"keywords": [],
"children": []
}
},
{
"顺序查询": {
"keywords": [],
"children": []
}
},
{
"模糊查询": {
"keywords": [],
"children": []
}
},
{
"预处理语句": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"网络通信协议": {
"keywords": [],
"children": []
}
},
{
"IP地址和端口号": {
"keywords": [],
"children": []
}
},
{
"InetAddress": {
"keywords": [],
"children": []
}
},
{
"UDP与TCP协议": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"UDP通信简介": {
"keywords": [],
"children": []
}
},
{
"DatagramPacket": {
"keywords": [],
"children": []
}
},
{
"DatagramSocket": {
"keywords": [],
"children": []
}
},
{
"UDP网络程序": {
"keywords": [],
"children": []
}
},
{
"UDP案例——聊天程序": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"TCP通信简介": {
"keywords": [],
"children": []
}
},
{
"ServerSocket": {
"keywords": [],
"children": []
}
},
{
"Socket": {
"keywords": [],
"children": []
}
},
{
"简单的TCP网络程序": {
"keywords": [],
"children": []
}
},
{
"多线程的TCP网络程序": {
"keywords": [],
"children": []
}
},
{
"TCP案例——文件上传": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"网络基础知识": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"使用URLDecoder和URLEncoder": {
"keywords": [],
"children": []
}
},
{
"URL、URLConnection和URLPermission": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"TCP协议基础": {
"keywords": [],
"children": []
}
},
{
"使用ServerSocket创建TCP服务器端": {
"keywords": [],
"children": []
}
},
{
"使用Socket进行通信": {
"keywords": [],
"children": []
}
},
{
"记录用户信息": {
"keywords": [],
"children": []
}
},
{
"半关闭的Socket": {
"keywords": [],
"children": []
}
},
{
"使用NIO实现非阻塞Socket通信": {
"keywords": [],
"children": []
}
},
{
"使用AIO实现非阻塞通信": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"UDP协议基础": {
"keywords": [],
"children": []
}
},
{
"使用DatagramSocket发送、接收数据": {
"keywords": [],
"children": []
}
},
{
"使用MulticastSocket实现多点广播": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"直接使用Proxy创建连接": {
"keywords": [],
"children": []
}
},
{
"使用ProxySelector自动选择代理服务器": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"发送同步GET请求": {
"keywords": [],
"children": []
}
},
{
"发送带请求体的请求": {
"keywords": [],
"children": []
}
},
{
"发送异步请求": {
"keywords": [],
"children": []
}
},
{
"WebSocket客户端支持": {
"keywords": [],
"children": []
}
},
{
"基于WebSocket的多人实时聊天": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"类字面常量": {
"keywords": [],
"children": []
}
},
{
"泛化的Class引用": {
"keywords": [],
"children": []
}
},
{
"新的转型语法": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"使用类字面常量": {
"keywords": [],
"children": []
}
},
{
"动态instanceof": {
"keywords": [],
"children": []
}
},
{
"递归计数": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"类方法抽取器": {
"keywords": [],
"children": []
}
},
{
"Class类与Java反射": {
"keywords": [],
"children": [
{
"访问构造方法": {
"keywords": [],
"children": []
}
},
{
"访问成员变量": {
"keywords": [],
"children": []
}
},
{
"访问方法": {
"keywords": [],
"children": []
}
}
]
}
},
{
"使用Annotation功能": {
"keywords": [],
"children": [
{
"定义Annotation类型": {
"keywords": [],
"children": []
}
},
{
"访问Annotation信息": {
"keywords": [],
"children": []
}
}
]
}
},
{
"声明异常入门": {
"keywords": [],
"children": []
}
},
{
"资源": {
"keywords": [],
"children": []
}
},
{
"利用反射分析类的能力": {
"keywords": [],
"children": []
}
},
{
"使用反射在运行时分析": {
"keywords": [],
"children": []
}
},
{
"使用反射编写泛型数组": {
"keywords": [],
"children": []
}
},
{
"访问字段": {
"keywords": [],
"children": []
}
},
{
"调用方法": {
"keywords": [],
"children": []
}
},
{
"调用构造方法": {
"keywords": [],
"children": []
}
},
{
"获取继承关系": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"模拟对象与桩": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"List的排序和查询": {
"keywords": [],
"children": []
}
},
{
"设定Collection或Map为不可修改": {
"keywords": [],
"children": []
}
},
{
"Collection或Map的同步控制": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"WeakHashMap": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"一种Generator解决方案": {
"keywords": [],
"children": []
}
},
{
"Map生成器": {
"keywords": [],
"children": []
}
},
{
"使用Abstract类": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"未获支持的操作": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"优先级队列": {
"keywords": [],
"children": []
}
},
{
"双向队列": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"性能": {
"keywords": [],
"children": []
}
},
{
"SortedMap": {
"keywords": [],
"children": []
}
},
{
"LinkedHashMap": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"理解hashCode()": {
"keywords": [],
"children": []
}
},
{
"为速度而散列": {
"keywords": [],
"children": []
}
},
{
"覆盖hashCode()": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"性能测试框架": {
"keywords": [],
"children": []
}
},
{
"对List的选择": {
"keywords": [],
"children": []
}
},
{
"微基准测试的危险": {
"keywords": [],
"children": []
}
},
{
"对Set的选择": {
"keywords": [],
"children": []
}
},
{
"对Map的选择": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Java在编程语言生态系统中的位置": {
"keywords": [],
"children": []
}
},
{
"用行为参数化把代码传递给方法": {
"keywords": [],
"children": []
}
},
{
"并行与共享的可变数据": {
"keywords": [],
"children": []
}
},
{
"Java需要演变": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"方法和Lambda作为一等值": {
"keywords": [],
"children": [
{
"从Java程序中调用C函数": {
"keywords": [],
"children": []
}
},
{
"数值参数与返回值": {
"keywords": [],
"children": []
}
},
{
"字符串参数": {
"keywords": [],
"children": []
}
},
{
"访问域": {
"keywords": [],
"children": [
{
"访问静态域": {
"keywords": [],
"children": []
}
}
]
}
},
{
"编码签名": {
"keywords": [],
"children": []
}
},
{
"调用Java方法": {
"keywords": [],
"children": [
{
"静态方法": {
"keywords": [],
"children": []
}
},
{
"构造器": {
"keywords": [],
"children": []
}
},
{
"另一种方法调用": {
"keywords": [],
"children": []
}
}
]
}
},
{
"访问数组元素": {
"keywords": [],
"children": []
}
},
{
"使用调用API": {
"keywords": [],
"children": []
}
}
]
}
},
{
"传递代码:一个例子": {
"keywords": [],
"children": []
}
},
{
"从传递方法到Lambda": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"不断演进的API": {
"keywords": [],
"children": [
{
"初始版本的API": {
"keywords": [],
"children": []
}
},
{
"第二版API": {
"keywords": [],
"children": []
}
}
]
}
},
{
"概述默认方法": {
"keywords": [],
"children": []
}
},
{
"默认方法的使用模式": {
"keywords": [],
"children": [
{
"行为的多继承": {
"keywords": [],
"children": []
}
}
]
}
},
{
"解决冲突的规则": {
"keywords": [],
"children": [
{
"选择提供了最具体实现的默认方法的接口": {
"keywords": [],
"children": []
}
},
{
"冲突及如何显式地消除歧义": {
"keywords": [],
"children": []
}
}
]
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"采用防御式检查减少NullPointerException": {
"keywords": [],
"children": []
}
},
{
"其他语言中null的替代品": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"创建Optional对象": {
"keywords": [],
"children": []
}
},
{
"使用map从Optional对象中提取和转换值": {
"keywords": [],
"children": []
}
},
{
"使用flatMap链接Optional对象": {
"keywords": [],
"children": []
}
},
{
"操纵由Optional对象构成的Stream": {
"keywords": [],
"children": []
}
},
{
"默认行为及解引用Optional对象": {
"keywords": [],
"children": []
}
},
{
"两个Optional对象的组合": {
"keywords": [],
"children": []
}
},
{
"使用filter剔除特定的值": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"处理HTTP GET请求": {
"keywords": [],
"children": []
}
},
{
"处理HTTP POST请求": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"创建和编译servlet源代码": {
"keywords": [],
"children": []
}
},
{
"启动Tomcat": {
"keywords": [],
"children": []
}
},
{
"启动Web浏览器并请求servlet": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Servlet接口": {
"keywords": [],
"children": []
}
},
{
"ServletConfig接口": {
"keywords": [],
"children": []
}
},
{
"ServletContext接口": {
"keywords": [],
"children": []
}
},
{
"ServletRequest接口": {
"keywords": [],
"children": []
}
},
{
"ServletResponse接口": {
"keywords": [],
"children": []
}
},
{
"GenericServlet类": {
"keywords": [],
"children": []
}
},
{
"ServletInputStream类": {
"keywords": [],
"children": []
}
},
{
"ServletOutputStream类": {
"keywords": [],
"children": []
}
},
{
"servlet异常类": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"HttpServletRequest接口": {
"keywords": [],
"children": []
}
},
{
"HttpServletResponse接口": {
"keywords": [],
"children": []
}
},
{
"HttpSession接口": {
"keywords": [],
"children": []
}
},
{
"Cookie类": {
"keywords": [],
"children": []
}
},
{
"HttpServlet类": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"其他的线程抽象:非嵌套方法调用": {
"keywords": [],
"children": []
}
},
{
"你希望线程为你带来什么": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Future风格的API": {
"keywords": [],
"children": []
}
},
{
"反应式风格的API": {
"keywords": [],
"children": []
}
},
{
"有害的睡眠及其他阻塞式操作": {
"keywords": [],
"children": []
}
},
{
"如何使用异步API进行异常处理": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"背压": {
"keywords": [],
"children": []
}
},
{
"一种简单的真实背压": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"将同步方法转换为异步方法": {
"keywords": [],
"children": []
}
},
{
"错误处理": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"使用并行流对请求进行并行操作": {
"keywords": [],
"children": []
}
},
{
"使用CompletableFuture发起异步请求": {
"keywords": [],
"children": []
}
},
{
"寻找更好的方案": {
"keywords": [],
"children": []
}
},
{
"使用定制的执行器": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"实现折扣服务": {
"keywords": [],
"children": []
}
},
{
"使用Discount服务": {
"keywords": [],
"children": []
}
},
{
"构造同步和异步操作": {
"keywords": [],
"children": []
}
},
{
"将两个CompletableFuture对象整合起来,无论它们是否存在依赖": {
"keywords": [],
"children": []
}
},
{
"对Future和Completable-Future的回顾": {
"keywords": [],
"children": []
}
},
{
"高效地使用超时机制": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"对最佳价格查询器应用的优化": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"应用层的反应式编程": {
"keywords": [],
"children": []
}
},
{
"反应式系统": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Flow类": {
"keywords": [],
"children": []
}
},
{
"创建你的第一个反应式应用": {
"keywords": [],
"children": []
}
},
{
"使用Processor转换数据": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"转换及整合多个Observable": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"通过反射构建对象": {
"keywords": [],
"children": []
}
},
{
"反射方法": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Spring IoC概述": {
"keywords": [],
"children": [
{
"主动创建对象": {
"keywords": [],
"children": []
}
},
{
"被动创建对象": {
"keywords": [],
"children": []
}
},
{
"Spring IoC阐述": {
"keywords": [],
"children": []
}
}
]
}
},
{
"Spring IoC容器": {
"keywords": [],
"children": [
{
"Spring IoC容器的设计": {
"keywords": [],
"children": []
}
},
{
"Spring IoC容器的初始化和依赖注入": {
"keywords": [],
"children": []
}
},
{
"Spring Bean的生命周期": {
"keywords": [],
"children": []
}
}
]
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"依赖注入的3种方式": {
"keywords": [],
"children": [
{
"构造器注入": {
"keywords": [],
"children": []
}
},
{
"使用setter注入": {
"keywords": [],
"children": []
}
},
{
"接口注入": {
"keywords": [],
"children": []
}
}
]
}
},
{
"装配Bean概述": {
"keywords": [],
"children": []
}
},
{
"通过XML配置装配Bean": {
"keywords": [],
"children": [
{
"装配简易值": {
"keywords": [],
"children": []
}
},
{
"装配集合": {
"keywords": [],
"children": []
}
},
{
"命名空间装配": {
"keywords": [],
"children": []
}
}
]
}
},
{
"通过注解装配Bean": {
"keywords": [],
"children": [
{
"使用@Component装配Bean": {
"keywords": [],
"children": []
}
},
{
"自动装配——@Autowired": {
"keywords": [],
"children": []
}
},
{
"自动装配的歧义性(@Primary和@Qualifier)": {
"keywords": [],
"children": []
}
},
{
"装载带有参数的构造方法类": {
"keywords": [],
"children": []
}
},
{
"使用@Bean装配Bean": {
"keywords": [],
"children": []
}
},
{
"注解自定义Bean的初始化和销毁方法": {
"keywords": [],
"children": []
}
}
]
}
},
{
"装配的混合使用": {
"keywords": [],
"children": []
}
},
{
"使用Profile": {
"keywords": [],
"children": [
{
"使用注解@Profile配置": {
"keywords": [],
"children": []
}
},
{
"使用XML定义Profile": {
"keywords": [],
"children": []
}
},
{
"启动Profile": {
"keywords": [],
"children": []
}
},
{
"点睛": {
"keywords": [],
"children": []
}
},
{
"演示": {
"keywords": [],
"children": []
}
}
]
}
},
{
"加载属性(properties)文件": {
"keywords": [],
"children": [
{
"使用注解方式加载属性文件": {
"keywords": [],
"children": []
}
},
{
"使用XML方式加载属性文件": {
"keywords": [],
"children": []
}
}
]
}
},
{
"条件化装配Bean": {
"keywords": [],
"children": []
}
},
{
"Bean的作用域": {
"keywords": [],
"children": []
}
},
{
"使用Spring表达式(Spring EL)": {
"keywords": [],
"children": [
{
"Spring EL相关的类": {
"keywords": [],
"children": []
}
},
{
"Spring EL运算": {
"keywords": [],
"children": []
}
}
]
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"一个简单的约定游戏": {
"keywords": [],
"children": [
{
"约定规则": {
"keywords": [],
"children": []
}
},
{
"读者的代码": {
"keywords": [],
"children": []
}
},
{
"笔者的代码": {
"keywords": [],
"children": []
}
}
]
}
},
{
"Spring AOP的基本概念": {
"keywords": [],
"children": [
{
"AOP的概念和使用原因": {
"keywords": [],
"children": []
}
},
{
"面向切面编程的术语": {
"keywords": [],
"children": []
}
},
{
"Spring对AOP的支持": {
"keywords": [],
"children": []
}
}
]
}
},
{
"使用@AspectJ注解开发Spring AOP": {
"keywords": [],
"children": [
{
"选择切点": {
"keywords": [],
"children": []
}
},
{
"创建切面": {
"keywords": [],
"children": []
}
},
{
"连接点": {
"keywords": [],
"children": []
}
},
{
"测试AOP": {
"keywords": [],
"children": [
{
"装配AOP": {
"keywords": [],
"children": []
}
},
{
"使用注解装配AOP": {
"keywords": [],
"children": []
}
},
{
"AOP避坑指南": {
"keywords": [],
"children": []
}
}
]
}
},
{
"环绕通知": {
"keywords": [],
"children": []
}
},
{
"织入": {
"keywords": [],
"children": []
}
},
{
"给通知传递参数": {
"keywords": [],
"children": []
}
},
{
"引入": {
"keywords": [],
"children": []
}
}
]
}
},
{
"使用XML配置开发Spring AOP": {
"keywords": [],
"children": [
{
"前置通知、后置通知、返回通知和异常通知": {
"keywords": [],
"children": []
}
},
{
"环绕通知": {
"keywords": [],
"children": []
}
},
{
"给通知传递参数": {
"keywords": [],
"children": []
}
},
{
"引入": {
"keywords": [],
"children": []
}
}
]
}
},
{
"经典Spring AOP应用程序": {
"keywords": [],
"children": []
}
},
{
"多个切面": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"传统的JDBC代码的弊端": {
"keywords": [],
"children": []
}
},
{
"配置数据库资源": {
"keywords": [],
"children": [
{
"使用简单数据库配置": {
"keywords": [],
"children": []
}
},
{
"使用第三方数据库连接池": {
"keywords": [],
"children": []
}
},
{
"使用JNDI数据库连接池": {
"keywords": [],
"children": []
}
}
]
}
},
{
"JDBC代码失控的解决方案——jdbcTemplate": {
"keywords": [],
"children": [
{
"jdbcTemplate的增、删、查、改": {
"keywords": [],
"children": []
}
},
{
"执行多条SQL": {
"keywords": [],
"children": []
}
},
{
"jdbcTemplate的源码分析": {
"keywords": [],
"children": []
}
}
]
}
},
{
"Spring的缺点": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Spring数据库事务管理器的设计": {
"keywords": [],
"children": [
{
"配置事务管理器": {
"keywords": [],
"children": []
}
},
{
"用Java配置方式实现Spring数据库事务": {
"keywords": [],
"children": []
}
}
]
}
},
{
"编程式事务": {
"keywords": [],
"children": []
}
},
{
"声明式事务": {
"keywords": [],
"children": [
{
"Transactional的配置项": {
"keywords": [],
"children": []
}
},
{
"使用XML进行配置事务管理器": {
"keywords": [],
"children": []
}
},
{
"事务定义器": {
"keywords": [],
"children": []
}
},
{
"声明式事务的约定流程": {
"keywords": [],
"children": []
}
}
]
}
},
{
"数据库的相关知识": {
"keywords": [],
"children": [
{
"数据库事务ACID特性": {
"keywords": [],
"children": []
}
},
{
"丢失更新": {
"keywords": [],
"children": []
}
},
{
"隔离级别": {
"keywords": [],
"children": []
}
}
]
}
},
{
"选择隔离级别和传播行为": {
"keywords": [],
"children": [
{
"选择隔离级别": {
"keywords": [],
"children": []
}
},
{
"传播行为": {
"keywords": [],
"children": []
}
}
]
}
},
{
"在Spring+MyBatis组合中使用事务": {
"keywords": [],
"children": []
}
},
{
"典型错误用法的剖析": {
"keywords": [],
"children": [
{
"错误使用Service": {
"keywords": [],
"children": []
}
},
{
"过长时间占用事务": {
"keywords": [],
"children": []
}
},
{
"错误捕捉异常": {
"keywords": [],
"children": []
}
}
]
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Java配置": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"注解@RequestAttribute": {
"keywords": [],
"children": []
}
},
{
"注解@SessionAttribute和注解@SessionAttributes": {
"keywords": [],
"children": []
}
},
{
"注解@CookieValue和注解@RequestHeader": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"使用JSR 303注解验证输入内容": {
"keywords": [],
"children": []
}
},
{
"使用验证器": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"视图": {
"keywords": [],
"children": []
}
},
{
"视图解析器": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"HttpMessageConverter和JSON消息转换器": {
"keywords": [],
"children": []
}
},
{
"一对一转换器(Converter)": {
"keywords": [],
"children": []
}
},
{
"数组和集合转换器GenericConverter": {
"keywords": [],
"children": []
}
},
{
"使用格式化器(Formatter)": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"MessageSource接口": {
"keywords": [],
"children": []
}
},
{
"CookieLocaleResolver和SessionLocaleResolver": {
"keywords": [],
"children": []
}
},
{
"国际化拦截器(LocaleChangeInterceptor)": {
"keywords": [],
"children": []
}
},
{
"开发国际化": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"示例": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"示例": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"示例": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"示例": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"示例": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"第一类:直接导入配置类": {
"keywords": [],
"children": []
}
},
{
"第二类:依据条件选择配置类": {
"keywords": [],
"children": []
}
},
{
"第三类:动态注册Bean": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"示例": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"初试牛刀:筛选绿苹果": {
"keywords": [],
"children": []
}
},
{
"再展身手:把颜色作为参数": {
"keywords": [],
"children": []
}
},
{
"第三次尝试:对你能想到的每个属性做筛选": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"匿名类": {
"keywords": [],
"children": []
}
},
{
"第五次尝试:使用匿名类": {
"keywords": [],
"children": []
}
},
{
"第六次尝试:使用Lambda表达式": {
"keywords": [],
"children": []
}
},
{
"第七次尝试:将List类型抽象化": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"用Comparator来排序": {
"keywords": [],
"children": []
}
},
{
"用Runnable执行代码块": {
"keywords": [],
"children": []
}
},
{
"通过Callable返回结果": {
"keywords": [],
"children": []
}
},
{
"GUI事件处理": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"构建SqlSessionFactory过程": {
"keywords": [],
"children": [
{
"构建Configuration": {
"keywords": [],
"children": []
}
},
{
"构建映射器的内部组成": {
"keywords": [],
"children": []
}
},
{
"构建SqlSessionFactory": {
"keywords": [],
"children": []
}
}
]
}
},
{
"SqlSession运行过程": {
"keywords": [],
"children": [
{
"映射器(Mapper)的动态代理": {
"keywords": [],
"children": []
}
},
{
"SqlSession下的四大对象": {
"keywords": [],
"children": []
}
}
]
}
},
{
"插件接口": {
"keywords": [],
"children": []
}
},
{
"插件的初始化": {
"keywords": [],
"children": []
}
},
{
"插件的代理和反射设计": {
"keywords": [],
"children": []
}
},
{
"常用的工具类——MetaObject": {
"keywords": [],
"children": []
}
},
{
"映射器": {
"keywords": [],
"children": [
{
"select元素——查询语句": {
"keywords": [],
"children": [
{
"简单的select元素的应用": {
"keywords": [],
"children": []
}
},
{
"自动映射和驼峰映射": {
"keywords": [],
"children": []
}
},
{
"传递多个参数": {
"keywords": [],
"children": []
}
},
{
"使用resultMap映射结果集": {
"keywords": [],
"children": []
}
},
{
"分页参数RowBounds": {
"keywords": [],
"children": []
}
}
]
}
},
{
"insert元素——插入语句": {
"keywords": [],
"children": [
{
"简单的insert语句的应用": {
"keywords": [],
"children": []
}
},
{
"主键回填": {
"keywords": [],
"children": []
}
},
{
"自定义主键": {
"keywords": [],
"children": []
}
}
]
}
},
{
"update元素和delete元素": {
"keywords": [],
"children": []
}
},
{
"sql元素": {
"keywords": [],
"children": []
}
},
{
"参数": {
"keywords": [],
"children": [
{
"存储过程参数支持": {
"keywords": [],
"children": []
}
},
{
"特殊字符串的替换和处理(#和$)": {
"keywords": [],
"children": []
}
}
]
}
},
{
"resultMap元素": {
"keywords": [],
"children": [
{
"resultMap元素的构成": {
"keywords": [],
"children": []
}
},
{
"使用map存储结果集": {
"keywords": [],
"children": []
}
},
{
"使用POJO存储结果集": {
"keywords": [],
"children": []
}
}
]
}
},
{
"级联": {
"keywords": [],
"children": [
{
"MyBatis中的级联": {
"keywords": [],
"children": []
}
},
{
"建立POJO": {
"keywords": [],
"children": []
}
},
{
"配置映射文件": {
"keywords": [],
"children": []
}
},
{
"延迟加载": {
"keywords": [],
"children": []
}
},
{
"另一种级联": {
"keywords": [],
"children": []
}
},
{
"多对多级联": {
"keywords": [],
"children": []
}
}
]
}
},
{
"缓存": {
"keywords": [],
"children": [
{
"一级缓存和二级缓存": {
"keywords": [],
"children": []
}
},
{
"缓存配置项、自定义和引用": {
"keywords": [],
"children": []
}
}
]
}
},
{
"存储过程": {
"keywords": [],
"children": [
{
"IN和OUT参数存储过程": {
"keywords": [],
"children": []
}
},
{
"游标的使用": {
"keywords": [],
"children": []
}
}
]
}
}
]
}
},
{
"动态SQL": {
"keywords": [],
"children": [
{
"if元素": {
"keywords": [],
"children": []
}
},
{
"choose、when、otherwise元素": {
"keywords": [],
"children": []
}
},
{
"trim、where、set元素": {
"keywords": [],
"children": []
}
},
{
"foreach元素": {
"keywords": [],
"children": []
}
},
{
"用test的属性判断字符串": {
"keywords": [],
"children": []
}
},
{
"bind元素": {
"keywords": [],
"children": []
}
}
]
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"函数式接口": {
"keywords": [],
"children": []
}
},
{
"函数描述符": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"第 1 步:记得行为参数化": {
"keywords": [],
"children": []
}
},
{
"第 2 步:使用函数式接口来传递行为": {
"keywords": [],
"children": []
}
},
{
"第 3 步:执行一个行为": {
"keywords": [],
"children": []
}
},
{
"第 4 步:传递Lambda": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"Predicate": {
"keywords": [],
"children": []
}
},
{
"Consumer": {
"keywords": [],
"children": []
}
},
{
"Function": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"类型检查": {
"keywords": [],
"children": []
}
},
{
"同样的Lambda,不同的函数式接口": {
"keywords": [],
"children": []
}
},
{
"类型推断": {
"keywords": [],
"children": []
}
},
{
"使用局部变量": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"管中窥豹": {
"keywords": [],
"children": []
}
},
{
"构造函数引用": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"比较器复合": {
"keywords": [],
"children": []
}
},
{
"谓词复合": {
"keywords": [],
"children": []
}
},
{
"函数复合": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [
{
"积分": {
"keywords": [],
"children": []
}
},
{
"与Java 8的Lambda联系起来": {
"keywords": [],
"children": []
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
}
\ No newline at end of file
{
"tree_name": "Java",
"keywords": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
\ No newline at end of file
因为 它太大了无法显示 source diff 。你可以改为 查看blob
from src.tree import gen_tree
if __name__ == '__main__':
gen_tree('data')
from genericpath import exists
import json
import os
import uuid
import sys
import re
def load_json(p):
with open(p, 'r') as f:
return json.loads(f.read())
def dump_json(p, j, exist_ok=False, override=False):
if os.path.exists(p):
if exist_ok:
if not override:
return
else:
print(f"{p} already exist")
sys.exit(0)
with open(p, 'w') as f:
f.write(json.dumps(j, indent=2, ensure_ascii=False))
def parse_no_name(d):
p = r'(\d+)\.(.*)'
m = re.search(p, d)
try:
no = int(m.group(1))
dir_name = m.group(2)
except:
sys.exit(0)
return no, dir_name
def gen_tree(data_path):
root = {}
def gen_node_id():
return ''.join(str(uuid.uuid5(uuid.NAMESPACE_URL, 'skill_tree')).split('-'))
def list_dir(p):
v = os.listdir(p)
v.sort()
for no_name in v:
no_dir = os.path.join(p, no_name)
if os.path.isdir(no_dir):
yield no_dir, no_name
def ensure_node_id(cfg_path, cfg):
if cfg.get('node_id') is None:
cfg['node_id'] = gen_node_id()
dump_json(cfg_path, cfg, exist_ok=True, override=True)
def make_node(name, node_id, keywords, children=None):
node = {}
node_children = children or []
node[name] = {
'node_id': node_id,
'keywords': keywords,
'children': node_children
}
return node, node_children
# 根节点
cfg_path = os.path.join(data_path, 'config.json')
cfg = load_json(cfg_path)
ensure_node_id(cfg_path, cfg)
tree_node = {
"node_id": cfg['node_id'],
"keywords": cfg['keywords'],
"children": []
}
root[cfg['tree_name']] = tree_node
# 难度节点
for level_no_dir, level_no_name in list_dir(data_path):
print(level_no_dir)
no, level_name = parse_no_name(level_no_name)
cfg_path = os.path.join(level_no_dir, 'config.json')
cfg = load_json(cfg_path)
ensure_node_id(cfg_path, cfg)
level_node, level_node_children = make_node(
level_name, cfg['node_id'], cfg['keywords'])
tree_node['children'].append(level_node)
# 章节点
for chapter_no_dir, chapter_no_name in list_dir(level_no_dir):
no, chapter_name = parse_no_name(chapter_no_name)
cfg_path = os.path.join(chapter_no_dir, 'config.json')
ensure_node_id(cfg_path, cfg)
cfg = load_json(cfg_path)
chapter_node, chapter_node_children = make_node(
chapter_name, cfg['node_id'], cfg['keywords'])
level_node_children.append(chapter_node)
# 知识点
for section_no_dir, section_no_name in list_dir(chapter_no_dir):
no, section_name = parse_no_name(section_no_name)
cfg_path = os.path.join(section_no_dir, 'config.json')
ensure_node_id(cfg_path, cfg)
cfg = load_json(cfg_path)
section_node, section_node_children = make_node(
section_name, cfg['node_id'], cfg['keywords'], cfg['children'])
chapter_node_children.append(section_node)
# 确保习题分配了习题ID
for export in cfg['export']:
if export.get('exercise_id') is None:
export['exercise_id'] = gen_node_id()
dump_json(cfg_path, cfg, exist_ok=True, override=True)
# 保存技能树骨架
tree_path = os.path.join(data_path, 'tree.json')
dump_json(tree_path, root, exist_ok=True, override=True)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册