1. 判断循环链表:
取两个对象,一个往前有一格,一个走两格,如果是循环链表,两数会有相等的时候。
2. 求最大公约数:
更相减损术+位运算
3. 判断是否为偶数:
a&1是否等于1或者0即可(最快)
4. 红黑树:
红黑树是二叉树的改进版,除了需要满了二叉树的特性,还需要满足五条规则,不满足时需要变色来解决,变色也无法解决时需要旋转
五条规则如下:
1. 节点是红色或黑色
2. 根节点是黑色
3. 每个叶子节点都是黑色的空节点(NIL节点)
4. 每个红色节点的两个子节点都是黑色(从每个叶子到跟的所有路径上不能有两个连续的红色节点)
5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点
红黑树在哪里被应用到呢?
在JDK的集合类TreeMap和TreeSet底层就是红黑树实现的,在java8中,HashMap也用到了红黑树。
5. 动态规划:
三个核心元素:最优子结构、边界、状态转移方程式
6. 什么是中台?
业务技术等通过下层,得到的基本通用底层,可以支援更多的业务技术等情况,称为中台。相当于java里面的jar包
按照不同的功能和角色,中台可以划分成四个维度:
业务中台、技术中台、数据中台、算法中台
7. mysql执行计划(explain关键字)
1 什么是explain?
通过在sql语句前增加explain关键字,返回执行计划的信息。(结果与mysql版本有关系)
注意:如果from中包含子查询,仍会执行该子查询,并将结果放入临时表中
2 explain的作用?
1. 分析sql语句和表结构的性能瓶颈
2. 了解数据表的查询顺序,表的操作类型,索引命中等
3 结果字段详解
1. id : 数值多大,执行优先级越高,同优先级执行顺序从上至下
2. select_type列: 标明查询类型
simple: 表明对应的select是简单查询,不包含子查询和union
primary: 复杂查询最外层的select
subquery: 包含在select中的子查询(不在from中)
derived: 包含在from中的子查询
union: 若第二个select出现在union之后,则被标记为union;若union包含在from子句的 子查询中,外层select将被标记为derived
union result : 从union表获取结果的select
3. table : 表示正在访问哪个表
如果是别名就显示别名,
如果不涉及对数据表的操作,就显示null
如果显示为<union N>,表示是个临时表,N表示执行计划的id
如果显示为<union M,N>,表示是个临时表,结果来自执行计划的结果集中
4. type : 决定mysql如何去查询数据表中的行,优劣顺序为:
null > system > const > eq_ref > ref >range > index > all
,一般来说,需要保证查询达到range , 最好能达到ref
null : mysql在分解查询阶段即可得到结果,就不在访问表或索引,如:
explain select min(user_id) from t_user;
system : 表中只有一行数据(等于系统表),这是const类型的特例
const :使用唯一索引或者主键,表示通过索引一次就找到了, const用于比较primary key 或者unique索引。 如果将主键置于where中,查询就会变成const类型。
eq_ref : 唯一性索引扫描,表中只有一行数据与之匹配。
ref :非唯一性索引扫描(比如普通索引)
range : 索引范围扫描,出现在in(), between, >, <, >=等操作符中
index: 扫描全表索引,将索引树从头到尾扫描一遍
all: 全表扫描,未使用索引
5. possible_keys : 给出可能用到的索引
6. key :显示查询实际用到的索引
7. key_len :用于处理查询的索引长度,表示索引中使用到的字节数(估算),可以估算一个多列索引中实际使用了哪一部分
8. ref : 表示和key一起被使用的字段、常量、函数等
9. rows : 表示mysql根据表统计及索引选用情况,大致估算找到所需目标需要的行数
10. extra : 展示重要的额外信息
暂停~ 明天收藏夹学习
7.* 其他扩展命令
扩展命令:
explain extended: 提供一些额外的信息,执行后通过show warnings 得到优化后的查询语句(一会儿验证)
explain partitions: 分析使用了分区的表,会显示出可能用到的分区。(感觉用到的机会不多)
8. 什么是mysql索引?
mysql的索引结构:B+Tree<==BTree<==Tree
Tree:传统二叉树(二叉搜索),每个节点只能储存一个记录,不适合作索引存储。
BTree: N叉搜索,高度降低,查询快。叶子节点和非叶子节点都可以存储多个数据。通过中序遍历,可以访问树上所有节点。
B+Tree:非叶子节点不在存储数据,而是存储数据的记录(Key,通过key指向具体数据)
Cardinality 索引基数
索引基数越大(每一行数据之间的区分度),索引执行更高效
索引类型:
1. 主键索引
2. 唯一性索引
3. 普通索引
4. 全文索引:然并卵(效率不高),建议使用Luence,Solr,ES等方案,专业且强大
在什么字段上创建索引比较好?
区分度高,暂用资源少的字段
什么时候不走索引?
1. 有索引参与计算(包括函数计算):
1. SELECT sname FROM stu WHERE age+10=30;
2. SELECT sname FROM stu WHERE LEFT(`date`,4) <1990;
2. 左模糊:
1. SELECT * FROM table WHERE uname LIKE "%关键字%"
3. 字符类型不一致(a为char类型,1为整数类型):
1. SELECT * FROM table WHERE a=1
4. 如果有or,有一个字段没有索引就全部不走索引:
1. SELECT * FROM table WHEREdname='xxx' or loc='xx' or deptno=45
5. 正则表达式,regexp不走索引
6. 表中数据不多,只有几十几百条,MySQL评估使用全表扫描要比使用索引快,也不使用索引(不要大惊小怪)
复合索引什么时候不走索引?
1. 查询条件不包含复合索引的第一个字段
9. 单例模式
1. 普通单例模式:
java
public class Singleton {
private Singleton() {} //私有构造函数
private volatile static Singleton instance = null; //单例对象
//静态工厂方法
public static Singleton getInstance() {
if (instance == null) { //双重检测机制
synchronized (Singleton.class){ //同步锁
if (instance == null) { //双重检测机制
instance = new Singleton();
}
}
}
return instance;
}
}
2. 用静态实现单例模式:
java
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
3. 用枚举实现单例模式(解决能被映射的问题):
java
public enum SingletonEnum {
INSTANCE;
}
4. 利用反射打破规则:
java
//获得构造器
Constructor con = Singleton.class.getDeclaredConstructor();
//设置为可访问
con.setAccessible(true);
//构造两个不同的对象
Singleton singleton1 = (Singleton)con.newInstance();
Singleton singleton2 = (Singleton)con.newInstance();
//验证是否是不同对象
System.out.println(singleton1.equals(singleton2));
10. 策略模式
适用场景:类比较多,用于替换if-else,待续...
11.服务熔断
雪崩:蝴蝶效应下的连锁故障
开启熔断:开启后,后续对该服务的调用不再经过网络,直接执行本地默认方法。
熔断恢复:恢复后,如果还有时间,再次接受调用方的远程调用
实现服务熔断的框架:Spring Cloud Hystrix
12.jvm回收机制
引用计数算法:引用的计数加一,删除引用对象,计数减一,为0时会被回收
可达性分析算法:确定一系列根对象,然后生成引用链,不在引用链的对象会被认为可回收
哪些能作为跟对象?
1. 虚拟机栈中引用的对象(正在运行的方法使用到的变量、参数等)
2. 方法区中类静态属性引用的对象(static关键字声明的字段)
3. 方发区中常量引用的对象(final关键字声明的字段)
4. 本地方法栈中引用的对象(native方法)
5. java虚拟机内部的引用(系统内部的东西)
标记清除算法:
1.标记需要清除的区别
2. 清除(把起始结束地址放入空闲列表里)
优点:速度快
缺点:执行效率不稳定;涉及内存碎片化问题(标记清除算法最大问题)
标记移动算法:
优点:解决内存碎片化问题
缺点:涉及到了对象移动的问题,在整理阶段需要更新引用,效率低
标记复制算法:
1.复制:把正在使用的内存块中的存活对象复制到未被使用的内存块中
2.清理:清理内存块中所有对象
3.易位
优点:不需要标记,提升效率,也不会有内存碎片化问题
缺点:double空间
分代垃圾回收机制:
新生代 :伊甸园、幸存区from、幸存区to
老年代
过程:
伊甸园区满了==>
触发一次垃圾回收(MinorGC)==>
进行可达性分析==>利用标记复制算法==>
将伊甸园和幸存区from中有用的对象复制到幸存区to,并清空==>
from区和to区的逻辑位置交换(保证to区永远是空的)==>
存活下来的对象记录一次幸存值,达到15后移入老年区==>
如果老年代内存也满了==>触发Full GC,执行新生代,老年代的大清理
垃圾回收器:
进行内存回收的工具: Serial,Paraller Scavenge, CMS, G1等等......
13.原型模型
保护性拷贝:通过实现Cloneable()接口(标识接口,标识这个类是可拷贝的),并且调用clone()方法(Object类中的常用方法,用于拷贝),实现保护性拷贝
浅拷贝:只拷贝某个需要的类
深拷贝:对于有多层对象的,每个对象都需要实现Cloneable并重写clone()方法,才可以实现了对象的串行层层拷贝。
特点:牺牲开发效率提升性能的设计模式
原型模型的核心用途:
1. 解决复杂对象的资源消耗问题,提升创建对象的效率。
2. 保护性拷贝,防止外部对只读对象进行修改。
14.Object类Object类是所有类的基类,是核心中的核心,具体包含了九大常用方法,分别是clone(),getClass(),finalize(),toString(),equals(),hashcode(),wait(),notify(),notifyAll()
clone():拷贝类
getClass():获取一个类的运行时类,进而通过该类返回的Class对象,获取该类的相关信息(不同VM针对Class做了不同优化,所以getClass()的实现也并不相同)。
finalize():是Object的protected方法,在发生GC时触发该方法。 主要思路判断该对象不可达就回收对象,否则执行finalize()之后再次判断。
toString():除了基本功能外,还可实现equals()重写,hashcode()重写
15. HTTP协议和HTTPS协议
HTTP协议:Hyper Text Transfer Protocol(超文本传输协议),位于TCP/IP四层模型当中的应用层。
这种模式采用明文方式传输信息,显然是不够安全的,不过别担心,我们可以加密,加密方式:
对称加密方式:
非对称加密方式:
HTTPS协议:在http协议的基础上增加SSL安全层,证书认证等相关操作就是在SSL层完成的。
最新推出的TLS协议,是SSL 3.0协议的升级版