发布于 

阿里达摩院面经

一面

  1. 多态是什么? 优点?
    多态是指允许不同类对同一函数调用做出反应. 即同一函数可以根据对象的不同而采用多种不同的行为方式.
    实现多态的技术: 动态绑定, 是指在执行期间判断所引用对象的实际类型, 根据其实际的类型调用其相应的方法.
    Java中多态的实现方式: 接口实现, 继承父类方法进行重写, 同一个类中进行方法重载.

多态的好处: 代码更容易扩展和维护, 更加灵活. 比如
举例
因为可以通过调用接口的引用来调用各种不同的接口实现类, 扩展的时候不用修改接口, 十分灵活.

  1. Java equals()== 有什么区别?
    ==对于基本类型来说比较的是值是否相同, 对于引用类型来说是比较地址是否相同.
    equals()方法是比较地址值. 不过一般会重写equals让它来比较变量值.

比如String的equals()方法, 就是比较两个字符串的值是否相等.

  1. hashcodeequals有什么区别? hashcode是怎么实现的?
    两者都是用来比较对象是否相等. 但是使用hashcode的效率会更高. 比如把对象加入hashset时, hashset会先计算对象的hashcode, 如果hashcode和现有的元素相同再用equals比较地址.
    总结下来就是:
  • 如果两个对象的 hashCode 值相等,那这两个对象不一定相等(哈希碰撞)。
  • 如果两个对象的 hashCode 值相等并且equals()方法也返回 true,我们才认为这两个对象相等。
  • 如果两个对象的 hashCode 值不相等,我们就可以直接认为这两个对象不相等。
  1. 你知道的其他解决碰撞的方法吗?
    参考
    链地址法, 再哈希法, 公共溢出区, 开放地址法

  2. 如果链表太长该怎么办?
    转化成红黑树或B+树.

  3. 为什么不用平衡二叉树, 而是B+树, 红黑树?
    B+树的高度更矮, 查找路径更短且更稳定. 红黑树不同于二叉平衡树的是平衡性更弱, 对于插入和删除操作更加友好.

  4. hashmap是否线程安全?
    否. concurrentHashmap是线程安全的.

  5. concurrentHashmap底层怎么实现的? 和hashmap有什么区别?

  • concurrentHashmap直接用Node数组+链表+红黑树来实现, 并发控制使用synchronized和CAS来操作.
    参考
  • hashtable底层是数组+链表+红黑树, 仅使用synchronized来保证线程安全, 效率低下. 当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。

tips: hashmap是非线程安全的, hashtable是线程安全的.


补充学习:

  1. 为什么hashmap会有线程安全问题?
    jdk7之前, rehash(扩容)可能会导致环形链表; 而jdk8会导致数据覆盖.
    https://cloud.tencent.com/developer/article/1871944#

  1. HTTP和HTTPS有什么区别? 如果要实现HTTP, 服务器端需要做什么?

  2. HTTP请求会经历哪些过程?

  3. 反问: 是否要准备项目? 是. 只有有项目才能更加深入地理解相关知识;

  4. 反问: 烂大街的项目是否会有不好的影响? 不会. 项目只是挖掘你基础知识的工具, 一个学习能力强的人在项目中学到的东西会更多. 在做项目的过程中要多问为什么.