阿里达摩院面经
一面
- 多态是什么? 优点?
多态是指允许不同类对同一函数调用做出反应. 即同一函数可以根据对象的不同而采用多种不同的行为方式.
实现多态的技术: 动态绑定, 是指在执行期间判断所引用对象的实际类型, 根据其实际的类型调用其相应的方法.
Java中多态的实现方式: 接口实现, 继承父类方法进行重写, 同一个类中进行方法重载.
多态的好处: 代码更容易扩展和维护, 更加灵活. 比如
举例
因为可以通过调用接口的引用来调用各种不同的接口实现类, 扩展的时候不用修改接口, 十分灵活.
- Java
equals()
和==
有什么区别?==
对于基本类型来说比较的是值是否相同, 对于引用类型来说是比较地址是否相同.
而equals()
方法是比较地址值. 不过一般会重写equals
让它来比较变量值.
比如String的equals()
方法, 就是比较两个字符串的值是否相等.
hashcode
和equals
有什么区别?hashcode
是怎么实现的?
两者都是用来比较对象是否相等. 但是使用hashcode
的效率会更高. 比如把对象加入hashset时, hashset会先计算对象的hashcode, 如果hashcode和现有的元素相同再用equals比较地址.
总结下来就是:
- 如果两个对象的 hashCode 值相等,那这两个对象不一定相等(哈希碰撞)。
- 如果两个对象的 hashCode 值相等并且equals()方法也返回 true,我们才认为这两个对象相等。
- 如果两个对象的 hashCode 值不相等,我们就可以直接认为这两个对象不相等。
你知道的其他解决碰撞的方法吗?
参考
链地址法, 再哈希法, 公共溢出区, 开放地址法如果链表太长该怎么办?
转化成红黑树或B+树.为什么不用平衡二叉树, 而是B+树, 红黑树?
B+树的高度更矮, 查找路径更短且更稳定. 红黑树不同于二叉平衡树的是平衡性更弱, 对于插入和删除操作更加友好.hashmap是否线程安全?
否. concurrentHashmap是线程安全的.concurrentHashmap底层怎么实现的? 和hashmap有什么区别?
- concurrentHashmap直接用Node数组+链表+红黑树来实现, 并发控制使用
synchronized
和CAS来操作.
参考 - hashtable底层是数组+链表+红黑树, 仅使用
synchronized
来保证线程安全, 效率低下. 当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。
tips: hashmap是非线程安全的, hashtable是线程安全的.
补充学习:
- 为什么hashmap会有线程安全问题?
jdk7之前, rehash(扩容)可能会导致环形链表; 而jdk8会导致数据覆盖.
https://cloud.tencent.com/developer/article/1871944#
HTTP和HTTPS有什么区别? 如果要实现HTTP, 服务器端需要做什么?
HTTP请求会经历哪些过程?
反问: 是否要准备项目? 是. 只有有项目才能更加深入地理解相关知识;
反问: 烂大街的项目是否会有不好的影响? 不会. 项目只是挖掘你基础知识的工具, 一个学习能力强的人在项目中学到的东西会更多. 在做项目的过程中要多问为什么.