java arraylist和linkedlist存储结构的区别?这两个结构是线程安全的吗?
ArrayList底层是Object数组 LinkedList底层是双向链表
两者都不能保证线程安全
讲讲final关键字?能修饰抽象类吗?
final修饰的类不能被继承 final类中的所有成员方法都会被隐式的指定为final方法
final修饰的方法不能被重写
final修饰的变量是常量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改,如果是引用类型的变量,则在对其初始化之后便不能让其指向另一个对象
final不能修饰抽象类
抽象类一定要有抽象方法吗?抽象类可不可以全都是普通方法?
不一定要有抽象方法,可以全是普通方法
讲讲双亲委派机制
当一个类收到了加载请求时,他是不会先自己去尝试加载的,而是委派给父类去完成,比如new一个Person,这个Person是我们自定义的类,如果我们要加载他,就会先委派App Class Loader 只有当父类加载器都反馈自己无法完成这个请求,子类加载器才会自己尝试加载
JVM常用的垃圾回收器有哪些,讲讲CMS、G1优缺点,比较一下两者?
CMS收集器 G1收集器
CMS收集器是一种以获取最短回收停顿时间为目标的收集器。
过程如下:
初始标记:暂停所有的其他线程,并记录下直接与root相连的对象,速度很快
并发标记:同时开启GC和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以GC线程无法保证可达性分析的实时性。
重新标记:重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长。
并发清除:开启用户线程,同时GC线程开始对未标记的区域做清扫
优点:并发标记,低停顿
缺点:对CPU资源敏感。无法处理浮动垃圾。使用标记-清除算法会导致大量空间碎片产生
G1收集器主要针对配备多颗处理器及大容量内存的机器,以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征
特点如下:
并行与并发
分代收集
空间整合
可预测的停顿
redis过期删除和内存淘汰策略
过期删除策略:
定时删除:在设置key的过期时间时,同时创建一个定时事件,当时间到达时,由事件处理器自动执行key的删除操作
惰性删除:不主动删除过期键,每次从数据库访问key时,都检测key是否过期,如果过期则删除该key
定期删除:每隔一段时间随机从数据库中取出一定数量的key进行检查,并删除其中的过期key
内存淘汰策略:
不进行数据淘汰
进行数据淘汰策略包括:
volaile-random:随机淘汰设置了过期时间的任意键值
volatile-ttl:优先淘汰最早过期的键值
volatile-lru:淘汰所有设置了过期时间的键值中,最久未使用的键值
volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值
allkeys-random:随机淘汰任意键值
allkeys-lru:淘汰整个键值中最久未使用的键值
allkeys-lfu:淘汰整个键值中最少使用的键值
面向对象三大特征
封装:指的是把一个对象的属性隐藏在对象内部,不允许外部对象直接访问对象的内部信息,但是可以提供一些可以被外界访问的方法来操作属性
继承:使用已存在的类的定义作为基础建立新类的技术
多态:表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例
接口和抽象类有什么共同点和区别
共同点:
都不能被实例化
都可以包含抽象方法
都可以有默认实现的方法(Java 8 可以用default 关键字在接口中定义默认方法)
区别:
一个类只能继承一个类,但是可以实现多个接口
接口中的成员变量只能是public static final类型的,不能被修改且必须有初始值,而抽象类的成员变量默认default,可以在子类中被重新定义,也可以被重新赋值
Redis为什么这么快
Redis的大部分操作都在内存中完成,并且采用了高效的数据结构
Redis采用IO多路复用机制处理大量的客户端socket请求,IO多路复用机制是指一个线程处理多个IO流。在Redis只运行单线程的情况下,该机制允许内核中,同时存在多个监听socket和已连接socket。内核会一直监听这些socket上的连接请求或数据请求。一旦有请求到达,就会交给Redis线程处理
synchronized和ReentrantLock有什么区别
synchronzied依赖于JVM而ReentrantLock依赖于API
reentrantLock增加了高级功能,主要有三点:
等待可中断:ReentrantLock提供了一种能够中断等待锁的线程机制,通过lock.lockInterruptibly()来实现这个机制,也就是是说等待的线程可以选择放弃等待,改为处理其他事情
可实现公平锁
借助Condition实现选择性通知
https如何建立连接
SSL/TLS协议基本流程:
客户端向服务端索要并验证服务器的公钥
双方协商生产会话密钥
双方采用会话密钥进行加密通信
参考资料: