1,Object有哪些方法
2,重写equals方法的时候为啥要重写hashcode?
equals要满足以下规则
- 自反性: x.equals(x) 一定是true
- 对null: x.equals(null) 一定是false
- 对称性: x.equals(y) 和 y.equals(x)结果一致
- 传递性: a 和 b equals , b 和 c equals,那么 a 和 c也一定equals。
- 一致性: 在某个运行时期间,2个对象的状态的改变不会影响equals的决策结果,那么,在这个运行时期间,无论调用多少次equals,都返回相同的结果。
导致两个相同的实例具有不相等的散列码(hash code),违背了hashCode的约定。map的put方法把person对象存在一个散列桶(hash bucket)中,然而get却在另外的一个散列桶中找对象,结果可想而知。
3,两个字符串相等,hashcode一定相等吗?hashcode相等的两个字符串equals比较是否一定相等
一定相等 hashcode相等 equals不一定相等
4,synchronized的原理
原子性、可见性、有序性
5,ReentrantLock的原理,和synchronized的区别
①等待可中断;②可实现公平锁;③可实现选择性通知
6,AtomicInteger的原理
它是一个具有原子性的Integer类
内部有 volatile修饰value compareAndCas 当且仅当内存值与期望值一致时,才会把内存值更新为新值
7,volatile
(不会将该变量上的操作与其他内存操作一起重排序)volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型 的变量时总会返回最新写入的值
保证内存可见性 禁止重排序 内存屏障
8,HashMap,ConcurrentHashMap,HashSet
jdk1.8 hashMap hash(key)方法 return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); key的hashcode值 与hashcode 右移16位 进行异或
异或 相同为0 不同为1
9,BIO,NIO,AIO,多路复用io
https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/BIO-NIO-AIO.md
10,自定义线程池
11,数据库索引及数据结构
索引(Index)是帮助MySQL高效获取数据的数据结构
- hash 优点:一次查询到 时间复杂度为o(1) 缺点:不支持范围查询 不支持排序
- 二叉树 优点:查询速度快 缺点:检索时间与树的高度有关,树的高度越高,检索次数及时间相对就会越久 极端情况下,如果数据本身就是有序的,二叉搜索树会退化成链表,性能会急剧降低。
- 红黑树 优点:相对二叉树 不会用很右倾的问题 解决二叉搜索树的极端情况的退化问题缺点:检索时间依旧与树的高度有关,当数据量很大时,树的高度就会很高,检索的次数就会比较多,检索的时间会比较久,效率低。
- Btree
- B+tree 和Btree的不同点在于:Btree的每个节点(包括根节点和子节点) 都可以存储数据,而B+tree则只有叶节点(最下面的一排)可以存储数据
聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。
12,索引原理,索引失效的原因,ABC联合索引实际建了几个索引,MYASIAM和INNODB的区别
https://blog.csdn.net/ligh_sqh/article/details/87784031
abc建了三个索引
MYASIAM和INNODB的区别
MYASIAM: 有三个文件 .frm表结构 .myd表数据 myi索引文件 不支持事务 支持表级锁
INNODB: 两个文件 .frm表结构 .ibd数据和索引文件 支持事务 支持行级锁
13,B+Tree
堆 是一个完全二叉树 每个结点的值都大于或者等于子结点的称为最大堆 每个结点的值都小于或者等于子结点的称为最小堆
如下图展示
14,慢sql优化
1、避免在where子句中使用 is null 或 is not null 对字段进行判断。
2、避免在 where 子句中使用 != 或 <> 操作符。
3、避免在 where 子句中使用 or来链接条件。
4、少用 in 或 not in。
5、注意 like 中通配符的使用。
6、避免在 where 子句中对字段进行表达式操作。
7、避免在 where 子句中对字段进行函数操作。
8、在子查询中,用 exists 代替 in 是一个好的选择。
15,什么情况下锁行,什么情况下锁表,MySql乐观锁,排它锁,间隙锁,
只有通过索引条件检索数据,InnoDB才会使用行锁,否则使用表锁。
乐观锁 是通过版本号机制,也叫乐观并发控制,它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,那么当前正在提交的事务会进行回滚
共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
排他锁(X):允许获得排它锁的事务更新数据,阻止其他事务取得相同数据的共享读锁和排他写锁。
间隙锁 使用范围条件查询的时候,对于在条件范围内,但不存在的数据,叫做间隙,InnoDB也会对这个间隙进行加锁。
搜索id>100的数据,但是数据只有101,102;此时会对102以后的不存在的数据进行加锁。间隙锁是为了防止幻读,如果查找id>100的记录,第一次查找之后,其中有线程进行了同范围内的插入数据,那么在此查找的时候就会引起幻读。
意向锁:
意向锁是如何让表锁和行锁共存的?
有了意向锁之后,前面例子中的事务A在申请行锁(写锁)之前,数据库会自动先给事务A申请表的意向排他锁。当事务B去申请表的写锁时就会失败,因为表上有意向排他锁之后事务B申请表的写锁时会被阻塞。
所以,意向锁的作用就是:当一个事务在需要获取资源的锁定时,如果该资源已经被排他锁占用,则数据库会自动给该事务申请一个该表的意向锁。如果自己需要一个共享锁定,就申请一个意向共享锁。如果需要的是某行(或者某些行)的排他锁定,则申请一个意向排他锁。
https://blog.csdn.net/huangwei18351/article/details/82595211
https://www.cnblogs.com/balfish/p/8495798.html
16,Select for update分别在主键,唯一索引,分索引列,锁了哪些东西
https://www.cnblogs.com/balfish/p/8495798.html
只有通过索引条件检索数据,InnoDB才会使用行锁,否则使用表锁。
17,MySql分库分表策论
18,读写分离
19,JMM
20,JVM内存模型,GC算法,CMS和G1
21,频繁GC的可能原因
22,事务的原理,事务的特性,事务的传播行为,事务的隔离级别
23,分布式锁
24,CAP,BASE理论,最终一致性的概念
25,Redis支持的数据类型,每种数据类型的底层数据结构
26,Explain查看sql执行计划
https://www.cnblogs.com/zjxiang/p/9160564.html
27,Redis的缓存淘汰策略有哪些
28,kafka原理
29,es的原理
30,画一个自己熟悉项目的架构图
31,项目中遇到的印象深刻的bug
32,mysql事务隔离级别
https://www.cnblogs.com/shihaiming/p/11044740.html
算法题
1,abcd全排列
2,单向链表反转
3,二叉树遍历(递归及非递归)
4,无序数组求等差数列的最大长度
5,求开平方数(保留5位小数)
6,爬楼梯(n阶楼梯,每次能上1阶或者2阶,求有多少种方法上楼)
7,快排
8,单向链表求和
9,最长上升子序列
10,归并排序
11,一个农场主目前有M金,有P个人,有一天突然在自己的农场中发现一个金矿,农场主可以以M金的价格从市场买人,请问在D天最大能采集到多少金?
第二问,一个农场主目前有M金,有P个人,有一天突然在自己的农场中发现一个金矿,农场主可以以M金的价格从市场买人,如果要想挖到N金,最少需要多少天?
12,判断一棵二叉树是否是平衡二叉树