哈啰出行Java后台开发一面面经【复盘】
电话面试,时间30分钟
自我介绍
介绍开源项目的时候,项目的亮点没有说,还有难点也可以说,难点有架构设计
使用的jdk版本,我说了jdk11和jdk1.8都有用
每一个jdk版本的新特性都需要了解到,如果问到jdk11的新特性,不会,很影响面试体验
我讲了jdk8中的lambda表达式,还有就是hashmap的不同,回答的很少
jdk8的新特性(没记住)
-
新增了lambda,使得写匿名函数更加的优雅,代码更简洁
-
Stream流:处理集合更优雅,方便
-
在接口中新增了默认方法
-
向接口中添加默认方法,不会破坏接口的实现类,如果在jdk1.7,我们向接口中添加新的功能的时候,我们需要在实现类中重写这个方法
-
提供默认方法,能够减少实现类中的代码量,这些方法的功能都是相同的,如果某个实现类的功能不同,则重写该方法就行
-
因为实现类可以实现多个接口,如果多个接口中的都有相同的默认方法,就会出现菱形继承问题,因为该实现类,不知道使用哪个的接口的默认方法
-
类优先原则:如果一个类继承了另一个类,并且同时实现了一个或多个接口,那么在方法解析时,类的方法优先级高于接口的默认方法。
-
接口冲突原则:如果一个类实现了多个接口,而这些接口中有相同的默认方法,那么该类必须明确覆盖这个默认方法,提供自己的实现。
解决菱形继承问题就是在继承类中重写默认方法,调用的时候,使用的是继承类的默认方法,而不是接口中的默认方法
-
-
-
函数式接口:接口中只包含一个抽象默认,有没有默认方法都不影响
-
日期和时间API(Date and Time API):JDK 1.8引入了一个新的日期和时间API,提供了更全面和灵活的处理日期和时间相关操作的方式。它包括了LocalDate、LocalTime、LocalDateTime和Period等类
原来的Date等类存在的问题:
- Date类是可变的,会存在线程安全问题
- 不一致问题,Date的月份是从0开始,和日常的不一样
- Date中的很多Api都是过时的
- 缺乏时区支持:
Date
类没有明确的时区支持。这使得在处理跨时区的日期和时间时变得困难,并且容易导致错误。
-
Nashorn JavaScript引擎:JDK 1.8用一个轻量级高性能的JavaScript引擎Nashorn替代了旧的Rhino JavaScript引擎。它允许你在Java应用程序中嵌入JavaScript代码并无缝执行。
这个可以不用了解
-
方法引用:是Java 8引入的一种语法简写方式,用于直接引用现有方法或构造函数。它提供了一种更简洁、更可读的方式来表示某个方法作为函数式接口的实现。
方法引用的语法形式为
Class::methodName
,或者instance::methodName
,或者ClassName::new
这个方法引用,也就是我们通过
Class::methodName
或者其他形式调用之后,返回一个java.util.function
包下的对象,具体使用哪个类,看该methodName
的返回值和参数决定public class Student { private static String name = "xcye"; public static String getName() { return name; } public void printName() { System.out.println("print: " + name); } public Student(String name) { System.out.println("构造器: " + name); } } public static void main(String[] args) { // String name = Student::getName; Student student = new Student("asdf"); Supplier<String> getNameMethod = Student::getName; System.out.println(getNameMethod.get()); Consumer<Student> consumer = Student::printName; consumer.accept(new Student("asdf")); }
jdk1.7和1.8中的hashmap的区别
只讲到数据结构不同
还有哈希算法不同等
为何hashmap中的扩容是<<1
我回答的是获取元素更快,错误回答
回答这个问题,应该从hash这个点来回答,在对key进行哈希运算的算法为
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
根据hash获取bucket的算法为hash & (length - 1)
讲一下hashmap的扩容步骤
我只讲了当数组容量到达临界线时,是如何扩容的,但是细节没有讲,当时也是忘记了
讲一下hashmap的put流程
讲了个大概,细节还需要再跑一下
ConcurrentHashMap的put流程
忘记细节,只记得获取数组下标是通过cas,key和value不能为null
这里可能会问一个为什么不能为null问题
其他的想不起来了
反问
- 对我有什么建议么
- 假如进去之后,会做什么业务(阿里巴巴的数据中台)
没有后续,到现在也没有通知,我之前是在官网投的,投了3个岗位,但是我去看状态还是正常,我后面好像又在老板直骗上投,感觉这个面试是老板直骗投的,而不是从官网投递的
引流:阿里巴巴,字节跳动,腾讯,抖音,Java校招
#我的失利项目复盘##java校招##哈啰出行校招#