一、数据结构和算法
- 常用数据结构
- 数组:大小固定的数据结构。顺序存储,随机访问。
- 链表:链表存储,顺序访问。主要有循环单链表,双向链表,循环双向链表。
- 堆:二叉堆。
- 栈:又叫LIFO表,后进先出。限制插入和删除只能在栈顶进行操作。
- 队列:又叫FIFO表,先进先出。限制删除只能在对头进行操作,插入只能在队尾进行操作。
- 二叉树
- 算法思想
- 算法分析:按照时间复杂度和空间复杂度。
- 算法思想:递推、递归、穷举、贪心、分治、动态规划、迭代、分枝界限。
- 经典算法
- 经典排序:插入排序、冒泡排序、快排(分划交换排序)、直接选择排序、堆排序、合并排序。
- 经典查找:顺序查找、二分查找、二叉排序树查找。
- 高级数据结构
- B+/B-数
- 红黑树
- 图
- 高级算法
图的深度优先搜索、图的广度优先搜索、拓扑排序、Dijkstra算法(单源最短路径)、霍夫曼编码、辗转相除法、最小生成树等。
二、Java语言
- String:String源码解析
- 集合:
- 并发包
- ConcurrentHashMap:ConcurrentHashMap源码解析
- CopyOnWriteArrayList:CopyOnWriteArrayList源码解析
- CopyOnWriteArraySet:CopyOnWriteArraySet源码解析
- ArrayBlockingQueue:ArrayBlockingQueue源码解析
- LinkedBlockingQueue:LinkedBlockingQueue源码解析
- ConcurrentLinkedQueue:ConcurrentLinkedQueue源码解析
- 常见5中并发集合的对比总结
- JVM内存模型、垃圾回收:java虚拟机JVM总结
- 异常捕获的设计原则:Java异常的设计原则
- 多线程:
- 进程和线程的概念:查看《构建高性能web站点》总结中的“进程、轻量级进程、线程、协程的概念”
- 线程安全:Synchronized关键字/Lock锁/Condition条件、闭锁/栅栏/信号量、并发集合。
- 死锁问题:多线程死锁以及解决方法。
- 线程池:线程池的选用与线程数的指定和ThreadPoolExecutor使用+工作机理+生命周期。
- 锁:无锁编程,ReentrantLock重入锁,锁优化策略,悲观锁和乐观锁。
- ThreadLocal:每个线程都有一个ThreadLocalMap,用于存储每一个线程的变量的引用,这个Map中的键为ThreadLocal对象,而值对应的是ThreadLocal通过set放进去的变量引用。但变量的实例在堆中始终只有一个,所以不能用ThreadLocal来设置共享变量。
- 基础结构的原子性:int等不大于32位的基本类型的操作都是原子操作,但是某些jvm对long和double类型的操作并不是原子操作,原因是把它们作为2个原子性的32位值来对待,而不是一个原子性的64位值。但是java内存模型保证声明为volatile的long和double变量的get和set操作是原子的。
- IO流:netty原理总结
- TCP/IP网络分层模型:
- TCP/IP模型分为5层:应用层(应用层、表示层、会话层)(第5层,里面又可以分为3层)、传输层(第4层)、网络层(第3层)、数据链路层(第2层)、物理层(第1层)。
- 应用层:主要是面向用户的交互,有常用的http协议、ftp协议等。
- 传输层:将应用层的数据进行传输转运。常用的有tcp(可靠的传输控制协议)、udp(用户数据报协议)。
- 网络层:处理网络中流动的数据包。常用的有ip协议、icmp协议、arp协议。通过分析ip地址得出物理mac地址。
- 数据链路层:用来处理连接硬件的部分,包括控制网卡、硬件相关的设备驱动等。
- 物理层:负责数据传输的硬件,常用的有双绞线电缆、无线、光纤等。
- 数据传递流程:首先应用层将数据报文按照协议封装格式压缩然后传递给传输层,传输层通过协议将数据报封装为数据报段然后传递给网络层,网络层将数据报段封装成数据包并传递给数据链路层,数据链路层收到数据包后封装为数据帧,然后将数据帧转成比特传递给物理层,物理层将比特通过光或电信号发送给目标。
- 防止SQL注入:
- 用jdbc提供的PreparedStatement预编译语句集,它内置了处理SQL注入的能力。因为sql注入一般发生在编辑解析阶段。
- 用正则表达式对传入的变量进行过滤。
- 重写equals和hashCode的注意事项:
- jdk规则:重写equals,则必须重写hashCode,并且equals里面用于比较的属性都必须也用在hashCode的重写中。即equals相同,则hashCode一定相同;equals不相同,hashCode可能相同,也可能不相同。
- 若equals相同,hashCode不相同带来的问题:会导致相等的两个对象,经过计算hashCode不同,被放在hashMap和set集合的两个不同位置,没办法起到去重的作用。
三:数据库相关
- 设计原则:关系型数据库设计总结
- 优化:mysql优化总结
- 索引原理及适用
- 大表查询优化:冗余字段,尽量单表查询。
- 多表连接查询优化:关联字段加索引、小表驱动大表
- 子查询优化:尽量转换成关联查询
- 分库、分表
- 备份:备份MySQL数据库
三、主流框架及工具
- Spring:spring原理总结
- 消息队列:消息队列原理总结
- 负载均衡:nginx原理总结
- 服务框架:Dubbo原理总结
- 分布式缓存:redis原理总结
四、设计
- 设计模式:
- 模板模式和策略模式:设计模式之模板方法模式和策略模式
- 门面模式:设计模式之门面模式Facade
- 组合模式:设计模式之组合模式Composite
- 观察者模式:设计模式之观察者模式
- 桥梁模式:设计模式之桥梁模式
- 代理模式:设计模式之代理模式
- 单例模式:单例模式的八种写法比较
- 类的设计原则
- 单一职责原则:一个类只应该做和一个职责相关的事情,不要把过多的业务放在一个类中完成。
- 开闭原则:软件实体应该对扩展开放,对修改关闭。开闭原则是设计原则的核心原则,其他的设计原则都是开闭原则表现和补充。实现开闭原则的方法就是抽象。
- 迪米特法则:软件实体之间应该做到最少的交互。不要和陌生人说话。调用方只关心他需要使用的方法。
- 接口隔离原则:使用专门的接口,比用统一的接口要好。便于分工,在实现接口时,不应该看到自己不用关心的方法。
- 聚合/组合复用原则:多使用聚合/组合达到代码的重用,少使用继承复用。
- 依赖倒置原则:面向抽象编程,不要面向具体编程。