每日小结

Java 答辩结束了, Yeah

今天开始刷题

Hash Map, Hash Set vs Tree Map, Tree Set

c++中的map, set默认是treemap和treeset, 底层基于红黑树, 元素始终保持有序

unordered_map, unordered_set底层基于哈希表

#对比

查询/插入/删除

数据结构底层find/get/containsetdelete
maptreeO(1)O(1)O(1)
unordered_maphashO(1)O(1)O(1)
数据结构底层find/containinsertdelete
settreeO(1)O(1)O(1)
unordered_sethashO(1)O(1)O(1)

遍历

mapset都支持按序遍历, 而unordered_map, unordered_set天生就不适合按序遍历(底层不是按序存储), 但是可以无序遍历

Java 项目总结

#前端

#后端

#Java Web项目的基本结构

Controller层: 前端实际调用的接口, 包括用户鉴权, 页面跳转等等, 接口内部调用Service层来实现功能.

Service层: 实际的业务逻辑, 一般按照功能分包, 尽量做到与Controller层脱钩, 一般都是些无状态函数(对环境不做任何假设)

DAO层: 与数据库相关的代码, 也被称为持久层

#Spring框架

Spring框架的核心:

  1. 通过依赖注入来降低代码之间的耦合(IoC控制反转)

    例如: @Autowired, @Bean, @Resource

  2. 对AOP的支持

    这个没怎么用到

  3. 对各种工具的集成和支持

    例如: Spring Data JPA, Spring Security等等

#Spring Boot框架

Spring Boot能够自动识别项目中开启的功能(通过扫描安装的依赖包or配置文件?)

项目配置全部写在application.[properties|yml]中, 框架会自动识别

也可以自己定义一些key, 在代码中通过@Value("xxx.yyy")注入

#JWT鉴权

JWT的三部分: Header.Payload.Signature

1
2
3
4
5
6
7
8
9
10
Header = {"alg":"HS256","typ":"JWT"}

Payload = {"sub":"1234567890","name":"John Doe","iat":1516239022}

_Header64 = base64UrlEncode(Header)
_Payload64 = base64UrlEncode(Payload)

Signature = HMACSHA256(`${_Header64}.${_Payload64}`, ${your-256-bit-secret})

JWT = `${_Header64}.${_Payload64}.${Signature}`