Skip to content

Commit

Permalink
new update for learning note
Browse files Browse the repository at this point in the history
  • Loading branch information
rbmonster committed Feb 2, 2021
1 parent badf1ee commit a647403
Show file tree
Hide file tree
Showing 10 changed files with 544 additions and 33 deletions.
5 changes: 4 additions & 1 deletion src/main/java/com/design/SYSTEM-DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,16 @@ OOP=对象+类+继承+多态+消息,其中核心概念是类和对象。
特点: 封装、多态、继承

### 面向过程编程

面向过程编程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

### 函数式编程
函数式编程类似于面向过程的程序设计,但其思想更接近数学计算。允许把函数本身作为参数传入另一个函数,还允许返回一个函数。是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量。
> 面向过程编程体现的是解决方法的步骤,而函数式编程体现的是数据集的映射。
## 六大设计原则
### 单一职责原则
定义:单一职责原则适用于类、接口、方法。

## MVC 模式
MVC是一种框架模式。经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器。

Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/learning/basic/JAVA_BASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,10 @@ public boolean equals(Object o) {
- 接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。
- 接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。

设计上对比:
- 抽象类: 拓展继承该抽象类的模块的类的行为功能(开放闭合原则)
- 接口:约束继承该接口的类行为(依赖倒置原则)

### super关键字
- 访问父类的构造函数:可以使用 super() 函数访问父类的构造函数,从而委托父类完成一些初始化的工作。
- 访问父类的成员:如果子类重写了父类的某个方法,可以通过使用 super 关键字来引用父类的方法实现。
Expand Down
29 changes: 25 additions & 4 deletions src/main/java/com/toc/ALGORITHM.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@
&emsp;<a href="#26">11. 单调栈</a>
&emsp;<a href="#27">12. 单调队列</a>
&emsp;<a href="#28">13. 前缀树</a>
&emsp;&emsp;<a href="#29">13.1. 贪心算法</a>
&emsp;<a href="#29">14. 贪心算法</a>
&emsp;<a href="#30">15. TODO List</a>
# <a name="0">算法</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>

## <a name="1">哈希表</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>
Expand Down Expand Up @@ -299,7 +300,22 @@ private int maximum_depth(TreeNode root) {
构造二叉树问题:
- 从前序与中序遍历序列构造二叉树:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
- 从中序与后序遍历序列构造二叉树:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

- 层序遍历构建二叉树思路: 根节点区分两个区间,获取中序左区间内的Set。遍历层序数组,第一个节点即为根节点。
- ```
ori:
in[] = {4, 8, 10, 12, 14, 20, 22};
level[] = {20, 8, 22, 4, 12, 10, 14};
20
/ \
/ \
{4,8,10,12,14} {22}
next:
In[] = {4, 8, 10, 12, 14}
level[] = {8, 4, 12, 10, 14}
```
公共祖先问题:
- 二叉树的最近公共祖先:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
Expand Down Expand Up @@ -605,12 +621,17 @@ public int[] maxSlidingWindow(int[] nums, int k) {
它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
### <a name="29">贪心算法</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>
## <a name="29">贪心算法</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>
[CS-Note](http://www.cyc2018.xyz/%E7%AE%97%E6%B3%95/Leetcode%20%E9%A2%98%E8%A7%A3/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E8%B4%AA%E5%BF%83%E6%80%9D%E6%83%B3.html#_1-%E5%88%86%E9%85%8D%E9%A5%BC%E5%B9%B2)
1. [分配饼干](https://leetcode-cn.com/problems/assign-cookies/description/)
- 每次分配给满足孩子的最小的饼干
2. [不重叠的区间个数](https://leetcode-cn.com/problems/non-overlapping-intervals/)
- 每次取结尾最小的区间,留给后面选择的区间更大,移除的区间越小。按区间结尾排序。
3. [投飞镖刺破气球](https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/)
- 与上述类似,每次取结尾最小的区间,
- 与上述类似,每次取结尾最小的区间,
## <a name="30">TODO List</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>
计算1的个数
9 changes: 9 additions & 0 deletions src/main/java/com/toc/COLLECTION.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
&emsp;&emsp;<a href="#30">5.1. 如何选用集合?</a>
&emsp;&emsp;<a href="#31">5.2. ArrayList 带参数及不带参数</a>
&emsp;&emsp;<a href="#32">5.3. Arrays.asList() 方法</a>
&emsp;&emsp;<a href="#33">5.4. hash 冲突解决方案</a>
# <a name="0">集合</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>
![avatar](https://github.com/rbmonster/learning-note/blob/master/src/main/java/com/learning/basic/picture/collectionfamily.jpg)
- 集合主要分为两大类,一个实现collection接口的,一个是实现了Map接口的。
Expand Down Expand Up @@ -563,3 +564,11 @@ public class Arrays{
}
}
```
### <a name="33">hash 冲突解决方案</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>
1. 链地址法:HashMap中hash冲突节点,使用链表和红黑树解决
2. 线性探测再散列:ThreadLocal中ThreadLocalMap的hash冲突,会线性向后探索直到寻找到向下一个空的节点。
3. 再哈希法。
> 这种方法是同时构造多个不同的哈希函数:Hi=RH1(key) i=1,2,…,k。当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。
- [Hash冲突的四种解决办法](https://www.cnblogs.com/gongcheng-/p/10894205.html#_label1_0)
41 changes: 40 additions & 1 deletion src/main/java/com/toc/INTERFACE_DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
&emsp;&emsp;<a href="#11">4.2. 2. @RestControllerAdvice + @ExceptionHandler(MethodArgumentNotValidException.class)</a>
&emsp;&emsp;<a href="#12">4.3. 3. 使用统一的数据返回结构JsonResponse 包括异常类型</a>
&emsp;&emsp;<a href="#13">4.4. 使用swagger暴露参数</a>
&emsp;<a href="#14">5. 接口安全相关</a>
&emsp;&emsp;<a href="#15">5.1. API Token(接口令牌)</a>
&emsp;&emsp;<a href="#16">5.2. 攻击行为防御</a>
&emsp;&emsp;<a href="#17">5.3. 相关资料</a>
# <a name="0">接口设计</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>
- Representational State Transfer(REST)。REST的概念是将API结构分离为操作和资源,使用HTTP方法GET、DELETE、POST和PUT操作资源。

Expand Down Expand Up @@ -165,4 +169,39 @@ Content-Type: application/json
- RestControllerAdvice顾名思义,就是声明了范围内的RestController的建议处理控制

### <a name="13">使用swagger暴露参数</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>
- Swagger是一种广泛使用的工具来用来记录与呈现 REST API,它提供了一种探索特定 API 使用的方法,因此允许开发人员理解底层的语义行为。
- Swagger是一种广泛使用的工具来用来记录与呈现 REST API,它提供了一种探索特定 API 使用的方法,因此允许开发人员理解底层的语义行为。

## <a name="14">接口安全相关</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>

### <a name="15">API Token(接口令牌)</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>

1. 接口调用方(客户端)向接口提供方(服务器)申请接口调用账号,申请成功后,接口提供方会给接口调用方一个appId和一个key参数
2. 客户端携带参数appId、timestamp、sign去调用服务器端的API token,其中sign=加密(appId + timestamp + key)
3. 客户端拿着api_token 去访问不需要登录就能访问的接口
4. 当访问用户需要登录的接口时,客户端跳转到登录页面,通过用户名和密码调用登录接口,登录接口会返回一个usertoken, 客户端拿着usertoken 去访问需要登录才能访问的接口
> sign的作用是防止参数被篡改,客户端调用服务端时需要传递sign参数,服务器响应客户端时也可以返回一个sign用于客户度校验返回的值是否被非法篡改了。客户端传的sign和服务器端响应的sign算法可能会不同。
验证参数放置在请求头
```
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
String timestamp = request.getHeader("timestamp");
// 随机字符串
String nonce = request.getHeader("nonce");
String sign = request.getHeader("sign");
}
```


### <a name="16">攻击行为防御</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>
1. 错误达到3次,验证码或者滑块验证
2. 错误达到10次,手机验证码验证登陆。
3. IP限制
> 不能直接根据错误次数封死账号登陆,可能会导致整个系统的账户都被黑客暴力破解至无法登陆。


### <a name="17">相关资料</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>
- 接口安全设计:https://mp.weixin.qq.com/s/Az17l4SJXvcbXNu4A1j1Xg
- 接口可能遇到的攻击:https://mp.weixin.qq.com/s/j0wjQLwkcXnRx7YTU6Lssg
4 changes: 4 additions & 0 deletions src/main/java/com/toc/JAVA_BASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,10 @@ public boolean equals(Object o) {
- 接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。
- 接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。

设计上对比:
- 抽象类: 拓展继承该抽象类的模块的类的行为功能(开放闭合原则)
- 接口:约束继承该接口的类行为(依赖倒置原则)

### <a name="20">super关键字</a><a style="float:right;text-decoration:none;" href="#index">[Top]</a>
- 访问父类的构造函数:可以使用 super() 函数访问父类的构造函数,从而委托父类完成一些初始化的工作。
- 访问父类的成员:如果子类重写了父类的某个方法,可以通过使用 super 关键字来引用父类的方法实现。
Expand Down
Loading

0 comments on commit a647403

Please sign in to comment.