B+树的优缺点?
优点:
单次请求涉及的磁盘IO次数少(出度d大,且非叶子节点不包含表数据,树的高度小);
查询效率稳定(任何关键字的查询必须走从根结点到叶子结点,查询路径长度相同);
遍历效率高(从符合条件的某个叶子节点开始遍历即可);
缺点:
B+树最大的性能问题在于会产生大量的随机IO,主要存在以下两种情况:
主键不是有序递增的,导致每次插入数据产生大量的数据迁移和空间碎片;
即使主键是有序递增的,大量写请求的分布仍是随机的;
Volite指令重排序?
方法和变量的顺序在多线程环境下由于主内存和工作内存的交互发生改变,volite可以防止指令重排序
1.两个操作都有volatile要求的,一定不能重排序指令
2.后面如果是volatile写操作,则即便前面是普通写操作,为了保证主存数据是后面操作的结果,所以不能重排序
3.前面如果是volatile读操作,因为后面的普通写操作可能会刷新主存,为了保证百分百执行结果的正确,则也不能重排序
4.其他情况可以重排序指令
什么可以作为GC Root
1 JVM栈中引用的对象
2 方法区中静态属性引用的对象
3 方法区中常量引用的对象
4 本地方法栈中引用的对象
常用类加载器:
根类加载器BootStrap ClassLoader: 加载lib目录下jar包和class文件,例如rt.jar,resources.jar
扩展类加载器Extention ClassLoader: 加载lib目录下ext目录下的jar包和class文件
应用类加载器: 加载classpath下,我们写的代码
classforName与loadClass有什么区别?
classforName加载后会进行静态初始化
loadClass不会
https与http的区别:
1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
其它安全协议::SSL、TLS、IPSec、Telnet、SSH、SET
CAS原理
全称为compare and swap,比较与交换,是一种无锁原子算法,包括预期值,内存值,更新值,当且仅当预期值和内存值相等,才更新,如果不相等就会自旋再次尝试.非阻塞式,乐观锁.性能更加优越.避免线程锁竞争的调度开销.调用本地方法,使用硬件指令.
问题:
1 循环时间长CPU开销大
2 ABA问题 解决添加版本控制
3 只能保证一个共享变量的原子操作
java反射和注解原理
反射通过类加载器加载.class生成实例,调用反射API获取方法,变量,构造方法
注解基于反射实现,通过反射获取方法是否有指定注解
hashmap为什么用红黑树,不用AVL树,或者B树?为什么链表8以后才转红黑树?
如果插入时间过长必然等待时间更长,而红黑树相对AVL树他的插入更快!
AVL树和红黑树有几点比较和区别:
(1)AVL树是更加严格的平衡,因此可以提供更快的查找速度,一般读取查找密集型任务,适用AVL树。
(2)红黑树更适合于插入修改密集型任务。
(3)通常,AVL树的旋转比红黑树的旋转更加难以平衡和调试。
总结:
(1)AVL以及红黑树是高度平衡的树数据结构。它们非常相似,真正的区别在于在任何添加/删除操作时完成的旋转操作次数。
(2)两种实现都缩放为a O(lg N),其中N是叶子的数量,但实际上AVL树在查找密集型任务上更快:利用更好的平衡,树遍历平均更短。另一方面,插入和删除方面,AVL树速度较慢:需要更高的旋转次数才能在修改时正确地重新平衡数据结构。
(3)在AVL树中,从根到任何叶子的最短路径和最长路径之间的差异最多为1。在红黑树中,差异可以是2倍。
(4)两个都给O(log n)查找,但平衡AVL树可能需要O(log n)旋转,而红黑树将需要最多两次旋转使其达到平衡(尽管可能需要检查O(log n)节点以确定旋转的位置)。旋转本身是O(1)操作,因为你只是移动指针。
在节点不够多的情况下,还是使用链表节省内存,树结构是链表结构内存的2倍
hashmap什么情况下会扩容?什么操作会导致扩容?
添加元素时,容量超过负载因子,就会进行扩容,默认是3/4
hashmap插入冲突的时候是头插,还是尾插?
1.8以前是头插数组+链表底层维护的是entry,1.8以后是尾插,使用node,是数据+链表+红黑树
hashmap的put方法执行过程?
一般添加合并都会导致扩容
hashmap和hashtable有什么区别?
1 继承的父类
hashmap集成absmap
hashtable继承dictionary
2 线程安全不同
hashtable中的方法是synchronized的 hashmap多线程问题1.7是值丢失,1.8是值覆盖
3 hashmap没有contains方法
4 hashmap键值可以为null
5 hashmap重新计算hashcode() hashtable是直接使用
6 内部数组初始化和扩容方式不同 hashmap是16 hashtable是11并且不要求扩容为2的整数幂等
hashtable 和concurrenhashmap呢?
concurrentHashmap是分段锁,分段扩容插入前检查是否扩容
hashtable全部锁
hashmap和treemap有什么异同?
treemap是红黑树二叉树存入的元素,会进行自动自然排序
arraylist和linklist的插入和查询的时间复杂度?
线程池如何实现,有什么参数,实现原理?
corePoolSize:核心池的大小
maximumPoolSize:线程池最大线程数
keepAliveTime:空闲保活时间
unit:参数keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性:
workQueue: 阻塞队列
Executor接口,threadfactory线程工厂创建应用线程,分配到每个work线程,Executor.execute()执行线程任务,配置拒绝策略
阻塞队列的作用?
保证线程安全,避免死锁,限制内存开销,使用简单,不用关心唤醒.
synchronize和lock有什么区别?syn什么时候是对象锁,什么时候是全局锁?
syn同步代码块,同步方法
syn对象锁,锁住同一个对象叫对象锁
syn锁住类对应的.class对象,为全局锁,锁的是.class不是this
syn是关键字,lock是接口
syn不可中断,lock为可中断
syn非公平锁,可重入,不可中断 lock 可重入,可判断状态, 可公平/非公平
syn执行完,自动释放锁 lock需要手动释放锁