1、hashmap的结构
hashmap底层的数据结构在jdk7和jdk8是不一样的。在jdk7时为Entry数组+链表,在jdk8时为Node数组+链表+红黑树,当链表存储的元素个数大于等于8时,不再采用链表结构,此时判断一下当前数组长度是否大于64,如果大于,则将链表转为红黑树。没有则将选择扩容。
2、为什么负载因子是0.75
hashmap是一个数据结构,它要考虑时间和空间的效率问题。我们假设负载因子为1的时候,空间利用率为百分之百,但是存储的元素多了,发生hash冲突的概率就会很大,底层的链表或者红黑树层数会比较高,查找效率就会降低。我们再假设负载因子为0.5的时候,存储的元素个数少了,发生hash冲突的概率变小了,查找效率会提升,但是空间利用率却变成了百分之五十。综合考虑选择了0.75,这样空间的利用率比较高,也避免了很多的hash冲突。
3、volatile的作用和原理
volatile的主要作用就是保证共享变量的可见性。它提供了一个域变量无锁的机制,当一个变量被声明为volatile时,告诉线程这个变量可能会被其他线程修改,线程在写入变量时不会把值缓存在寄存器或者其他地方,而是会把值刷新回主内存。当其他线程读取该共享变量时,会从主内存重新获取最新值,而不是使用当前线程的工作内存中的值。
它还可以用来保证有序性,java内存模型的编译器和处理器允许对不存在数据依赖的指令进行重排序来提高运行性能。但是有时候可能会出现创建一个对象时还没初始化就已经给它赋值给了成员变量的问题。我们可以使用volatile借助内存屏障来禁止重排序。
4、什么是原子性
原子性就是一个事务的若干操作要么同时成功,要么一起失败,只要其中的异步操作失败,那整个事务就是失败的。
5、volatile能不能保证原子性
不能,它只能保证可见性和有序性。
6、数据库隔离级别
有四种隔离级别:读未提交,读已提交,可重复读、串行化。
读未提交什么问题都没解决,脏读、不可重复读、幻读都有可能会出现
读已提交解决了脏读问题
可重复读解决了脏读和不可重复读问题
可串行化解决了脏读、不可重复读、幻读问题
7、幻读举个例子
比如我一开始在学生表里面根据学号查找多有m个学生,此时另外一个事务新增了一名学生,我后来想再确认一下人数,但是却发现此时的学生人数变成了n个,两次查询的结果不一样。
8、innodb如何解决幻读
使用间隙锁,在一个事务进行操作的时候,给表中不存在的数据范围加上间隙锁,防止其他的事务进行在此范围内进行操作,解决了幻读问题。
9、gc算法有哪些
根据分代收集理论,有标记清除、标记复制、标记整理算法
10、可达性分析
判断一个从该对象到GCRoots有没有可以到达的引用链,如果有,说明该对象还在被引用,不应该被回收,如果没有,说明这个对象不可能在被使用,它在垃圾清理的时候应该被回收掉。
11、判断gcroots的原则是什么
在java中固定可以作为GC Roots的对象主要包含:
1、在虚拟机栈中引用的对象
2、在方法区中类静态属性引用的对象
3、在方法区中常量引用的对象
4、被synchronized同步锁持有的对象
算法题 合并有序链表 自己写测试用例
package com.ithema.pattern.decorator;
public class Test {
static class NodeList{
int val;
NodeList next;
public NodeList(int val) {
this.val = val;
}
}
public static void main(String[] args) {
NodeList node1=new NodeList(2);
node1.next=new NodeList(6);
node1.next.next=new NodeList(9);
node1.next.next.next=new NodeList(15);
node1.next.next.next.next=new NodeList(27);
node1.next.next.next.next.next=new NodeList(50);
NodeList node2=new NodeList(1);
node2.next=new NodeList(5);
node2.next.next=new NodeList(10);
node2.next.next.next=new NodeList(16);
node2.next.next.next.next=new NodeList(37);
node2.next.next.next.next.next=new NodeList(60);
NodeList res= mergin(node1,node2);
while (res!=null){
System.out.println(res.val);
res=res.next;
}
}
private static NodeList mergin(NodeList node1, NodeList node2) {
if(node1==null) return node2;
if(node2==null) return node1;
NodeList dummy=new NodeList(-1);
NodeList cur=dummy;
NodeList p1=node1,p2=node2;
while (p1!=null && p2!=null){
if(p1.val>p2.val){
cur.next=p2;
cur=p2;
p2=p2.next;
}else {
cur.next=p1;
cur=p1;
p1=p1.next;
}
}
while (p1!=null){
cur.next=p1;
cur=p1;
p1=p1.next;
}
while (p2!=null){
cur.next=p2;
cur=p2;
p2=p2.next;
}
return dummy.next;
}
}
作者:渣&&
链接:https://www.nowcoder.com/discuss/813047?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网