一、==和equals的区别
1、==可以用于值比较和对象比较,后者只能用于对象比较
2、对象进行比较时:二者都是比较引用地址,但实际开发中比较引用地址一般没有什么卵用,所以会重写。==不能重写,equals可以重新,一般会重写这个方法用来比较两个对象的值是否相等。
3、String,Date这种是系统重写过的,比较值。
4、5个特性
(1)自反性:x.equals(x)必须返回true。
(2)对称性:x.equals(y)与y.equals(x)的返回值必须相等。
(3)传递性:x.equals(y)为true,y.equals(z)也为true,那么x.equals(z)必须为true。
(4)一致性:如果对象x和y在equals()中使用的信息都没有改变,那么x.equals(y)值始终不变。
(5)非null:x不是null,y为null,则x.equals(y)必须为false。
5、要判断两对象是否相等,必须通过equals方法,equals相等,hashcode一定相等
二、hashcode方法
1、public native int hashCode();Object本身的方法,本地方法,实际返回内存地址
2、在JVM中,加载的对象在内存中包括三部分:对象头、实例数据、填充。其中,对象头包括指向对象所属类型的指针和MarkWord,而MarkWord中除了包含对象的GC分代年龄信息、加锁状态信息外,还包括了对象的hashcode;对象实例数据是对象真正存储的有效信息;填充部分仅起到占位符的作用, 原因是HotSpot要求对象起始地址必须是8字节的整数倍。
内存中的对象=对象头+实例数据+填充位(补充到8字节的整数倍)
对象头=对象类型的指针(指向元数据去的类数据)+MarkWord
MarkWord=GC分代年龄信息+加锁状态信息+HASHCODE
3、String的实现
选用31质数来减少哈希冲突,且31较小(11111)
31计算方便,左移5为减1(2^5-1)
三、hashmap头插和尾插?
jdk1.8之前是插入头部的,在jdk1.8中是插入尾部的
https://www.jianshu.com/p/0df1f25139e4
四、线上问题查询
1、CPU很高
可以用top命令找pid
a.可能是频繁的GC
b.可能是循环计算
2、OOM
发生OOM问题一般服务都会crash,业务日志会有OutOfMemoryError。OOM一般都是出现了内存泄露,须要查看OOM时候的jvm堆的快照,结合MAT,能够对dump文件进行分析。查找出发生OOM的原因.
dump内存方法
a、假设配置了-XX:+HeapDumpOnOutOfMemoryError, 在发生OOM的时候会在-XX:HeapDumpPath生成堆的dump文件。
b、手动 jmap ----------- jmap -dump:format=b,file=file_name pid
3、线程block、线程数暴涨
jstack -l pid |wc -l
jstack -l pid |grep "BLOCKED"|wc -l
jstack -l pid |grep "Waiting on condition"|wc -l
线程block问题通常是等待io、等待网络、等待监视器锁等造成,可能会导致请求超时、造成造成线程数暴涨导致系统502等。
假设出现这样的问题,主要是关注jstack 出来的BLOCKED、Waiting on condition、Waiting on monitor entry等状态信息。
参考 https://www.cnblogs.com/mfmdaoyou/p/7349117.html
五、事务相关
可重复读的问题
A事务执行先读操作1,读到X=1,B事务更新X=2,A依然读取之前的版本,这时候A设置X=3,其实A是没法设置的,因为B还未提交未释放行锁,所以问法有问题。
六、数据库
mysql底层数据结构、es底层数据结构(term),mysql引擎类型,二者区别(支持事务方面、存储方面、范围查询方面、全文搜索方面(myisam支持))
七、算法
1、快排,复杂度(log2 n~n^2)如何避免出现n^2(随机找一个数,不找第一个)
2、找一个数组(n个)中第K大的值,复杂度kn
3、插入排序,复杂度O (n^2),发扑克。
八、其他
1、hbase与mysql区别
a、hbase天然分布式,mysq适合l单点撑
------------------------------------------------
网友评论