深克隆和浅克隆的区别?
- 浅克隆是两个完全相同的对象(包含普通对象和数组对象)指向了同一片内存区域
- 深克隆是两个完全相同的对象(包含普通对象和数组对象)指向了不同的内存区域
深克隆方法?
- 申请一片新的内存区域,然后将对象拷贝到新的内存区域中
== 和 equal 的区别?
- 没有重载equal方法时,equal和== 是等价的,都是比较内存地址是否相同;
- 重载equal方法后,如 string 中重载了equal方法,equal方法就是指字符串的内容是否相同,此时就和==不同了,同理Integer也是,equal方法比较的是两个整形值是否相同
自动装箱机制?
- 自动装箱是Java提供的一种语法糖,是属于编译器的技术的范畴,具体表现为在基本数据类型与基本数据类型对应的包装类型之间互相转换时存在的自动装箱和自动拆箱,自动装箱代码上体现为
- `Integer i = 10; 会从缓存中取出10 对应的包装类型,期间会发生自动装箱
int i1 = i; 将包装类型转换为基本数据类型,会发生自动拆箱,即将包装类型转换整型 - 具体调用方法为valueOf() 将int 转换为 Integer intValue() 将Integer转换为 int
简述Java异常体系?非受检异常 、受检异常、运行时异常
- Java异常体系大致分为
- 不可控的Error异常,如OOM OOS
- 不受检查的异常,即运行时发生的异常,如数组越界,空指针;这些可以通过编程去避免;编译时不进行检查
- 受检异常,如文件不存在异常,类不存在,方法不存在等 也是发生在,但是在编译时会进行检查是都使用异常语句块包裹,并且受检异常当发生异常之后可以明确知道是什么异常,可以提醒调用者检查出错
String类为什么设计成不可变?
- 出于安全的考虑,在网络中如URL等敏感信息,被设计成不可变可提供其安全性
- 出于存储效率考虑,字符串可以被字符串常量池存储,相同内容的字符串只要一份存储空间
- 出于性能考虑
- 可以将String对象的hashcode缓存起来,在HashMap场景中,存在大量重复的字符串时,可以不用多次进行hash操作,提高性能;
- 在多线程中减少对不变的字符串的同步开销开销
Hash冲突常用的解决方案?
- 拉链法(也是HashMap使用的方法)
- 开放地址法:含义为当出现冲突,就从冲突位置向后寻找第一个空位置进行存储
- 建立公共溢出区:顾名思义就是当冲突后的值都放在公共溢出区
- 再哈希
HashMap在JDK1.7之前会发生环,再附上出现环的原因?
线程一:读取到当前的hashmap情况,在准备扩容时,线程二介入
线程二:读取hashmap,进行扩容
线程一:继续执行
渐进式hash,主要思想(参照Redis中字典的实现)
- 申请大小为原数组的二倍
- 数组中一个元素进行rehash之后接着第二个元素进行rehash
- 每个元素进行的操作为原数组中元素置空,新数组使用拉链法进行链接
- rehash完成之后进行原数组空间的释放
如何拷贝数组效率最高(arraycopy>clone约等于copyOf)?
- 事实胜于雄辩,测试机 i5 5200 CPU
- 剖析原因?
- arraycopy和clone同为偏底层的操作,因为arraycopy 调用时不存在数组空间申请的过程,因为空间已经事先申请好了,而clone是得先申请存储空间,然后再进行复制,copyOf的话,是因为方法的调用伴随着栈帧的入栈出栈,存在一定的消耗
在设计HTTP接口时应该考虑哪些问题??
- 幂等:含义为不论方法调用多少次,每次的返回结果都是一样的,这很重要
- 超时处理:可以使用延时队列
HTTP2.0
使用通道进行请求、应答的存储介质的复用,类似NIO中的buffer(个人理解,如有错误请不吝赐教)
HTTPS
加密的HTTP,也不是所有页面都需要加密,加密存在一定的开销,HTTPS = HTTP+TCP层的 TSL SSL
- 常见的加密方式
- 单向散列
- 对称加密
- 非对称加密
- 顺便补充一哈,数字签名和非对称加密
- 数字签名是使用私钥加密,接收方使用公钥解密,具有签名的性质,不可抵赖
- 非对称加密是使用公钥进行加密,接收方使用自己的私钥进行解密
静态代理和动态代理?
- 静态代理是运行之前已经存在代理类,缺点是不够灵活
- 动态代理是运行时动态生成代理类,灵活但是反射操作带来了一定的性能损失
maven中解决依赖冲突方式?
执行命令mvn dependency:tree 查看包依赖树,找出对应冲突的依赖关系
排除依赖